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

发布于 2022-09-06 02:20:19 字数 1278 浏览 34 评论 0

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

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里调用赋值操作符重载吗?

谢谢了先!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

素手挽清风 2022-09-13 02:20:19
  1. if (this != &wgt) 通过地址判断是否是自己赋值给自己
  2. return *this 就是返回自己,但是如果满足 if (this != &wgt),则修改了pointer 的内容,即某种程度上做了深copy
  3. 如果是private,外部代码就不能调用该操作,自然起到了保护作用。
箜明 2022-09-13 02:20:19

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

嘿咻 2022-09-13 02:20:19

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

贪恋 2022-09-13 02:20:19

看了学习一下 很不错

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文