c++ - 了解构造函数的一些具体情况

标签 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
  • 在前两种情况下,我不明白为什么会有“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 时(slices y3,因为 x2 是 pass-by-值)
  • x2 传递给 x()

关于c++ - 了解构造函数的一些具体情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46514450/

相关文章:

c++ - 获取表面光属性

c++ - 当父类在 C++ 中没有默认构造函数时,如何在继承类中使用构造函数?

c++ - 为类构造函数中的指针分配内存

c++ - 构造函数和析构函数必须是虚的?

c++ - 继承中的指针类型对象

将未初始化的局部变量传递给函数时出现 C++ 编译器警告(?)

c++ - 在对空基类使用聚合初始化时如何避免 {}

c++ - "Inherit"无法访问基类成员变量的 move 操作

arrays - gfortran 中隐含 do 的数组构造函数的奇怪初始化行为

c++ - 任务委托(delegate)调度器