为什么在C++中首先初始化成员类
Why are member classes initialized first in 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的构造函数被称为second?我也试着用class代替struct,这是相同的行为。
这是预期行为。初始化顺序指定为
1(如果构造函数用于派生最多的类类按照它们在中出现的顺序进行初始化基类声明的深度优先从左到右遍历(从左到右指出现在基本说明符列表中(
2( 然后,直接基类按从左到右的顺序初始化为它们出现在这个类的基本说明符列表中
3( 然后,按以下顺序初始化非静态数据成员类定义中的声明。
4( 最后,构造函数的主体被执行
然后数据成员a
总是在执行B
的构造函数(步骤#4(之前初始化(步骤#3(。
相关文章:
- 为什么在C++中首先初始化成员类
- 在 C++11 中轻松初始化模板类的静态成员,没有 clang 警告
- 如何从子类的构造函数初始化父类的私有成员
- 初始化在类类型 #define 中定义的非静态成员数组,不带默认 ctor
- 初始化与类类型相同的静态成员(静态初始化顺序问题)
- 使用成员的地址初始化基类是否合法?
- 如何根据构造函数参数使用超类类型初始化成员变量?
- C++ 在头文件或构造函数中初始化 const 类成员变量?
- 初始化基类成员 (c++) 的首选方法
- 为什么不允许静态成员变量的初始化在类中,而允许静态静态成员的初始化
- 为什么C++可以使用未初始化的成员变量(引用或指针 *NOT 值复制*)来初始化其父类的成员变量
- Clang 无法在赋值运算符/复制构造函数中检测到未初始化的类成员
- 从现有 istream 或类本身创建的 istream 初始化成员 istream
- 如何在C++中声明零初始化的类成员
- 我应该初始化抽象类的成员吗?
- 通常应用方法,使用带有构造函数委托的 SFINAE 通过类模板的构造函数初始化成员
- 如何在嵌套类中初始化成员?C
- 初始化基类和派生类中的类成员变量
- 通过drived类模板值通过基类构造器初始化基类数组成员变量
- 用非默认构造函数初始化成员类