C++ 继承c++;构造函数-谁先打电话?
我有以下代码:C++ 继承c++;构造函数-谁先打电话?,c++,inheritance,initialization,C++,Inheritance,Initialization,我有以下代码: 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" << en
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类{
A*上一个,*下一个,*塑料;
公众:
A():上一个(NULL),下一个(NULL)
{
pLast->next=这个;
pLast=这个;
}
}
B类:公共A
{
int-y;
公众:
B(inty1):y(y1){cout在初始化派生类的成员之前,首先调用基类构造函数。构造函数:base->most-derived
析构函数:大多数派生->基的定义如下:
列表中成员初始值设定项的顺序无关紧要:实际
初始化顺序如下:
1) 如果构造函数用于派生最多的类,则为virtual base
类按照它们在中出现的顺序进行初始化
基类声明的深度优先从左到右遍历
(从左到右表示基本说明符列表中的外观)
2) 然后,按从左到右的顺序初始化直接基类,如下所示
它们出现在此类的基本说明符列表中
3) 然后,按照以下顺序初始化非静态数据成员:
类定义中的声明
4) 最后,执行构造函数的主体
因此,在这种情况下,初始化顺序将是:(1)基类A
(2)成员y
(3)构造函数体B
,这里有一种方法可以找到,无需阅读无休止的标准(插入一些关于钓鱼和教学的内容)
您需要在成员初始化期间打印一些内容。
如果您的成员也是类的实例,则可以执行此操作:
struct Member
{
Member(int i) { cout << "Member initialized" << endl; }
};
struct A
{
A() { cout << "A initialized" << endl; }
};
struct B : A
{
B() : member(0) { cout << "B initialized" << endl; }
Member member;
};
int main()
{
B b;
}
另一方面,这是一种可以使用“逗号运算符”的情况,它可以避免额外的类。
这样写B
:
struct B : A
{
B() : member((cout << "Member initialized\n", 0)) { cout << "B initialized" << endl; }
int member;
};
结构B:A
{
B():首先执行父类的成员((cout)构造函数。实际上,B的初始化列表有一个对A.B(inty1)的(默认)构造函数的隐式调用:A(),y(y1){……}
,您可以(明确地)使用另一个构造器。为什么不试一下呢?你住的地方的cout
s很贵吗?为什么不在构造器中使用两个,自己看看呢?@enhzflep一些cout
s可以长到2米。可能是
struct B : A
{
B() : member((cout << "Member initialized\n", 0)) { cout << "B initialized" << endl; }
int member;
};