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