C++类继承与类组合,默认与含参的构造先后顺序 易错
这道题原本是没有那么多输出信息的,是我自己加上了调用什么函数的提示。
一开始以为就输出两行,一行是构造父类时A:5,一行是构造子类时x=5,A::x=5。
#include "bits/stdc++.h" using namespace std; class A{ public: A(){ x = 10; cout << "A default constructor" << endl; cout<<"A:"<<x<<endl; } /*A(int i=10){ x=i;cout<<"A:"<<x<<endl; }*/ //原本是这样的。注意,这种自带默认形参的构造函数,如果对象创建时没有带入任何参数,就使用默认形参赋值,相当于一个默认构造函数 //如果对象创建时带入了参数,就使用带入的参数赋值 A(int i){ x=i; cout << "A parameter constructor" << endl; cout<<"A:"<<x<<endl; } int x; }; class B:public A{ public: B(int i = 8):A(i){ x=i; cout << "B : " << x << " , " << "A::x = " << A::x << endl; } void show() {cout << "A::x = " << A::x << " , x = " << x << " , B.a.x = " << a.x << endl; } private: A a; int x; }; int main(){ B b(5); b.show(); return 0; }
结果发现。子类先利用参数初始化父类,即 A(i) ,调用了父类含参构造。然后根据子类声明成员的顺序进行初始化。子类含有父类的成员a,如果要初始化,应该为 a(int) ,但是没有。于是子类内含的父类成员就用默认值初始化。
初始化列表之后,然后执行大括号内的代码。
A parameter constructor A:5 A default constructor A:10 B : 5 , A::x = 5 A::x = 5 , x = 5 , B.a.x = 10
标签:初始化,易错,先后顺序,10,子类,C++,构造,父类 From: https://www.cnblogs.com/uacs2024/p/18090207