当赋值运算符'='也可以这样做时,复制构造函数有什

2021-02-24 17:15

C++提供复制构造函数的原因。赋值运算符可以执行相同的任务。复制构造函数比赋值运算符有什么优点吗?

解答动态

  • 你可以用一个复制构造函数做的事情,你不能用赋值做(无论是简单的还是完全的)运算符:
    复制类没有默认构造函数的。例如,如果一个类表示一个打开的文件,如果不将文件名传递给具有昂贵的默认构造函数的open.
    Copy类,则可能无法构造一个文件。可能构造函数分配了大量内存,一旦使用赋值运算符将新状态复制到对象中,这些内存就会被释放。
    按值传递类的实例。这就是复制构造函数的最初目的。在C语言中,如果按值传递struct,编译器只需按位复制该结构,这样接收函数就有一个本地副本,可以在不影响调用方的情况下进行修改。但是C++认识到,位拷贝不是复制大多数对象的最佳方式,因此它允许您编写自己的复制构造函数(并且默认复制行为也不同,因为类成员可能有自定义复制构造函数)。因为在类已经构造之后,不能重新分配引用。复制构造函数和赋值运算符只是在涉及引用时做不同的事情。复制构造函数初始化引用以指向引用在被复制的实例中指向的同一对象;赋值运算符实际复制被引用对象的值。
    复制具有常量成员的类。(请注意,类可以有一个默认构造函数,但仍然有常量成员。)

    • 无论是否有复制构造函数,您都必须将新对象初始化为稳定的初始状态,赋值运算符随后可以更新该状态。
      虽然您当然可以在没有复制构造函数的情况下执行此操作,但有一个复制构造函数有助于优化一个新对象的初始化,通过将其设置为预先复制另一个对象的状态,而不需要您首先将新对象初始化为默认状态,然后使用单独的赋值重置该状态。这样,您可以在1次操作而不是2次操作中设置新对象的状态。不能总是实现复制构造函数as
      Foo(const Foo&f){*this=f;} 赋值运算符假定您有一个有效的、完全构造的对象。复制构造函数不做这样的假设。这意味着,根据您的类,赋值运算符可能会在重新初始化之前尝试清除对象上的任何数据。或者甚至可以重新利用对象上已有的数据。

      • End

      免责声明:

      本页内容仅代表作者本人意见,若因此产生任何纠纷由作者本人负责,概与琴岛网公司无关。本页内容仅供参考,请您根据自身实际情况谨慎操作。尤其涉及您或第三方利益等事项,请咨询专业人士处理。