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
輸出是:
Before returnMyself. Myself address is: 0x7fff6afd88f0. Copy CTOR Invoked: This address is 0x7fff6afd88d8. Input address is 0x7fff6afd88f0. After returnMyself. Before returnLocal. Local address in returnLocal is 0x7fff6afd88d0. After returnLocal.
正如你所看到的,當我宣佈一個本地對象並返回它,拷貝構造函數不被調用,而不是返回給定的引用對象,它調用複製構造函數。
沒有人有這個解釋?一般情況下,從函數返回值調用複製構造函數的情況是什麼?
謝謝!
它沒有被調用,因爲編譯器足夠聰明,可以優化副本,並直接構造返回值。 – Cameron