initialization member list
当以下情况,适于使用initialization member list
对其进行初始化
- 初始化一个
reference member
- 初始化一个
const member
- 初始化
constructor
具有参数的base class
- 初始化
constructor
具有参数的member class
如果没有使用initialization member list
对变量进行初始化,而在函数内对其进行赋值操作,注意,是赋值,而不是初始化,那么效率就会变低
如果一个变量没有被显式初始化,那么就会隐式调用该变量的constructor
,然后产生一个临时变量,再进行赋值操作,那么代价就是两次初始化,一次拷贝,一次析构
1 | String str; |
如果使用了initialization member list
,代码会变成这样
1 | Constructor():str(0) {} |
值得注意的是,初始化的顺序由定义顺序决定
1 | String str; |
也就是说人为安排初始化顺序是无用功,因为不会受人为安排的顺序影响,只与变量定义有关
1 | int number; |
上面这段代码则是错误的,因为number
先定义,那么number(i)
则是未知取值
同样,关于初始化的问题,还有另一种形式
1 | X::X(int val) : i(xfoo(val)) { |
这种形式的初始化,如果xfoo()
存在于class
之内,那么就十分危险,如果xfoo()
的正确执行依赖于其他class member
的初始化,那么就会导致bug
如果使用derived class
的member
来初始化base class
,也有可能会出现bug
1 | class Foo : public x { |
其中大概的原因是
base class
会先被初始化,然后才到derived class
的初始化