c++ - 为什么成员类在 C++ 中首先初始化?
问题描述
我试过ff。代码:
#include <iostream>
struct A
{
A() { std::cout << "1"; }
A(const A&) { std::cout << "2"; }
A(A&&) { std::cout << "3"; }
};
struct B
{
B() { std::cout << "4"; }
B(const B& b) : a(b.a) { std::cout << "5"; }
B(B&& b) : a(b.a) { std::cout << "6"; }
A a;
};
int main()
{
B b1;
std::cout << "END OF b1" << std::endl;
B b2 = std::move(b1);
}
输出是:
14END OF b1
26
我只是想知道为什么会这样,为什么 B 的构造函数被称为第二个?我也尝试过使用 class 而不是 struct ,这是相同的行为。
解决方案
这是预期的行为。初始化顺序指定为
1)如果构造函数是针对最派生类的,则虚基类按照出现的顺序进行初始化,深度优先从左到右遍历基类声明(从左到右指出现在基本说明符列表中)
2) 然后,直接基类按照从左到右的顺序初始化,因为它们出现在此类的基说明符列表中
3) 然后,按照类定义中的声明顺序初始化非静态数据成员。
4) 最后执行构造函数的主体
然后数据成员a
总是在(步骤#4)的构造函数执行之前初始化(步骤#3 B
)。
推荐阅读
- python - 在右侧索引的数据框的新列中插入值
- javascript - change position of custom marker on google-map-react
- html - 模态内部的边界问题
- ansible - 使用命令模块时如何转义引号?
- c# - Microsoft Office Access 数据库引擎找不到对象“PPR_Status_Detailed”
- pyserial - 忽略写入串行端口的数据,直到使用 pyserial 读取
- microsoft-dynamics - 将 onmicrosoft.com 替换为 MS Dynamics 365 门户的 b2clogin.com URL
- java - 在 Apache Camel 中调用 MyBatis 查询作为自定义 DefaultShutdownStrategy 的一部分
- swift - swift code Euler p1 需要帮助理解
- sql - 在 SQL 查询中查找重复的代码块