我使用按值返回对象的函数测试了复制构造函数的行为,我遇到了复制构造函数确实被调用的情况和没有被调用的情况。
请考虑以下代码:
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。 返回本地后。
如您所见,当我声明一个本地对象并返回它时,不会调用复制构造函数,而不是返回一个调用复制构造函数的给定引用对象。
有人对此有解释吗?一般来说,从按值返回的函数调用复制构造函数的情况有哪些?
谢谢!