这两个概念如此相似,以至于很多时候都在混用。
初始化列表是构造函数的周边概念,表示在执行构造函数中,先执行初始化列表,再执行函数体内的语句。
构造函数的编写尽量采用初始化列表的方式,特别是类中有自定义类出现的时候。而且有些情况,必须采用初始化列表才能初始化成员变量,如类中有引用类型,类中有const成员变量时等。
class myclass { public: myclass(int a, int b, int c):m_a(a),m_b(b),m_c(c) { std::cout << "construct function called!" << std::endl; } private: int m_a; const int m_b; int &m_c; };
列表初始化是c++11为了统一内置变量,结构,类型的初始化方式的一种尝试,即使用者可以采用花括号{}来初始化这些变量。
为什么所有类型都可以采用列表来初始化变量?那是因为c++11引入了initializer_list这个类模板。如何使用这个类模板?这里提供一个案例。
#include <iostream> #include <initializer_list> class myclass { public: myclass(int a,int b) { std::cout << a << "---" << b << std::endl; } myclass(std::initializer_list<int> il) { for(auto &i : il){ std::cout << i << std::endl; } } }; int main() { myclass aa(1,2); myclass bb{3,4,5}; return 0; }
即可以作为函数参数,这里作为构造函数的参数,也可以用作类成员函数,或普通函数的参数。那么声明对象的时候必须采用花括号初始化对象,而这样的好处是可以不用指定参数个数,当然它的主要用途是用来支持泛型编程。