我有这段代码:
class A{
A *prev, *next, *pLast;
public:
A(): prev(NULL), next(NULL)
{
pLast->next = this;
pLast = this;
}
}
class B: public A
{
int y;
public:
B(int y1) : y(y1) {cout << "in cotr" << endl;}
}
我想知道是否首先调用A的构造函数(甚至在我为y插入值之前)?或者首先是y = y1,然后是A ctor,最后是B ctor(打印) 谢谢!
答案 0 :(得分:1)
在初始化派生类的成员之前,首先调用基类构造函数。
答案 1 :(得分:1)
列表中成员初始值设定项的顺序是无关紧要的:实际的 初始化顺序如下:
1)如果构造函数是针对派生程度最高的类的虚拟基础 类按它们出现的顺序初始化 基类深度优先从左到右遍历基类声明 (从左到右指的是基本说明符列表中的外观)
2)然后,直接基类按从左到右的顺序初始化为 它们出现在这个类的基本说明符列表中
3)然后,按照以下顺序初始化非静态数据成员 类定义中的声明。
4)最后,执行构造函数的主体
因此对于这种情况,初始化顺序将是(1)基类A
(2)成员y
(3)B
的构造体。
答案 2 :(得分:0)
构造函数:base - &gt;最衍生的
析构函数:派生最多 - &gt;基
答案 3 :(得分:0)
这里有一种方法可以在不通过无休止的标准阅读的情况下找到答案(插入有关钓鱼和教学的内容)。
您需要在会员初始化期间打印一些内容 如果您的成员也是类的实例,则可以这样做:
A initialized
Member initialized
B initialized
打印
B
顺便说一句,这是一种可以使用&#34;逗号运算符&#34;的情况,这可以让我们避免那些额外的类。
像这样写struct B : A
{
B() : member((cout << "Member initialized\n", 0)) { cout << "B initialized" << endl; }
int member;
};
:
{{1}}
产生相同的输出
逗号运算符评估其左侧,抛弃结果,并返回右侧。 (这里需要一对额外的括号,以免被解释为两个参数。)
当您需要跟踪评估时,它可能很有用,但没有明显的方法来插入跟踪。