1

我使用按值返回对象的函数测试了复制构造函数的行为,我遇到了复制构造函数确实被调用的情况和没有被调用的情况。

请考虑以下代码:

class A {
public:
    A() {}
    A(const A& a) {
        cout << "Copy CTOR: " << "This address is " << this 
             << " input address is "<< &a <<       "\n";
    }
};

A returnMyself(A& a) {
    cout<<"Myself address is: "<< &a << "\n";
    return a;
}

A returnLocal(A& a) {
    A local;
    cout<<"local address in returnLocal is  "<< &local << "\n";
    return local;
}

int main () {
    A a;
    cout<<"Before returnMyself\n";
    returnMyself(a);
    cout<<"After returnMyself\n\n";

    cout<<"Before returnLocal\n";
    returnLocal(a);
    cout<<"After returnLocal\n";
}

的输出main是:

在返回之前自己。
我自己的地址是:0x7fff6afd88f0。
复制 CTOR 调用:此地址为 0x7fff6afd88d8。输入地址为 0x7fff6afd88f0。
回来后自己。

在返回本地之前。
returnLocal 中的本地地址是 0x7fff6afd88d0。
返回本地后。

如您所见,当我声明一个本地对象并返回它时,不会调用复制构造函数,而不是返回一个调用复制构造函数的给定引用对象。

有人对此有解释吗?一般来说,从按值返回的函数调用复制构造函数的情况有哪些?

谢谢!

4

1 回答 1

2

这是复制省略。编译器足够聪明,可以优化该副本。

于 2012-06-30T21:20:23.920 回答