c++ - 复制构造函数的用途是什么,而赋值运算符 '=' 也可以这样做?

标签 c++ oop copy-constructor

为什么 C++ 提供复制构造函数?赋值运算符可以完成相同的任务。与赋值运算符相比,复制构造函数有什么优势吗?

最佳答案

您可以使用复制构造函数执行的操作,而使用赋值运算符无法(轻松或根本无法执行):

  • 复制没有默认构造函数的类。例如,如果一个类表示一个打开的文件,如果不向它传递要打开的文件名,您可能无法构造一个文件。
  • 复制具有昂贵默认构造函数的类。也许构造函数分配了大量内存,然后一旦您使用赋值运算符将新状态复制到对象中,这些内存就会被释放。
  • 按值传递类的实例。这就是复制构造函数的最初目的。在 C 中,如果您按值传递一个结构体,编译器只会对该结构体进行按位复制,因此接收函数有一个本地拷贝,它可以在不影响调用者的情况下对其进行修改。但是 C++ 认识到按位复制不是复制大多数对象的最佳方式,因此它允许您编写自己的复制构造函数(并且默认复制行为也不同,因为类成员可能具有自定义复制构造函数)。
  • 复制一个包含引用的类,因为在类已经被构造之后你不能重新分配一个引用。复制构造函数和赋值运算符只是在引用方面做不同的事情。复制构造函数将引用初始化为指向正在复制的实例中引用指向的同一对象;赋值运算符实际上复制了引用对象的值。
  • 复制具有 const 成员的类。 (请注意,类可以具有默认构造函数,但仍然具有 const 成员。)
  • 关于c++ - 复制构造函数的用途是什么,而赋值运算符 '=' 也可以这样做?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66340334/

    相关文章:

    c++ - Qt - qmake -project,为什么卡住了?

    c++ - 没有数据成员的C++中的派生类问题

    php - 意外的 T_VARIABLE,期待 T_FUNCTION 修复

    c++ - 在 opengl 中绘制具有六个不同颜色面的立方体

    c++ - 为链接列表建立条目类

    javascript - 在 TypeScript 中获取日期的周数

    c++ - 在里面。静态成员,而 COPY CTOR 是私有(private)的

    c++ - 禁用复制/分配,自动禁用 child ?

    c++ - 向类添加复制构造函数

    c++ - 在 OpenCV 中乘以矩阵的 SVD 分量