初始化是在创建对象时赋予其一个初始值(对象是指一块能存储数据并具有某种类型的内存空间)。
注意初始化与赋值不同,赋值是把对象的当前值擦除,并以新值代替。
注意:并不是靠“=”判断是否为赋值(“=”出现也可能是拷贝初始化);判断是赋值还是初始化要看其本质的区别:若对象尚无初值且正在赋予其初始值则为初始化);若对象已有的当前值被擦除,并且被新值的代替,则为赋值。
一、内置类型初始化
int test{5}; //列表初始化
int test = 5; //拷贝初始化 (调用了拷贝构造函数)
int test={5}; //拷贝初始化
int test(5); //直接初始化; 注意:如果内置类型作为类的数据成员则不能使用()的方式初始化。
int test; //执行默认初始化;注意:若定义在函数体外部则被初始化为0,若定义在函数体内部则它的值是未定义的,试图拷贝或以其他形式访问此类值将引发错误。
注意:定义在块中的内置类型或复合类型(如数组和指针)的对象如果执行默认初始化,则他们的值是未被定义的。未定义的变量含有一个不确定的值,会带来无法预计的后果,包括程序崩溃、或者程序可以执行但结果时对时错无法把握。因此,内置类型和复合类型执行默认初始化并不安全,建议初始化每一个内置类型和复合类型的变量(无论是单独出现的内置类型,还是在类内作为数据成员)。