C++看程序写结果:类继承与类组合,默认与含参的构造先后顺序 易错
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
这个是原始代码
#include "bits/stdc++.h" using namespace std; class A{ public: A(int i=10){ // x=i;cout<<"A:"<<x<<endl; // } int x; }; class B:public A{ public: B(int i = 8):A(i){ // x=i; cout<<"B:"<<x<<","<<A::x<<endl; } private: A a; int x; }; int main(){ B b(5); return 0; }
结果
A:5 A:10 B:5,5