2016-05-17 32 views
1

任何人都可以向我解釋第五行的輸出嗎?我不明白爲什麼MyClass對象b沒有從func中分配返回對象c爲什麼我不能在此代碼中獲得返回值優化?

class MyClass 
{ 
public: 
    int x; 
    std::string s; 

    MyClass(const MyClass &other); 
    MyClass(); 
    void output(); 
}; 

MyClass::MyClass(const MyClass &other): x(2), s("s?") { } 
MyClass::MyClass() : x(1), s("s1") { } 

void MyClass::output() { cout << x << " " << s << endl; } 

MyClass func(MyClass c) //MyClass c = Myclass(a) 
{ 
    cout << "2. in func: "; c.output(); 
    c.s = "s2"; 
    cout << "3. in func: "; c.output(); 
    return c; 
} 

int main() 
{ 
    MyClass a; 
    cout << "1. "; a.output(); 
    MyClass b = func(a); 
    cout << "4. "; a.output(); 
    cout << "5. "; b.output(); 
} 

輸出是:

1. 1 s1 
2. in func: 2 s? 
3. in func: 2 s2 
4. 1 s1 
5. 2 s? 

我明白的地方做線來自1-4,但我沒有在最後知道爲什麼,在MyClass b.ss?值不是s2 。是否因爲在func範圍內創建了const對象?

編輯: 我知道,當MyClass c對象的func範圍內初始化拷貝構造函數被調用,但返回的對象是如何不分配給b

+0

它不是S2因爲'MyClass的B = FUNC(一);'要求'B'它初始化拷貝構造字符串成員?' –

+2

我想你可能需要澄清爲什麼你對輸出感到驚訝。你的問題比你可能意識到的更微妙,並且沒有任何答案能夠解決這個問題。提示:另一個標題可能是「爲什麼我不能在此代碼中獲得*返回值優化*?」 – juanchopanza

+0

@juanchopanza完成了,謝謝 –

回答

2

爲什麼我不能在此代碼中獲得返回值優化?

原因是你的函數返回c,這是一個參數。即使它是一個值,因此也是函數中的本地對象,但這是C++標準不允許return value optimization(在本例中,命名爲返回值優化或NRVO)的情況之一。如果您要創建的c本地副本,RVO將被允許:

MyClass func(MyClass c) //MyClass c = Myclass(a) 
{ 
    MyClass d = c; 
    cout << "2. in func: "; d.output(); 
    d.s = "s2"; 
    cout << "3. in func: "; d.output(); 
    return d; 
} 

這些變化,我開始使用最近鐺++如下:在

  1. 1 S1
  2. func:2 s?
  3. 在FUNC:2 S2
  4. 1 S1
  5. 2 S2
3
MyClass b = func(a); 

該行將調用MyClass拷貝構造函數從a創建b。雖然它有一個=,它確實是而不是調用賦值操作符;該對象尚未創建,因此沒有可分配的內容。

一個對象不需要const綁定到const T&,即使是臨時對象也可以綁定到它們。

+0

所以,'func'返回的對象會發生什麼? –

+0

@MaTi它在完整表達式的末尾被銷燬。 – TartanLlama

+0

@Ma Ti它會被破壞,嘗試創建你的用戶定義的析構函數來看看發生了什麼。 – PcAF

0

你在函數中返回一個局部變量c。它被拷貝構建,被複制到b中。你的拷貝構造函數指定s =「s?」所以這就是它的設置。

+0

那麼它在函數的開頭和結尾都會得到「複製結構」? –

+0

是的。一次被傳遞給函數,並且一次被返回。 – SurDin

相關問題