3

=我有一个与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)如果只需要其中一个,首选哪种实现?

谢谢!

4

3 回答 3

4

您展示的第一件事是赋值运算符,第二件事是复制构造函数。它们是做不同事情的不同功能。(即 ctor 设置一个正在出生的对象,并且 op= 更改现有对象的状态以匹配另一个对象的状态。)

运气好的话(通过设计),您没有实现它们中的任何一个,而是将其留给语言来创建它们。如果您使用明智的成员和基类,它就会发生。

如果你需要去实现它们(检查两次确实是这样!)你可能需要它们两个,请参阅规则 3

于 2013-06-05T15:46:10.043 回答
3

如果要自定义分配/复制,则必须同时实现:

  • operator=用于赋值,例如:ABC a; ABC b; a = b;
  • ABC::ABC(const ABC &other)用于副本,例如:ABC a; ABC b(a);.

您也很可能想要实现默认构造函数和析构函数。您可能想了解更多关于三法则的信息

于 2013-06-05T15:41:04.730 回答
1

在您的情况下,您既不需要实现复制构造也不需要复制分配,因为编译器会自动为您生成这些成员函数。生成的函数将简单地为每个数据成员分别调用复制构造函数或复制赋值运算符。

如果您想要自定义行为,您只需要实现功能。顺便说一句,如果您实现了复制构造函数,那么复制赋值运算符仍将具有与上述相同的默认行为,反之亦然。因此,如果您自定义两者之一,那么您可能还需要自定义另一个。也可能是析构函数。这称为三法则。在大多数情况下,默认行为会很好。

于 2013-06-05T15:43:54.240 回答