覆盖运算符 =,以便我们可以使用 = 复制类实例,而不会有浅层复制问题
Overriding operator = so that we may copy class instance using = without shallow copy issue
>假设我们定义了 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
,但在深度比较和深拷贝的情况下,这可能会导致错误的结果。
相关文章:
- 在保证复制的世界中构造函数实例化
- 错误 C2280 / 在 std::vector 中实例化对象时复制构造函数出现问题?
- 防止复制构造函数实例化 C++11 类"deleting"
- std::list 模板是否需要其实例类型中的复制构造函数(或等效项)?
- 关于QLIST类型实例复制构造函数的一个奇怪问题
- 实例化 std::vector 的唯一元素,而无需复制构造函数
- 如何在指针的向量上实现派生类的复制构造函数到具有派生类实例的基类
- 复制MyGreatClass的const*实例的正确方法
- 交换包含非一般可复制类型的“std::aligned_storage”实例-未定义的行为
- 高级C++:复制模板模板类实例中的配置(对象)
- 为什么无法使用复制构造函数实例化"non const"而可以在没有复制构造函数的情况下实例化配对?
- C++ std::list::p ush_back,无需复制现有实例
- 覆盖运算符 =,以便我们可以使用 = 复制类实例,而不会有浅层复制问题
- 使用函数中的复制构造函数创建实例的副本,该函数获取作为基对象传递的实例
- 为什么我不能在复制构造函数中更改实例的私有数据,如果它是 const 的?
- 为什么要重载 C++ 中单一实例类的复制赋值运算符
- cout 对象是否保持单个实例,即它永远不会被复制
- 在不同变体模板类的实例之间进行复制
- 将队列实例的前面复制到另一个队列实例的后面
- 是否可以返回不可移动、不可复制类型的实例