C++:按值返回并带有引用
C++: Returning by value with a reference
我正在寻求澄清,当返回对象的函数中返回对对象的引用时,究竟会发生什么。
请考虑以下函数:
CObject getObject() {
CObject localObject;
CObject &objectRef(localObject);
return objectRef;
}
我的理解是,这个函数将返回"localObject"的副本,而不是返回对"localObject"的引用。这是对的吗?它本质上是使用 localObject 作为构造函数参数创建和返回一个新对象吗?例如,
CObject newObject(localObject);
它将
返回对象的副本。但是,如果更改函数声明以返回引用,请注意,代码将导致未定义行为。
例:
class CObject{
public:
CObject(){std::cout << "cosntructing ";}
CObject(const CObject& other){std::cout << "copying ";}
};
CObject getObject(){
CObject localObject;
CObject &objectRef(localObject);
return objectRef;
}
int main(){
auto result = getObject();
}
这将导致:
余桦 复制
注意:如果您的编译器由于 RVO 而完全优化代码,则可能不会获得相同的结果。因此,请关闭所有优化并尝试。正如@Caduchon所说,即使没有优化,结果也会因复制而改变。
具有未定义行为的函数示例:
CObject& getObject() {
CObject localObject;
CObject &objectRef(localObject);
return objectRef;
}
您是正确的,它没有返回对本地对象的引用。就实际返回的内容而言,答案要微妙一些。由于所谓的返回值优化,编译器实际上只会创建一个CObject
实例作为调用函数的结果。这是一个优化技巧,基本上意味着原始localObject
的构造方式使调用函数可以直接使用 - 因此在调用返回时不需要复制构造。
相关文章:
- 如何通过引用返回对象
- 函数如何使用引用返回所需的数字?
- 如何防止引用返回的私有结构的突变
- 如何在不使用临时变量的情况下取消引用返回指针的函数的返回值?
- 通过引用返回的变量的范围
- 对于具有引用返回类型的搜索算法,默认返回值应该是什么?
- 运算符重载C++类中的引用返回
- C++对象引用返回不同的值
- 解释通过从函数引用返回数组的语法
- 具有引用返回类型的重写方法上的协变返回类型无效
- 为什么在通过引用返回运算符分配时取消引用'this'指针?
- 为什么我在函数中使用引用并通过引用返回它仍然有效?
- 直接在 C++ 中将值分配给引用返回类型
- C++当您取消引用指向类对象的指针,然后将其作为引用返回时,是否可以对此引用调用方法
- 可以通过常量引用返回默认参数的值吗?
- 按值与右值引用返回
- 非常量引用返回函数在常量值返回函数上用作 r 值
- 当我使用按引用返回时,我不知道这些代码之间的区别
- 为什么通过引用返回向量比通过移动返回要快得多?
- 通过引用返回包含对象的向量