C++具有默认参数的基类构造函数

C++ base class constructor with default parameters

本文关键字:基类 构造函数 参数 默认 C++      更新时间:2023-10-16

我写这个小程序来测试我的理解。我难以理解的是构造函数不是继承的,但是类 B 能够调用类 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 的编号!

此外,如果我从类 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);
}

在这里,您实际上"调用"了两次A构造函数。一次作为B构造的一部分(调用"默认"A构造函数),一次作为在B构造函数体内创建临时对象

序列为

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