我正在测试通过引用返回本地对象(希望它是未定义的行为,以符合我在Effective C ++中的读数)。我原来的测试进展顺利,但其他事情发生了意外。
#include <iostream>
using namespace std;
class MyInt {
public:
MyInt(int i){
value = new int(i);
}
~MyInt(){
delete value;
}
int getValue(){
return *value;
}
MyInt(const MyInt &b){
cout<<"Copy"<<endl;
}
private:
int* value;
};
MyInt& returnref(){
MyInt a(10);
cout<<"Returning from returnref()"<<endl;
return a;
}
int main(){
MyInt a = returnref();
cout<<a.getValue()<<endl;
return 0;
}
我的控制台打印“从......返回”,然后“复制”,然后输出一个随机值。
我对通过引用传递的理解是它不需要进行任何复制。为什么它不按我的预期行事?
编辑:不要返回对本地对象的引用,因为它将在函数外部被销毁。我只是测试看它实际上是这样发生的。
答案 0 :(得分:5)
MyInt a
中的 MyInt a = returnref();
不是引用,因此应该初始化它。这就是调用复制构造函数的原因。并且您不应该返回对临时对象的引用(在堆栈上分配MyInt a(10)
并且在退出函数时将被销毁),这将导致未定义的行为。
答案 1 :(得分:4)
写这个以避免调用复制构造函数:
MyInt & a = returnref();
// ^^^ please note this '&'
但返回本地对象的引用并不是一个好主意。请阅读下面的Prasoon评论!