构造函数的初始化和其他函数一样,有自己的形参、名字和逻辑,但不同的是构造函数可以有初始化列表。
// 案例:
class num
{
private:
int a;
int b;
int c;
public:
/*1. 构造函数的初始化列表以冒号开始的;
2. 用逗号将每一个数据成员隔离开;
3. 每一个数据成员后面都有一个小括号,里面是数据成员的初始化值。
注意:构造函数初始化式只在构造函数的定义中而不是声明*/
num::num:a(1), b(2), c(0){}
};
省略构造函数初始化列表,并在构造函数体内初始化也是合法的,例如:
num::num(){a = 1; b = 2; c = 0;}
在什么情况下使用初始化列表
数据成员中有引用,const或者没有默认构造函数的类类型的任何成员使用
// 案例:
class num
{
private:
int a;
const int b;
int &c;
public:
num::num:a(1), b(2), c(0){}
};
成员初始化的次序
类中的每一个数据成员在构造初始化列表中只能被初始化一次。
构造函数初始化列表仅指定初始化成员的值,而不指定执行初始化的次序。初始化的次序和定义数据成员的次序是一样的。
// 案例:
class num
{
private:
int a;
int b;
int c;
public:
// error: a is initialzied before b
/*initialzied list: In fact, it used the not initialzied b to initialzied a.
so when we want to initialzie member datas, we should accord to the define sequence;
or all can't use member data to initialize the member data*/
num::num(int value): b(value), a(b), c(b){}
// right
num::num(int value):a(value), b(value), c(value){}
};
初始化式可以是任意表达式
class num
{
private:
int a;
int b;
int sum;
public:
num::num(int l, int j, int k):a(l), b(j), sum(k + j){}
};
类类型的数据成员的初始化式
class student
{
private:
string name;
int id;
public:
// name:用5个字符串na表示;
// string的构造函数:接受一个计数值和一个字符串,生成一个新的string,来保存重复指定次数的字符
student::student:name(5, 'na'), id(0){}
};