我试图了解副本构造函数。在下面的构造函数定义中,类DataModelComputationModel派生而来。

我的问题是,当您将对基类的引用传递给派生类的构造函数时,这是副本构造函数吗?

为什么默认的复制构造函数在这里不够用?

class DataModel : public ComputationModel {
    public:
      DataModel(const ComputationalModel &other);

      //..
};

mv::DataModel::DataModel(const ComputationModel &other) :
    ComputationModel(other)
{}

最佳答案

从技术上讲,您可以使用DataModel引用作为函数参数来定义ComputationalModel的副本构造函数。

DataModel d1(/* Parameter... */);
ComputationModel c1(/* Parameter... */);

DataModel d2(d1); // copy-construct instance, d1 passed as refence to the base class
DataModel d3(c1); // same behavior

但是,这几乎绝不是一个好主意,因为对象的复制构造通常需要从中复制对象的状态。传递基类引用时,将删除派生类实例的所有数据成员,这会使新创建的对象处于难以从客户端代码猜到的状态。

在您的情况下,默认的复制构造函数具有完全相同类型的const限定引用参数:
DataModel(const DataModel& other) = default;

这使我想到了你的最后一个问题



如果看不到继承层次结构的其余部分,这很难说。指导原则是:如果层次结构中所有数据成员的副本构造函数执行正确的操作,则默认的副本构造函数也执行正确的操作。

10-07 13:37