为啥这个语句会输出?
Posted
技术标签:
【中文标题】为啥这个语句会输出?【英文标题】:Why this statement comes to output?为什么这个语句会输出? 【发布时间】:2021-01-07 22:29:51 【问题描述】:我对此代码有疑问:
class A
public:
A()cout<<"A no parameter ";
A(string s)cout<<"A string parameter";
A(A &a)cout<<"A object A parameter";
;
class B:public A
public:
B()cout<<"B no parameters";
B(string s)cout<< "B strig parameter";
B(int s)cout<<"B int parameter";
;
int main()
A a2("Test");
B b1(10);
B b2(b1);
return 0;
当我运行这段代码时,我得到了这个结果:
A string parameterA no parameter B int parameterA object A parameterProgram ended with exit code: 0"
我实际上不确定为什么会出现声明 A no parameter
,即使我没有指定有关它的声明。
我现在正在学习编码,如果你能解释一下,我很高兴。
【问题讨论】:
在构造派生类的对象期间,必须先构造其基类子对象,因此调用A
的构造函数。
【参考方案1】:
你的问题是在
B(string s) /*...*/ cout<< "B strig parameter";
//and
B(int s) /*...*/ cout<<"B int parameter";
在/*...*/
部分你有一个空的member initialization list。这意味着编译器将为您插入一个基类。因此,构造函数实际上变成了
B(string s) : A() cout<< "B strig parameter";
//and
B(int s) : A() cout<<"B int parameter";
A()
部分是调用A
的默认构造函数的部分。
【讨论】:
我明白了。所以 A() 部分总是伴随着 B 类中的每个构造函数,即使我没有在每个部分中都写 :A() ,对吗? @Sho 是的。所有类成员,包括基类,都必须在成员初始化列表中进行初始化。如果你不这样做,编译器会为你插入一个默认的初始化器。以上是关于为啥这个语句会输出?的主要内容,如果未能解决你的问题,请参考以下文章