1.为内置型对象进行手工初始化
-
C++基本内置类型包括算术类型和空类型。其中算术类型包括字符、整型数、布尔值和浮点数;空类型不对应具体的值,当函数不返回任何值时使用空类型作为返回类型。 复合类型是指基于其它类型定义的类型,如指针、引用和数组。
-
初始化与赋值有本质区别:前者是直接初始化数据成员,后者则是先初始化再赋值。对于对象成员变量,其初始化的动作发生在进入构造函数之前,换句话说,初始化的优先级要高于赋值。这种区别事关底层效率,除此之外更重要的是,一些数据成员必须被初始化,比如,如果成员是const、引用或者某种未提供默认构造函数的类类型,就必须通过构造函数初始化列表为其提供初始值。
-
默认初始化:如果定义变量时没有指定初值,则变量被默认初始化,即被赋予默认值,默认值到底是什么由变量的类型和定义位置决定。如果内置型变量未被显式初始化,它的值就会由定义的位置决定:定义于任何函数体之外的变量被初始化为0;定义在函数体内部的内置型变量将不会被初始化。另外,绝大多数类都支持无需显式初始化而定义对象。
2.构造函数尽量使用成员初值列
- 成员初值列即初始化列表,对应着初始化,而构造函数内部的赋值操作对应着赋值。
- 对于构造函数,如果没有显式定义构造函数,那么编译器将会隐式定义一个默认构造函数。默认构造函数会按以下规则进行初始化类的数据成员:
1.如果类内存在初始值,则用其初始化成员。
2.若没有,默认初始化该成员。
即对于某些类来说,需要显式定义构造函数,使用默认构造函数存在潜在风险。 - 使用初始化列表进行成员初始化时,==类成员的初始化顺序和它们在class中的声明次序相同,与其在初始化列表中的顺序无关,==为了防止歧义,初始化列表列出的成员变量的顺序应当和它们在类中的定义顺序相同。