0

コピー&スワップメソッドを使用するときに代入演算子に関する質問があります。代入演算子を使用するときにコピーとスワップを使用するのはなぜですか?

String & operator = (String s) // the pass-by-value parameter serves as a temporary 
{ 
    s.swap (*this); // Non-throwing swap 
    return *this; 
}// Old resources released when destructor of s is called. 

すべてのポインタと動的に割り当てられた変数をディープコピーする優れたコピーコンストラクタがあるとしましょう。

次に、上記のコードと以下のコードの違いは何ですか?

String & operator = (String s) // the pass-by-value parameter serves as a temporary 
{ 
    return s; 
} 

私たちは良いコピーコンストラクタを持っているので、別のオブジェクトsがoperator = functionの内部に作成されていると思います。 スロー機能を使用しない点は何ですか?

答えて

3

第2のoperator=は、現在のオブジェクト(つまり、*this)を一切変更しないという主な違いがあります。

String a, b; 
b = a; // b is not changed at all 

そして第二operator=は、参照することにより(関数から出るときに破壊される)sを返しているので、それだけでぶら下がっリファレンスなります注意してください。


より一般的には、我々は、コミットやロールバックのセマンティクスのようなものである強い例外安全保障を提供するためにcopy & swap idiomを使用します。例外のために操作が終了すると、プログラムの状態は変更されません。

String & operator = (String s) // Copy construct s. If exception happens here, 
           // s won't be constructed, 
           // and the state of the current object (*this) won't be changed 
{ 
    s.swap (*this);    // Use non-throwing swap to commit the change 
    return *this;    // Non-throwing operation 
} 
+0

ああ!答えはとてもシンプルでした。ありがとう:) – kong0329

+0

@ kong0329私はあなたの本当の質問かどうか100%確信していません。とにかく、コピー&スワップイディオムに関するいくつかの追加情報を追加しました。 – songyuanyao

+0

本当に助けてくれました。コピー&スワップイディオムの使用のポイントを得ました! – kong0329

0

違いは、Stringオブジェクトのコピーsを作成し、その参照を返し、スコープ出口でコピーが破棄され、プログラムが未定義の動作をするという点です。

0

は、いくつかの主要な違いがあります。

代入演算子は*thisは(ほとんどいつもの)返す必要があります。これは、連鎖の割り当てを可能にするものです。

String s1, s2, s3; 
s1 = s2 = s3; // Now all strings ave the same value. 

代わりに、ローカル変数への参照を返します。その後、有効なメモリ位置を指していないので、ダングリングリファレンスになります。

また、代入演算子は、割り当てられたオブジェクトを変更する必要がありますが、これはコードでは発生しません。

最後に、なぜスロースワップが必要なのですか?代入演算子が例外をスローしたとしましょう。割り当てが失敗した後に割り当てられたオブジェクトの状態は?

一部の実装では、オブジェクトが無効な状態になることがあります。その理由は、例外が変更中にスローされたためです。

これはスワップが入る場所です。スワップがスローしないので、割り当てられたオブジェクトが有効な状態にあることを確認できます。スワップ前に例外がスローされた場合、オブジェクトは以前の値を持ち、スワップの後にあった場合、そのオブジェクトは新しい値を持ちます。

+0

代入は* * thisを返す必要はありません。それは私たちが途中で取り上げた、本当に奇妙な大会です。 – Barry

関連する問題