コンパイラで生成された代入演算子は、自己代入を防ぎますか?
class T {
int x;
public:
T(int X = 0): x(X) {}
};
int main()
{
T a(1);
a = a;
}
クラス メンバーがポインター型でない場合でも、常に自己割り当てから保護する必要がありますか?
コンパイラで生成された代入演算子は、自己代入を防ぎますか?
class T {
int x;
public:
T(int X = 0): x(X) {}
};
int main()
{
T a(1);
a = a;
}
クラス メンバーがポインター型でない場合でも、常に自己割り当てから保護する必要がありますか?
コンパイラで生成された代入演算子は、自己代入を防ぎますか?
いいえ、違います。メンバーごとのコピーを実行するだけで、各メンバーは独自の代入演算子 (プログラマー宣言またはコンパイラー生成の場合もあります) によってコピーされます。
クラス メンバーがポインター型でない場合でも、常に自己割り当てから保護する必要がありますか?
いいえ、クラスのすべての属性 (したがってそれらの属性) がPOD-typesである場合は必要ありません。
独自の代入演算子を作成する場合、クラスの将来性を保証したい場合は、たとえポインターが含まれていなくても、自己代入をチェックしたい場合があります。copy-and-swap イディオムも考慮してください。
これは経験的に簡単に確認できます。
#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;
}
class T {
int x;
public:
T(int X = 0): x(X) {}
// prevent copying
private:
T& operator=(const T&);
};