我有以下代码:
#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
PS:我为我的英语错误道歉,我感谢那些纠正我的人
答案 0 :(得分:2)
Access-Control-Allow-Origin:*
派生自Y
,也包含X
类型的数据成员x
。在实例化X
的对象实例时,必须为{em>两者 Y
类的继承X
部分调用X
构造函数,和 Y
数据成员。
在前两种情况下,您调用的x
构造函数不是显式初始化Y
数据成员,因此编译器使用默认的x
构造函数初始化隐式。这就是X()
的来源。
在第三种情况下,不输出1
,因为您没有使用7
对象作为输入构造y3
对象。您正在使用另一个X
对象构建它。但是你没有显式地定义了一个Y
拷贝构造函数,所以编译器为你定义了一个隐式拷贝构造函数,它会调用Y(const Y&)
拷贝构造函数两次,一次用于X
类的继承X
部分,一次用于Y
数据成员。
在最后一种情况下,您会看到x
输出3次,因为您正在调用4
复制构造函数3次,两个显式和一个隐式< / EM>:
X
传递给x1
时X()
传递给y3
时(slices x2
,因为y3
是值传递)x2
传递给x2
时