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

标签 c++ constructor derived-class default-parameters

我写这个小程序是为了测试我的理解力。我无法理解的是构造函数不是继承的,但是 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. 一个非默认构造函数调用(带有参数5)作为创建临时对象的一部分
  5. 临时对象超出范围并被销毁
  6. B 构造函数主体退出

关于具有默认参数的 C++ 基类构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46967573/

相关文章:

c++ - 数组随机访问 C++

c++ - 如何将度数(角度)转换为面数

c++ - 处理 MSVC 宏中的额外括号

由 小码哥发布于 2019-12-09 17:00:01 c++ #ifdef Mac OS X 问题

C++更改构造函数中的函数解析优先级

Java Class.newInstance 错误

c++ - 从另一个类访问类成员,使用指针好还是友元好?

c++ - 没有模板也能完美转发吗

C++11构造函数继承和无参数构造函数

c++ - 在大型框架中从 C++ 类派生 cuda 类