目录
概述
-
定义:列表初始化是C++11引入的新标准,目的是统一初始化方式
-
C++11以前只能使用列表初始化来初始化内置类型数组和POD类型对象,C++11中列表初始化可以用于初始化任何类型对象
-
POD(plain old data)类型:仅由内置类型变量构成且不含指针的类,简单来说是可以直接使用memcpy复制的对象
-
聚合体(aggregate):聚合体一定是POD类型
-
无自定义构造函数
-
无私有或保护的非静态数据成员(静态成员与单独对象无关,故不影响初始化)
-
无基类
-
无虚函数
-
无类内已经初始化的非静态数据成员
-
-
注意:区分列表初始化和初始化列表
列表初始化:用{}进行初始化的方式
初始化列表:构造函数体前对对象成员直接进行初始化的列表
initializer_list:一种用于未定参数的轻量STL容器
实现机制详解
对内置类型对象、POD对象和类对象的列表初始化实现细节是不同的
POD类型的列表初始化
-
此处POD类型包括:内置类型、聚合体类
-
内置类型数组按照顺序初始化
-
C++11标准中列表初始化会防止可能导致潜在信息丢失的类型缩小(即不能像赋值一样将大类型如int隐式转换成小类型如char)
-
-
聚合体类按照成员定义顺序依次初始化
含有构造函数的类的列表初始化(C++11)
-
通过{}进行初始化和()结果一致【即通过()调用构造函数的地方都可以完全等价地用{}代替】,都是直接用括号内的值调用对应构造函数直接初始化对象,并不会先生成临时对象再拷贝
-
={}与{}是等价的语法【即加不加=对初始化行为没有影响】,均不会调用拷贝运算符或拷贝构造函数
-
与内置类型的列表初始化一致