一、初始化列表
引言:
虽然上述构造函数调用之后,对象中已经有了一个初始值,但是不能将其称为对对象中成员变量 的初始化,构造函数体中的语句只能将其称为赋初值,而不能称作初始化。因为初始化只能初始 化一次,而构造函数体内可以多次赋值。
1.概念
以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括号中的初始值或表达式。
2.初始化列表存在的意义
初始化列表主要是为解决三种成员变量的初始化:
(1)、引用成员变量
(2)、const成员变量(3)、自定义类型成员(且该类没有默认构造函数时)为什么呐?首先需要明白一点:
在private处写的是成员变量的声明,那么成员变量的定义在哪里呐?答案就是在初始化列表。我们知道引用和const类型的变量必须在定义的时候初始化,而C++就规定成员函数的定义在初始化列表,所以引用和const类型的成员变量只能在初始化列表处初始化。
然后对于自定义类型,也是需要在初始化列表处初始化。
然后又有一个问题,那就是若没有在初始化列表显示定义,会有什么现象发生呐?
若成员变量没有显示定义,初始化列表也是定义,规则如下:
(1)、内置类型默认给随机值。
(2)、对于引用和const修饰的变量,必须显示定义。
(3)、自定义类型成员会去调用它的默认构造函数。
这里又会产生一个问题,若自定义类型没有默认构造函数,会怎么样?
答案是编译会报错。
解决方法:
(1)、定义一个默认构造函数
(2)、显示定义。
3.缺省值与初始化列表
我们知道声明处写的赋值,叫做缺省值,那这里的缺省值是给谁的呐?答案就是给初始化列表。但当初始化列表显示定义了,缺省值就会失效。
4.注意:
1、尽量使用初始化,但不能只给初始化列表,比如一些指针变量需要malloc动态开辟空间,但可能会开辟失败,只用初始化列表就无法解决。
2、每个成员只能在初始化列表中出现一次,因为那是定义的地方。
3、初始化列表初始化顺序跟成员成员变量声明的顺序保持一致。