14

コンパイラで生成された代入演算子は、自己代入を防ぎますか?

class T {

   int x;
public:
   T(int X = 0): x(X) {}
};

int main()
{
   T a(1);
   a = a;
}

クラス メンバーがポインター型でない場合でも、常に自己割り当てから保護する必要がありますか?

4

3 に答える 3

14

コンパイラで生成された代入演算子は、自己代入を防ぎますか?

いいえ、違います。メンバーごとのコピーを実行するだけで、各メンバーは独自の代入演算子 (プログラマー宣言またはコンパイラー生成の場合もあります) によってコピーされます。

クラス メンバーがポインター型でない場合でも、常に自己割り当てから保護する必要がありますか?

いいえ、クラスのすべての属性 (したがってそれらの属性) がPOD-typesである場合は必要ありません。

独自の代入演算子を作成する場合、クラスの将来性を保証したい場合は、たとえポインターが含まれていなくても、自己代入をチェックしたい場合がありますcopy-and-swap イディオムも考慮してください。

于 2011-04-09T23:14:37.467 に答える
4

これは経験的に簡単に確認できます。

#include <iostream>
struct A {
  void operator=(const A& rhs) {
    if(this==&rhs) std::cout << "Self-assigned\n";
  }
};

struct B {
  A a;
};

int main()
{
  B b;
  b = b;
}
于 2011-04-10T01:31:07.317 に答える
-1
class T {
    int x;
public:
    T(int X = 0): x(X) {}
// prevent copying
private:
    T& operator=(const T&);
};
于 2012-06-14T06:41:30.477 に答える