复制构造函数甚至在通过引用返回时调用?

时间:2010-12-24 06:48:26

标签: c++

我正在测试通过引用返回本地对象(希望它是未定义的行为,以符合我在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;
}

我的控制台打印“从......返回”,然后“复制”,然后输出一个随机值。

我对通过引用传递的理解是它不需要进行任何复制。为什么它不按我的预期行事?

编辑:不要返回对本地对象的引用,因为它将在函数外部被销毁。我只是测试看它实际上是这样发生的。

2 个答案:

答案 0 :(得分:5)

MyInt a中的

MyInt a = returnref();不是引用,因此应该初始化它。这就是调用复制构造函数的原因。并且您不应该返回对临时对象的引用(在堆栈上分配MyInt a(10)并且在退出函数时将被销毁),这将导致未定义的行为。

答案 1 :(得分:4)

写这个以避免调用复制构造函数:

 MyInt & a = returnref(); 
 //   ^^^  please note this '&' 

但返回本地对象的引用并不是一个好主意。请阅读下面的Prasoon评论!