2016-08-20 76 views
3

我最近刷新了我的C++運算符重載知識。按照建議我回復operator overload of '='*this的引用。但後來我發現一個問題: -=一個類的=運算符的重載

#include <iostream> 
using namespace std; 

class MyClass 
{ 
    int num = 4; 
    public: 
     MyClass() = default; 
     MyClass(int x) : num(x) {} 
     void getnum(int x) 
     { 
      num = x; 
     } 
     void shownum() 
     { 
      cout << num << '\n'; 
     } 
     MyClass& operator = (const MyClass& obj) // works even without const 
     { 
      this->num = obj.num; 
      return *this; 
     } 
     ~MyClass() = default; 
}; 

int main() 
{ 
    MyClass x, y(5), z(7); 

    z = MyClass(8) = y; // temporary object return reference 

    x.shownum(); 
    y.shownum(); 
    z.shownum(); 
} 

此代碼犯規的結果爲,即使臨時對象MyClass(8)參與其中之間的UBy(精沒問題)相提並論,但隨後的引用將被髮送等同於z。爲什麼dangling reference問題在這裏沒有發生?爲什麼過載功能在沒有const MyClass&' on the temporary object 'MyClass(8)的情況下工作?

+1

這是一種隱式轉換。讓一個對象更具常量易變性是完全合理的 – Incomputable

+0

爲什麼你要考慮編寫這樣的代碼 –

+0

實驗@EdHeal :-P –

回答

4

臨時直播直到完整表達式結束。臨時結束時,臨時消失,但是到那時,所有的任務都已經完成,並且因爲您沒有將參考存儲在臨時消失的任何地方。

+0

@OlzhasZhumabek他們做 –

+0

@Joachim'MyClass(8)'返回一個對自身的引用,但我的問題是當它一被銷燬使用isn; t現在發送的引用與'z'無效,因爲臨時文件已被銷燬。 –

+0

@JoachimPileborg,沒關係。我得到了我需要的所有答案[gotw](https://herbsutter.com/2008/01/01/gotw-88-a-candidate-for-the-most-important-const/):) – Incomputable

4

第一項作業MyClass(8) = y;返回一個MyClass&,它沒有告訴任何關於是臨時的。因此它與下一個operator=的參數相匹配,無論該參數是否需要const或非const參數。

如果您嘗試只分配一個臨時的z = MyClass(8);,您會看到它現在需要該參數爲一個常量引用。因爲臨時對象直到完整表達式的末尾(通常在;),並且沒有指針或引用保存在任何地方,所以這裏沒有懸掛引用。只需複製num值。

+0

好的,回答第二個問題。第一個呢? –

+0

對,一個人的價格有兩個問題。 :-) –