繁体   English   中英

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

[英]C++ base class constructor with 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. 作为B对象初始化的一部分调用A默认构造函数
  3. 输入B构造函数的主体
  4. 创建临时对象的一部分,称为(带有参数5A非默认构造函数
  5. 临时对象超出范围并被破坏
  6. B构造函数的主体退出

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM