了解构造函数的一些特定案例

Understand some specific cases of the constructor

本文关键字:案例 构造函数 了解      更新时间:2023-10-16

我有以下代码:

#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构建器?
  • 在最后一个情况下,有一个" 8",所以对我来说听起来不错,但是为什么有三个X构造函数,而Y2和Y3已经被声明?

ps:我为我的英语错误表示歉意,我感谢纠正我的人

Y源自 X也包含 X类型的数据成员 x。当实例化 Y的对象实例时,必须将X构造函数称为 Y类的继承的 X部分, x data member。

在前2个情况下,您要调用的Y构造函数不是明确明确初始化x数据成员,因此编译器使用默认的X()构造函数来初始化它 ntimike ntimike 。这就是1来自的地方。

在第三种情况下,7未输出,因为您没有用X对象构造y3对象作为输入。您正在使用另一个Y对象构造它。但是您尚未明确定义 Y(const Y&)复制构造函数,因此编译器为您定义了 intimit 复制构造函数,该构建器为您调用X COPY构造函数两次,一次为继承的XY类的部分,一次用于x数据成员。

在最后一个情况下,您看到4是输出3次,因为您正在调用X复制构造函数3次,两个显式和一个隐含::

  • x1传递给X()
  • y3传递给x2(切片y3,因为x2是通过可通过的)
  • x2传递给x()