2017-10-13 49 views
1

我上在C++中,當一個函數返回值的對象,在呼叫點應複製構造函數被調用

(Ubuntu的5.4.0-6ubuntu1〜16.04.4執行以下代碼C++代碼)5.4.0 20160609

class x { 
    public : 
    int data ; 
    x(int v) {cout<<"1 args constr\n" ; data = v ;} 
    x(const x& o) {cout<<"copy constr\n" ;} 
    x &operator=(const x&o) {cout<<"assignment opr\n" ;} 
    ~x() {cout<<"destr\n" ;} 
} ; 

x fun() { 
    cout<<"in func\n" ; //#1 
    x o(-19) ;   //#2 
    cout<<"returning...\n"; 
    return o ;   //#3 
} 

main() { 
    x ob = fun() ;  //#4 
    cout<<ob.data<<endl ; 
} 

並獲得以下輸出: 在FUNC 1個ARGS構造 返回... -19 destr

我所無法理解的是:

  1. 爲什麼構造函數和析構函數稱爲ONY一次
  2. 當我按值返回,爲什麼不調用拷貝構造函數

根據我的理解,obmain的範圍內創建。因此ob的構造函數和析構函數應在main的範圍內調用。 同樣,在fun範圍內創建了o。因此,在fun

+0

X&運算符=(常量X&O){COUT << 「分配OPR \ n」;} 錯誤這裏固定 –

+0

閱讀有關(HTTP的[五規則]所述運算符重載定義:// en.cppreference.com/w/cpp/language/rule_of_three) –

+0

@ Basile Starynkevitch我沒有編譯C++ 11的代碼。即使在爲C++ 11添加移動語義和編譯之後,我也獲得了相同的輸出 – user3282758

回答

1

範圍內應該有一個構造函數和析構函數調用o C++編譯器在編譯後正在執行返回值優化。注意如果函數的任何端點返回不同的命名局部變量,則無法完成返回值優化。在你的情況下,只有函數的終點(返回語句)。因此C++編譯器執行返回值優化。 檢查了這一點:return_value_optimization

相關問題