拷贝初始化
int a = 5;
直接初始化
int a(5);
对于基本类型(int,double等),直接初始化和拷贝初始化效率一样。但对于复杂类型,直接初始化效率比拷贝初始化效率高。
直接初始化不支持所有类型的初始化,例如一个包含列表类型的对象。
花括号初始化
int a { 5 }; // 推荐
int a = { 5 };
花括号初始化,不允许隐式转换。例如:
int a = { 4.5 };
如果是拷贝和直接初始化,小数部分会被舍弃。但花括号初始化,会无法通过编译。
总结
花括号统一了初始化方式:
[new] T [object] { arg1, arg2, ... };
- 花括号内的参数不全时,称为值初始化,根据T的类型进行初始化
- 没有花括号时,称为默认初始化 。此时:
非class类型变量(int, double, …):如果是全局变量,此时会转为值初始化。如果是局部变量,该值是不确定的。
class类型变量(string, object, …):调用默认构造函数进行初始化