编译器是否为自我分配生成了赋值操作符保护?
class T {
int x;
public:
T(int X = 0): x(X) {}
};
int main()
{
T a(1);
a = a;
}
即使班级成员不是指针类型,我是否总是需要防止自我分配?
答案 0 :(得分:12)
编译器是否为自我分配生成了赋值操作符保护?
不,它没有。它只执行一个成员方式的副本,其中每个成员都由它自己的赋值运算符复制(也可能是程序员声明的或编译器生成的)。
即使班级成员不是指针类型,我是否总是需要防止自我分配?
不,如果你所有班级的属性(以及他们的属性)都是POD-types,你就不会这样做。
编写自己的赋值运算符时,如果您希望对类进行面向验证,即使它们不包含任何指针,等等,也可以检查自我赋值。另请考虑the copy-and-swap idiom。
答案 1 :(得分: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;
}
答案 2 :(得分:-1)
class T {
int x;
public:
T(int X = 0): x(X) {}
// prevent copying
private:
T& operator=(const T&);
};