我有以下代码:
class A{
public:
A(int* i){
std::cout << "in A()" << i << std::endl;
}
};
class B: public A{
public:
B(): i{new int{10}}, A{i}{
std::cout << "in B()" << std::endl;
}
private:
int* i;
};
int main()
{
B b;
}
在A
构造函数中,我有0(这是预期的)。但我想之前初始化i
。它有可能吗?
答案 0 :(得分:1)
i
是类B
的数据成员,因此为了创建,必须首先创建类B
的对象。所以答案是否定的。
答案 1 :(得分:1)
不可以,因为基类初始化总是在派生类初始化之前。
C ++ 11,12.6.2
10 在非委托构造函数中,初始化按以下顺序进行:
首先,仅对于派生程度最高的类(1.8)的构造函数,虚拟基类按照它们出现在基本有向无环图的深度 - 从左到右遍历的顺序进行初始化类,其中“从左到右”是派生类base-speci-list中基类出现的顺序。
然后,直接基类按声明顺序初始化,因为它们出现在基本指定列表中(不管mem-initializers的顺序如何)。
然后,按照在类定义中声明的顺序初始化非静态数据成员(同样不管mem-initializers的顺序如何)。
最后,执行构造函数体的复合语句。
答案 2 :(得分:1)
在基础构造函数之前初始化成员。可能的?
不,那是不可能的。标准要求在初始化类成员之前首先初始化基类。
B(): i{new int{10}}, A{i}{
std::cout << "in B()" << std::endl;
}
转换为:
B(): A{i}, i{new int{10}}{
std::cout << "in B()" << std::endl;
}