作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一小段代码如下:
#include <iostream>
using namespace std;
class C {
public:
C() {i = 6; cout << "C0:" << i << endl;}
C(int i0) {i = i0; cout << "C1:" << i << endl;}
~C() {cout << "C2:" << i << endl;}
private:
int i;
};
class D {
public:
D() {cout << "D0" << endl;}
~D() {cout << "D1" << endl;}
private:
C c;
};
int main(int argc, char* argv[]) {
cout << "X" << endl;
D d;
cout << "Y" << endl;
}
其输出为:
XC0:6D0YD1C2:6
我的问题是:为什么在这种情况下 D0
之前创建 C0:6
?
我知道对于继承的类,顺序是基础构造函数->派生构造函数->派生析构函数->基础析构函数。所以,如果 D
是从 C
继承的,那么我会期望这里的顺序。但是,据我所知,D
不是 C
的子类;它只包含 C
类的一个实例。
那么在这种情况下,为什么我得到的输出顺序与 D
是 C
的子类一样?
显然有一条我不理解的基本规则。
最佳答案
基类对象和成员变量(按此顺序)在构造函数体中的语句执行之前被初始化。
c
是 D
的成员,因此您会看到 c
在 D
的构造函数之前进行初始化 body 。
破坏的顺序与构造的顺序相反。
关于c++ - C++ 中的析构函数和构造函数顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42081485/
我是一名优秀的程序员,十分优秀!