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

Joh*_*nyy 1 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;
}
Run Code Online (Sandbox Code Playgroud)

我的控制台打印"从...返回"然后"复制"然后打印一个随机值.

我对引用传递的理解是它不需要复制.为什么它不按我的预期行事?

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

Kir*_*sky 5

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

  • @Johnyy"我故意想看到未定义的行为"......你确实意识到"未定义的行为"意味着它几乎可以做任何事情,对吧?没有要检查的特定未定义行为. (4认同)