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 ,那么您不会这样做。

在编写自己的赋值运算符时,如果你想对你的类进行未来验证,你可能希望检查自赋值,即使它们不包含任何指针等等。还要考虑复制和交换成语

于 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 回答