2017-06-18 8 views
-3

対オペレータ:question移動割り当て私はこの見たコピー代入演算子

をしかし答え、私のようなC++の初心者のための非常に複雑があります。誰かが私を助けることができるなら、私はそれが欲しいです。

CLASSA & operator=(CLASSA && other); //move assignment operator 

CLASSA & operator=(CLASSA other); //copy assignment operator 

私はまだこれらの両方が必要な理由を理解できません。彼らは基本的に同じことをしますか?違いは何ですか?そして、あなたはどこを使っていますか?

+0

答えはありませんが、コピー代入では代わりに 'const CLASSA&other'をパラメータとして使用する必要があります。 – HolyBlackCat

+1

移動代入演算子を実装するとき、 'other'変数は一時的であることが知られており、呼び出されたときに破棄されようとしているという事実を利用できます。だからあなたが望むなら、あなたはこれを利用して、それをコピーするのではなく内容を「盗む」ことができます。あなたが有効な状態に 'other'を残す限り、(それはきれいに破壊することができます)あなたがしたことを認識するコードはありません。 –

+1

同じことをしない*ときだけ、両方が必要です。 –

答えて

0

まず、コピー代入演算子は、通常、単に「CLASSA」ではなく「const CLASSA &」をパラメータとして使用します。

通常、2は移動の例を使用してあります。

  1. 最適化:コピーは高価ですが、動きが安いです。たとえば、標準的なstd :: stringの実装では、安価に移動できます。コピーはより高価です(メモリ割り当て+コピー)。たとえば、std::vector<std::string>が成長する必要がある場合など、移動を使用できます。旧式のときは、std::vector<std::string>が次のように実装されました:新しい大きな領域を割り当て、(遅い)文字列を新しい場所にコピーし、古い場所で文字列を破棄します。さて、rvalのリファレンスが利用可能になると、新しい領域を割り当て、次に(速い)文字列を新しい場所に移動します。
  2. コピーはデザインによって禁止されていますが、移動は可能です。たとえば、std :: unique_ptr
関連する問題