値によってオブジェクトを返す関数を使用してコピー コンストラクターの動作をテストしたところ、コピー コンストラクターが呼び出されるケースと呼び出されないケースに遭遇しました。
次のコードを検討してください。
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 の前に。 returnLocal のローカル アドレスは 0x7fff6afd88d0 です。 リターンローカルの後。
ご覧のとおり、ローカル オブジェクトを宣言してそれを返すと、コピー コンストラクターを呼び出す特定の参照オブジェクトを返すのとは対照的に、コピー コンストラクターは呼び出されません。
誰もこれについて説明がありますか?一般に、値によって返される関数からコピー コンストラクターを呼び出す場合はどのような場合ですか?
ありがとう!