编译器生成的赋值操作符是否防止自身赋值?
class T {
int x;
public:
T(int X = 0): x(X) {}
};
int main()
{
T a(1);
a = a;
}即使类成员不是指针类型,我也总是需要防止自赋值吗?
发布于 2011-04-10 07:14:37
编译器生成的赋值操作符是否防止自赋值?
不,它不是。它只执行成员级复制,其中每个成员都由其自己的赋值操作符(也可以是程序员声明的或编译器生成的)复制。
即使类成员不是指针类型,我也总是需要防止自赋值吗?
不,如果您的类的所有属性(以及它们的属性)都是POD-types,则不需要。
当编写你自己的赋值操作符时,如果你想要确保你的类是未来的,你可能希望检查自赋值,即使它们不包含任何指针,等等。还要考虑the copy-and-swap idiom。
发布于 2011-04-10 09:31:07
这是一个很容易从经验上检验的问题:
#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;
}发布于 2012-06-14 14:41:30
class T {
int x;
public:
T(int X = 0): x(X) {}
// prevent copying
private:
T& operator=(const T&);
};https://stackoverflow.com/questions/5608556
复制相似问题