分配操作员 - 自我分配

时间:2011-04-09 23:10:06

标签: c++ assignment-operator

编译器是否为自我分配生成了赋值操作符保护?

class T {

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

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

即使班级成员不是指针类型,我是否总是需要防止自我分配?

3 个答案:

答案 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&);
};