我有以下代码:
#include <iostream>
using namespace std;
class X {
public:
X () {
x = 0;
cout << "1";
}
X (int x) {
this->x = x;
cout << "2";
}
X (double x) {
this->x = x;
cout << "3";
}
X (const X& x) {
this->x = x.x;
cout << "4";
}
protected:
int x;
};
class Y : public X {
public:
Y () : X(10) {
cout << "5";
}
Y (int p) : X(p) {
cout << "6";
}
Y (const X& x) : X(x) {
cout << "7";
}
Y (const X& x1, X x2) : X(x1), x(x2) {
cout << "8";
}
protected:
X x;
};
int main() {
Y y1;
cout << endl;
Y y2(10);
cout << endl;
Y y3(y1);
cout << endl;
Y y4(y2, y3);
cout << endl;
}
这段代码的输出是:
215
216
44
4448
- 在前两种情况下,我不明白为什么会有“1”。我同意该对象是使用第二个 X 构造函数和 Y 的第一个构造函数构建的,但为什么 X 的第一个构造函数在第二个构造函数之后调用?
- 在第三种情况下,我想知道为什么没有“7”,因为在我看来,程序声明了一个 Y 实例,因此应该调用 Y 构造函数?
- 在最后一个例子中,有一个“8”,这对我来说听起来不错,但为什么有三个 X 构造函数调用,而 y2 和 y3 已经声明了?
PS:我为我的英语错误道歉,我感谢那些指正我的人
最佳答案
Y
派生自 X
,并且还包含 X
类型的数据成员 X
。实例化 Y
的对象实例时,必须为 both 继承的 X
部分调用 X
构造函数Y
类,和 x
数据成员。
在前两种情况下,您调用的Y
构造函数不是显式 初始化x
数据成员,因此编译器使用默认 X()
构造函数隐式初始化它。这就是 1
的来源。
在第三种情况下,7
没有输出,因为您没有使用 X
对象作为输入来构造 y3
对象。您正在使用另一个 Y
对象构造它。但是您还没有显式定义一个Y(const Y&)
复制构造函数,因此编译器为您定义了一个隐式复制构造函数,它调用X
复制构造函数两次,一次用于 Y
类的继承 X
部分,一次用于 x
数据成员。
在最后一种情况下,您看到 4
被输出 3 次,因为您调用了 X
复制构造函数 3 次,两次 显式 和一个隐含地:
- 将
x1
传递给X()
时 - 当将
y3
传递给x2
时(slicesy3
,因为x2
是 pass-by-值) - 将
x2
传递给x()
时
关于c++ - 了解构造函数的一些具体情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46514450/