已定义的复制构造函数c ++的默认行为

时间:2015-02-05 11:59:06

标签: c++ initialization copy-constructor

假设我为继承A的B类定义了一个副本c'tor,并且还有一个成员变量。 在copt c'tor主体里面我写了一些代码,但是在初始化列表中我没有明确地调用A c'tor(也没有复制c'tor),也没有初始化成员变量。

在这种情况下,默认情况下默认调用默认c'tor,然后到达B'copy c'tor body。 但成员变量会是什么? 他们会使用默认的c'tor或者使用arguement对象的成员(参数对象==给予B copy c'tor)复制它们。

此外,如果在初始化列表中调用某些成员的副本c'tor / c'tor或父类复制c'tor / c'tor - 是否会改变该行为?

我知道如果我们没有明确定义复制c'tor:父类和成员复制c'tor's被调用。

我应该在这里期待什么?

2 个答案:

答案 0 :(得分:2)

在这种情况下,基类子对象将默认初始化。见[class.base.init] / 8:

  

在非委托构造函数中,如果给定可能构造的   子对象不是由 mem-initializer-id 指定的(包括   因为构造函数没有 mem-initializer-list 的情况   没有 ctor-initializer ),然后

     
      
  • 如果实体是具有大括号或等于初始化程序的非静态数据成员 [...]
  •   
  • 否则,如果实体是匿名联合或变体成员(9.5),则不执行初始化;
  •   
  • 否则,实体默认初始化(8.5)。
  •   

可能构建的子对象在[special] / 5中定义:

  

对于一个类,其非静态数据成员其非虚拟直接基础   类,如果类不是抽象的(10.4),它的虚拟基础   类被称为潜在构造的子对象。

答案 1 :(得分:1)

如果您编写了复制构造函数并且没有初始化成员变量,那么它将被默认初始化。

同样适用于基类,在大多数情况下,它们被视为与成员变量相同。

以下是一些示例代码:

#include <iostream>

using namespace std;

struct S
{
    S() { cout << "S()\n"; }
    S(S const &) { cout << "S(S&)\n"; }
};

struct T : S
{
    T() {}
    T(T const &t) {}

    // you have to explicitly write this if you want it 
    // T(T const &t): S(t) {}
    //                ^^^^
};

int main()
{
    T t;
    T u(t);
}