成员变量初始化顺序:
初始化顺序规则:
① 基类优先: 如果类是从一个或多个基类继承而来的,那么基类的构造函数会首先被调用,按照他们被继承时声明的顺序
② 成员变量初始化顺序: 成员变量按照它们在类定义中声明的顺序进行初始化,而不是它们在构造函数初始化列表中的顺序。
③ 构造函数体执行: 所有成员变量和基类初始化完成之后,执行构造函数体内的代码。
C++11新特性:
对于一个聚合类型,使用初始化列表相当于对其中的每个元素分别赋值,而对于非聚合类型,则需要先自定义一个合适的构造函数,此时使用初始化列表将会调用它对应的构造函数。
std::initializer_list
在C++的STL容器中,可以进行任意长度的数据的初始化,使用初始化列表也只能进行固定参数的初始化,如果想要做到和STL一样有任意长度初始化的能力,可以使用std::initializer_list这个轻量级的类模板来实现。
特点:
① 是一个轻量级的容器类型,内部定义了迭代器iterator等容器必须的概念,遍历时得到的迭代器是只读的。
② 对于std::initializer_list<T>而言,他可以接收任意长度的初始化列表,但是要求元素必须是同种类型T。
③ 在std::initializer_list内部有三个成员接口: size(), begin(), end()
④ std::initializer_list对象只能被整体初始化或者赋值
使用实例:
void func(std::initializer_list<int> ls) {
for (auto it = ls.begin(); it != ls.end(); it++) {
cout << it << " ";
}
cout << endl;
}
函数调用: func({3,4,5,6,7,8}); // 参数是一个初始化列表,列表中可以有多个成员
输出结果: 3 4 5 6 7 8
参考视频: B站up主 - 爱编程的大丙 - C++11实用特性