为啥这个语句会输出?

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 是的。所有类成员,包括基类,都必须在成员初始化列表中进行初始化。如果你不这样做,编译器会为你插入一个默认的初始化器。

以上是关于为啥这个语句会输出?的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个 JDBC 语句会导致异常?

为啥这个 PDO 语句会默默地失败?

为啥这个变量在 return 语句之后会改变?

为啥这个 switch 语句在运行时会结束 while 循环?

为啥这个 select 语句这么慢?

如果评估的变量为 False,为啥我的 django 模板中的这个 IF 语句会执行?