什么时候应该在 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){
      // Check for self assignment
         if(this != &ob2)
            *ptr = *(ob2.ptr);
         return *this;
      }
};
main() {
   MyClass ob1(50);
   MyClass ob2;
   ob2 = ob1;
   ob1.setValue(100);
   ob2.print();
}

输出

50

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

更新于: 18-Dec-2019

173 次浏览

开启你的 事业

通过完成课程获得认证

开始
广告