假设我为继承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被调用。
我应该在这里期待什么?
答案 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);
}