- 初始化变量
构造函数:成员变量(初始值)
struct foo
{
string name;
int id;
foo(string s, int i):name(s), id(i){}; // 初始化列表
};
如果是这样,构造函数会在初始化之前执行[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LZOGS0LZ-1602588805200)(evernotecid://BDA4AB04-8A66-4642-AD7F-A41B5A94C267/appyinxiangcom/17780335/ENResource/p568)]
为什么使用初始化列表
初始化类的成员有两种方式
- 是使用初始化列表,
- 是在构造函数体内进行赋值操作。
使用初始化列表主要是基于性能问题,对于内置类型,如int, float等,使用初始化类表和在构造函数体内初始化差别不是很大,但是对于类类型来说,最好使用初始化列表。
为什么呢?使用初始化列表少了一次调用默认构造函数的过程(直接使用拷贝构造),这对于数据密集型的类来说,是非常高效的。同样看上面的例子,我们使用初始化列表来实现Test2的构造函数
struct Test2
{
Test1 test1 ;
Test2(Test1 &t1):test1(t1){}
}
以下几种情况时必须使用初始化列表
- 常量成员,因为常量只能初始化不能赋值,所以必须放在初始化列表里面
- 引用类型,引用必须在定义的时候初始化,并且不能重新赋值,所以也要写在初始化列表里面
- 没有默认构造函数的类类型,因为使用初始化列表可以不必调用默认构造函数来初始化,而是直接调用拷贝构造函数初始化。
成员变量的初始化顺序
成员是按照他们在类中出现的顺序进行初始化的,而不是按照他们在初始化列表出现的顺序初始化的,看代码。
struct foo
{
int i ;
int j ;
foo(int x):i(x), j(i){}; // ok, 先初始化i,后初始化j
};
struct foo
{
int i ;
int j ;
foo(int x):j(x), i(j){} // i值未定义因为此时j的值还没有初始化,不能被用
};