假设我们定义了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)吗?如果没有,为什么不能使用?
答案 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
,但在深度比较和深层复制的情况下,这可能会导致错误的结果。