了解构造函数的一些特定案例
Understand some specific cases of the 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构建器?
- 在最后一个情况下,有一个" 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构造函数两次,一次为继承的X
Y
类的部分,一次用于x
数据成员。
在最后一个情况下,您看到4
是输出3次,因为您正在调用X
复制构造函数3次,两个显式和一个隐含::
- 将
x1
传递给X()
- 将
y3
传递给x2
(切片y3
,因为x2
是通过可通过的) - 将
x2
传递给x()
相关文章:
- "error: no matching function for call to"构造函数错误
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 选择要调用的构造函数
- 如何委托派生类使用其父构造函数?
- 构造函数正在调用一个使用当前类类型的函数
- 没有用于初始化C++中的变量模板的匹配构造函数
- 初始化具有非默认构造函数的std::数组项的更好方法
- 当从函数参数中的临时值调用复制构造函数时
- 在c++构造函数中使用随机字符串生成器
- 一对向量构造函数:初始值设定项列表与显式构造
- 从构造函数抛出异常时如何克服内存泄漏
- 我不明白为什么我声明一个空的内部结构并将其传递给构造函数
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 具有默认模板类型的默认构造函数的类型推导
- 使用dynamic_cast和构造函数时出错
- 了解构造函数的一些特定案例
- 通过模板构造函数(std ::功能和迷你案例)将构造函数触发