了解构造函数的一些特定情况

时间:2017-10-01 16:32:36

标签: c++ inheritance constructor

我有以下代码:

#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
  • 在前两种情况下,我不明白为什么会出现&#39; 1&#39;。我同意该对象是使用第二个X构造函数和Y的第一个构建的,但为什么X的第一个构造函数在第二个之后被调用?
  • 在第三种情况下,我想知道为什么没有&#39; 7&#39;因为在我看来程序声明了一个Y实例所以应该调用Y构造函数吗?
  • 在最后一种情况下,有一个&#39; 8&#39;所以听起来不错,但为什么有三个X构造函数调用,而y2和y3已经声明了?

PS:我为我的英语错误道歉,我感谢那些纠正我的人

1 个答案:

答案 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