请教一下C++重载赋值操作符为什么要做一个this判断?

Fitz999
  • 132

今天看书上说:“赋值操作符重载比拷贝构造函数做得要多。它除了完成拷贝构造函数所完成的拷贝动态申请的内存的数据之外,还释放了原本自己申请的内存空间。” 然后书上有一个例子:

class Widget
      {
      private:
            int *pointer;
      public:
            Widget (int i = 0) { pointer = new int(i); }
            void fix (int i) { *pointer = i; }
            void print() { cout << *pointer << endl; }
            Widget& operator = (const Widget &wgt); // 重载赋值操作符。
      };
Widget& Widget:: operator = (const Widget &wgt) // 重载赋值操作符。
      {
      if (this != &wgt) // 请问这个this判断的意义是什么???
            *pointer = *(wgt.pointer);
      return *this; // 请问这个返回的是什么?class Widget它自己类的引用吗?
      }
int main()
      {
      Widget wgt1(9), wgt2;   wgt2 = wgt1;
      wgt1.fix(10);   wgt2.print(); // 结果是9。
      return 0;
      }

请问一下那个this判断的意义是什么?难道还能出现相反的情况吗即(this==&wgt)?另外"return *this"返回的是什么?它自己类的引用吗?

另外书上又说:“为了防止默认拷贝发生,可以将拷贝构造函数和重载赋值运算符设为private来禁止拷贝。只是声明,不用实现。”

class Widget
      {
      private:
            Widget(const Widget&);
            Widget& operator = (const Widget&);
      public:
            int* p;
      };

请问一下“设为private来禁止拷贝”到底是什么意思?设为private之后,还能在main里调用赋值操作符重载吗?

谢谢了先!

回复
阅读 2.7k
4 个回答
✓ 已被采纳
  1. if (this != &wgt) 通过地址判断是否是自己赋值给自己
  2. return *this 就是返回自己,但是如果满足 if (this != &wgt),则修改了pointer 的内容,即某种程度上做了深copy
  3. 如果是private,外部代码就不能调用该操作,自然起到了保护作用。

这个其实很简单,就是比较是这个本身,如果不是,才进行操作。否则就不用进行操作了。

因为自己赋值给自己在语言规则里是合法的。
为了减轻负担,你就可以先判断一下是不是自己赋值给自己。
这个在比较操作里一般也是有的。

bobo1986
  • 1
新手上路,请多包涵

看了学习一下 很不错

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
你知道吗?

宣传栏