覆盖运算符 =,以便我们可以使用 = 复制类实例,而不会有浅层复制问题

Overriding operator = so that we may copy class instance using = without shallow copy issue

本文关键字:复制 实例 不会有 问题 运算符 我们 可以使 覆盖      更新时间:2023-10-16

>假设我们定义了 Book 类,我们想使用 = 来复制 Book 类实例,而不会出现以下代码中出现的浅拷贝问题:

Book b;
Book a = b; 

所以我们写这样的代码:

Book & Book::operator=(const Book & rhs)
{
  if(this != &rhs)
  {
  //details
  }
  return *this;
}

但是为什么我们必须返回 Book &,而不是 Book 甚至 Book*?

另外,我们可以使用 if(*this != rhs)

而不是 if(this != &rhs)吗?如果不是,为什么不能使用它?

这个:

Book b = a;

是复制构造,调用赋值运算符。相反,它调用:

Book::Book(Book const&);

赋值运算符返回一个Book&以便您可以执行以下操作:

a = b = c; // all three are Book objects

关于你的第二个问题,不,你不能说*this == rhs因为这会援引operator==(Book const&, Book const&)。您想比较地址,所以if (this != &rhs).

如另一个答案所述,您的代码不会调用operator=。但是,如果您的示例代码更改为

Book a, b;
// ...
a = b;

要回答问题的第一部分,您需要返回一个引用,因为这种代码必须正常工作:

Foo x;
Foo y;
(x=y).bar = 42;

上述必须将 x.bar 的值更改为 42。

要回答第二部分,比较this == &rhs的重点是避免在代码的情况下复制,例如

x = x;

如果您只做浅拷贝,你也可以比较*this == rhs,但在深度比较和深拷贝的情况下,这可能会导致错误的结果。

相关文章: