2016-08-20 26 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)y(細かい問題なし)と同一視される間に関与しているにもかかわらず、UBになるdoes notのをしかし、それは参照が送信されますですzと同じです。ここでdangling reference問題が発生しないのはなぜですか? const MyClass&' on the temporary object 'MyClass(8)なしでオーバーロード機能が動作するのはなぜですか?

+1

これは暗黙的な変換の1つです。オブジェクトをより揮発性にすることは完全に正当です。 – Incomputable

+0

なぜこのようなコードを書くことを検討していますか? –

+0

実験@EdHeal:-P –

答えて

4

一時的な表現は完全な表現が終わるまで続きます。最後に一時的なものは消えてしまいますが、その時点までに課題がすべて実行されているため、一時的なものが消えても構いません。

+0

@OlzhasZhumabek do do –

+0

@Joachim 'MyClass(8)'は自分自身への参照を返しますが、私の質問はすぐに破棄されます。使用されたisn; tは一時的なものが破壊されたため無効になりました。 –

+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パラメータまたはnon-constパラメータを期待するかどうかに関係します。

z = MyClass(8);のテンポラリを割り当てようとすると、パラメータがconst参照である必要があることがわかります。

また、一時オブジェクトは完全な式の終わり(通常は;)まで存続し、ポインタや参照はどこにも保存されないため、ここではダングリングリファレンスはありません。 num値のコピーのみ。

+0

これは、2番目の質問に答えます。最初のものはどうですか? –

+0

1つの価格に対して2つの質問があります。 :-) –

関連する問題