2012-06-30 73 views
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. 

正如你所看到的,當我宣佈一個本地對象並返回它,拷貝構造函數不被調用,而不是返回給定的引用對象,它調用複製構造函數。

沒有人有這個解釋?一般情況下,從函數返回值調用複製構造函數的情況是什麼?

謝謝!

+0

它沒有被調用,因爲編譯器足夠聰明,可以優化副本,並直接構造返回值。 – Cameron

回答