具有默认参数

时间:2017-10-27 04:34:48

标签: 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

但这只是为了理解。

1 个答案:

答案 0 :(得分:4)

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

B() {
    A(5);
}

在这里你实际上打电话&#34; A构造函数两次。作为B构造的一部分(其中&#34;默认&#34; A构造函数被调用),以及在{{1>}构造函数中创建临时对象的一部分{1}}构造函数体。

序列为

  1. B构造函数名为
  2. B默认构造函数,作为A对象
  3. 初始化的一部分进行调用
  4. 输入B构造函数的正文
  5. B非默认构造函数(带参数A)作为创建临时对象的一部分
  6. 临时对象超出范围并被破坏
  7. 5构造函数的正文退出