在复制构造函数或赋值运算符期间未初始化对象时会发生什么?

时间:2014-06-26 06:22:32

标签: c++

假设我有一个矢量对象作为属性之一,并且我在复制构造函数中初始化它,那么会发生什么? 另外,如果我为没有默认构造函数的任何其他对象执行此操作,那么会发生什么?

3 个答案:

答案 0 :(得分:1)

  

假设我有一个矢量对象作为其中一个属性,我不会在复制构造函数中初始化它,那么会发生什么?

我想你是要在构造函数初始化列表中初始化。如果是这样,将调用默认构造函数,您似乎已在此处回答...

  

另外如果我为没有默认构造函数的任何其他对象执行此操作,那么会发生什么?

您的程序无法运行。更具体地说,编译器将发出错误,指示您正在尝试(或隐式尝试)使用该对象的不存在或不可访问的构造函数。试着看看你的自我;)

绕过这些类型的对象的方法(读取:不是 方式)是动态分配它们,即使用它们std::unique_ptr。通过这种方式,您可以在获得必要的参数后延迟构造。但是,更好的方法是,如果可以,您应该增加或包装对象的类以合并移动语义。使用移动语义,您可以消除“延迟构建 - 因为我还没有必要的参数”问题。默认构造函数会使对象的状态保持未初始化状态,即无法使用,但可以使用移动/复制构造函数重新初始化。一个很好的例子是std::thread

答案 1 :(得分:0)

复制构造函数与其他构造函数没有区别。未在构造函数中显式初始化的类成员是默认初始化的,这意味着类类型的成员是默认构造的,数组成员的每个元素都是默认初始化的,否则不执行初始化。如果类成员没有默认构造函数,并且您没有在复制构造函数中初始化它,编译器将报告错误。

(如果您根本不提供复制构造函数,编译器将为您生成一个复制构造每个非静态数据成员和基类子对象,如果这样做是合法的。)

至于作业,未分配的班级成员只会在转让前保留其价值。

答案 2 :(得分:0)

Here's相关文件。特别是,

  

在构成构造函数体的复合语句开始执行之前,完成所有直接碱基,虚拟碱基和非静态数据成员的初始化。成员初始化列表是可以指定这些对象的非默认初始化的位置。对于无法进行默认初始化的成员,例如引用成员和const限定类型,必须指定成员初始值设定项。

因此,如果您的自定义复制构造函数最终没有复制vector成员,那么您的副本将不正确,因为vector最终将被默认构建。 C ++程序在语法上完全有效 - 复制构造函数根本就不是“正确的”。这通常适用于所有默认的可构造成员。如果你有一个不是默认构造的成员,那么代码就不会编译。