带默认参数的 C++ 基础 class 构造函数

C++ base class constructor with default parameters

我写这个小程序是为了测试我的理解力。我无法理解的是构造函数不是继承的,但是 class B 能够调用 class A!

的构造函数
#include <iostream>
using namespace std;

class A {
public:
    A(int x = 2) {          //Constructor A
        num = x;
    }
    int getNum() {
        return num;
    }

protected:
    int num;
};

class B: public A {         //Constructor B
public:
    B() {
        A(5);
    }
};

int main() {

    A a(3);                     //create obj a with num = 3
    B b;                        //create obj b
    cout << a.getNum() << endl;
    cout << b.getNum() << endl;
    return 0;
}

输出为:

3
2

构造函数A的调用到底做了什么?它没有使用传递的参数来初始化对象b的编号!

此外,如果我从 class A 的构造函数中删除默认值,我会得到编译错误:

no matching function for call to 'A::A()'

那么这里到底发生了什么?

我知道正确的做法是:

class B: public A {         //Constructor B
public:
    B() : A(5) {
    }
};

给出输出:

3
5

但这只是为了理解。

让我们看一下 B 构造函数:

B() {
    A(5);
}

这里你实际上 "call" A 构造函数 两次 。一旦作为 B 构造的一部分(调用 "default" A 构造函数),一旦在 临时对象 中创建 临时对象 =11=]构造函数体。

顺序如

  1. B 调用了构造函数
  2. A 默认构造函数作为 B 对象初始化的一部分被调用
  3. 进入B构造函数的主体
  4. A 在创建临时对象的过程中调用了非默认构造函数(带有参数 5
  5. 临时对象超出范围并被销毁
  6. B 构造函数的主体退出