構(gòu)造函數(shù)的初始化和其他函數(shù)一樣,有自己的形參、名字和邏輯,但不同的是構(gòu)造函數(shù)可以有初始化列表。
// 案例:
class num
{
private:
int a;
int b;
int c;
public:
/*1. 構(gòu)造函數(shù)的初始化列表以冒號(hào)開(kāi)始的;
2. 用逗號(hào)將每一個(gè)數(shù)據(jù)成員隔離開(kāi);
3. 每一個(gè)數(shù)據(jù)成員后面都有一個(gè)小括號(hào),里面是數(shù)據(jù)成員的初始化值。
注意:構(gòu)造函數(shù)初始化式只在構(gòu)造函數(shù)的定義中而不是聲明*/
num::num:a(1), b(2), c(0){}
};
省略構(gòu)造函數(shù)初始化列表,并在構(gòu)造函數(shù)體內(nèi)初始化也是合法的,例如:
num::num(){a = 1; b = 2; c = 0;}
在什么情況下使用初始化列表
數(shù)據(jù)成員中有引用,const或者沒(méi)有默認(rèn)構(gòu)造函數(shù)的類(lèi)類(lèi)型的任何成員使用
// 案例:
class num
{
private:
int a;
const int b;
int &c;
public:
num::num:a(1), b(2), c(0){}
};
成員初始化的次序
類(lèi)中的每一個(gè)數(shù)據(jù)成員在構(gòu)造初始化列表中只能被初始化一次。
構(gòu)造函數(shù)初始化列表僅指定初始化成員的值,而不指定執(zhí)行初始化的次序。初始化的次序和定義數(shù)據(jù)成員的次序是一樣的。
// 案例:
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){}
};
初始化式可以是任意表達(dá)式
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){}
};
類(lèi)類(lèi)型的數(shù)據(jù)成員的初始化式
class student
{
private:
string name;
int id;
public:
// name:用5個(gè)字符串na表示;
// string的構(gòu)造函數(shù):接受一個(gè)計(jì)數(shù)值和一個(gè)字符串,生成一個(gè)新的string,來(lái)保存重復(fù)指定次數(shù)的字符
student::student:name(5, 'na'), id(0){}
};