重写operator =以便我们可以使用=复制类实例而不会出现浅拷贝问题

时间:2015-01-23 07:53:54

标签: c++ class oop

假设我们定义了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)吗?如果没有,为什么不能使用?

2 个答案:

答案 0 :(得分:2)

此:

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)

答案 1 :(得分:0)

如其他答案中所述,您的代码不会调用operator=。但是,如果您的示例代码已更改为

,则问题仍然有效
Book a, b;
// ...
a = b;

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

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

以上内容必须将x.bar的值更改为42。

要回答第二部分,比较this == &rhs的目的是避免在像

这样的代码的情况下进行复制
x = x;

如果您只是进行浅层复制,您还可以比较*this == rhs,但在深度比较和深层复制的情况下,这可能会导致错误的结果。