我有一个与C ++中=
运算符的实现有关的问题。如果我没记错的话,有两种方法可以在类中实现=
:一种是明确地重载=
,例如:
class ABC
{
public:
int a;
int b;
ABC& operator = (const ABC &other)
{
this->a = other.a;
this->b = other.b;
}
}
另一个是隐式定义=
。例如:
class ABC
{
public:
int a;
int b;
ABC(const ABC &other)
{
a = other.a;
b = other.b;
}
}
我的问题如下:
1)是否有必要明确和隐含地实施=
?
2)如果只需要其中一个,哪个实施首选?
谢谢!
答案 0 :(得分:4)
您展示的第一件事是赋值运算符,第二件是复制构造函数。它们是做不同事物的不同功能。 (即ctor设置一个正在生成的对象,op =更改现有对象的状态以匹配另一个对象的状态。)
运气好(设计帮助)你没有实现其中任何一个,而是将它留给语言来创建它们。如果您使用合理的成员和基类,它就会发生。
如果您需要实施它们(检查两次确实如此!)您可能需要两者,请参阅Rule of 3
答案 1 :(得分:3)
如果要自定义分配/复制,则必须同时实现:
operator=
用于分配,例如:ABC a; ABC b; a = b;
ABC::ABC(const ABC &other)
用于复制,例如:ABC a; ABC b(a);
。您也很可能也想要实现默认构造函数和析构函数。您可能想要阅读有关rule of three。
的更多信息答案 2 :(得分:1)
在您的情况下,您既不需要实现复制构造也不需要复制赋值,因为编译器会自动为您生成这些成员函数。生成的函数将分别为每个数据成员分别调用复制构造函数或复制赋值运算符。
如果您想要自定义行为,则只需要实现功能。顺便说一句,如果你实现了复制构造函数,那么复制赋值运算符仍将具有与上述相同的默认行为,反之亦然。因此,如果您自定义其中一个,那么您可能还需要自定义另一个。也可能是析构函数。这称为rule of three。在大多数情况下,默认行为都会很好。