我们什么时候应该用C ++编写自己的赋值运算符?

在这里,我们将看到何时需要使用C ++创建自己的赋值运算符。如果一个类没有任何指针,那么我们就不需要创建赋值运算符和复制构造函数。C ++编译器为每个类创建复制构造函数和赋值运算符。如果运算符不足,那么我们必须创建自己的赋值运算符。

示例

#include<iostream>
using namespace std;
class MyClass { //no user defined assignment operator or copy constructor is present
   int *ptr;
   public:
      MyClass (int x = 0) {
         ptr = new int(x);
      }
   void setValue (int x) {
      *ptr = x;
   }
   void print() {
      cout << *ptr << endl;
   }
};
main() {
   MyClass ob1(50);
   MyClass ob2;
   ob2 = ob1;
   ob1.setValue(100);
   ob2.print();
}

输出结果

100

main()函数中,我们使用setValue()ob1的方法设置x的值。该值也反映在对象ob2中。这种类型的意外更改可能会产生一些问题。没有用户定义的赋值运算符,因此编译器将创建一个。在这里,它将RHS的ptr复制到LHS。因此,两个指针都指向相同的位置。

为了解决这个问题,我们可以采用两种方法。我们要么创建虚拟私有分配运算符来限制对象复制,要么创建我们自己的赋值运算符。

示例

#include<iostream>
using namespace std;
class MyClass { //no user defined assignment operator or copy constructor is present
   int *ptr;
   public:
      MyClass (int x = 0) {
         ptr = new int(x);
      }
   void setValue (int x) {
      *ptr = x;
   }
   void print() {
      cout << *ptr << endl;
   }
   MyClass &operator=(const MyClass &ob2) {
      //检查自我分配
      if(this != &ob2)
         *ptr = *(ob2.ptr);
      return *this;
   }
};
main() {
   MyClass ob1(50);
   MyClass ob2;
   ob2 = ob1;
   ob1.setValue(100);
   ob2.print();
}

输出结果

50

这里,赋值运算符用于创建深层复制并存储单独的指针。我们必须牢记的一件事。我们必须检查自引用,否则赋值运算符可能会更改当前对象的值。