C++ C++;:通过引用返回值
我正在寻求澄清,当一个人在返回类型为某个对象的函数中返回对该对象的引用时,会发生什么 考虑以下功能:C++ C++;:通过引用返回值,c++,C++,我正在寻求澄清,当一个人在返回类型为某个对象的函数中返回对该对象的引用时,会发生什么 考虑以下功能: CObject getObject() { CObject localObject; CObject &objectRef(localObject); return objectRef; } 我的理解是,此函数将返回“localObject”的副本,而不是返回对“localObject”的引用。这是正确的吗?它本质上是创建并返回一个以localObject作为构
CObject getObject() {
CObject localObject;
CObject &objectRef(localObject);
return objectRef;
}
我的理解是,此函数将返回“localObject”的副本,而不是返回对“localObject”的引用。这是正确的吗?它本质上是创建并返回一个以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();
}
它没有返回对本地对象的引用,这是正确的。就实际返回的内容而言,答案稍微微妙一点。由于调用了某个函数,编译器实际上只会创建一个
CObject
实例作为调用函数的结果。这是一个优化技巧,基本上意味着原始的localObject
是以调用函数可以直接使用的方式构造的-因此在调用返回时不需要复制构造。您在堆栈上执行此操作……如果需要堆,请在堆上执行而不是在堆中执行,而不仅仅是为了使此示例成为工作注释如果将结果分配给新变量,则可以省略副本。编译器可以看到它并直接从函数中构造变量。@Caduchon你比我快:)它已被编辑。谢谢你提到我明白了。因此,只要返回类型是by value,它就会始终构造通过引用提供的对象的副本。谢谢你的详尽回答!我使用GCC4.8.3。请参见使用g++copy.cpp-o copy-O0
@buratino编译的示例()。您的代码具有未定义的行为。任何事情都可能发生,包括炸毁运行它的电脑。你不能以合乎逻辑的方式对待UB
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();
}
CObject& getObject() {
CObject localObject;
CObject &objectRef(localObject);
return objectRef;
}