为具有引用成员变量的类创建赋值操作符

Creating an Assignment Operator for a class that has Reference Member Variables

本文关键字:创建 赋值操作符 变量 成员 引用      更新时间:2023-10-16

我已经读了很多,如果你需要一个赋值操作符,那么不要使用引用成员变量。我知道你不能重新赋值一个引用,但是你能不能通过重新赋值操作符中引用变量内的所有数据来解决这个问题呢?因为你不能重新赋值引用本身。

像这样:

class MyClass {
   AnotherClass& someObject;
   ... 
public:
   ...
   MyClass& operator= (const MyClass& that) {
      if (&that != this) {
         this.someObject.member1 = that.someObject.member1;
         this.someObject.member2 = that.someObject.member2;
      }
      return *this;
   }
}

这样做有问题吗?或者这样做会产生问题吗?

是的,您可能会遇到问题。假设您有两个MyClass实例A和B,它们共享同一个AnotherClass对象。如果给A赋不同的值,就会弄乱B的成员。

这个变量是用来做什么的?

  • 如果许多MyClasses需要共享和修改同一个AnotherClass,则使用AnotherClass *。然后在赋值时重定向你的指针。你必须跟踪有多少MyClasses拥有AnotherClass,所以要么在AnotherClass中跟踪,要么使用某种"智能"指针。

  • 如果AnotherClass太大而不能存储许多副本,或者有许多MyClass的实例,那么const AnotherClass *将更好地工作。同样,您必须跟踪有多少指向它的指针存在,所以您不会泄漏内存。

  • 如果myclass很小,那么myclass就很少,不需要在它们之间共享:使用普通对象。