前言
创建对象时,初始化成员变量操作一般是在构造函数的函数体中进行的。C++比较特殊,专门为初始化成员变量提供了另外一种操作:初始化列表。
一、初始化列表是什么?
初始化列表以":“为头位于构造函数的函数体前,在初始化列表中,各个成员变量以”,“分隔,并通过”()"进行初始化
Temp类的构造函数
Temp(int a,int b)
: ma(a) //初始化列表
, mb(b) //初始化列表
{}
二、构造函数与初始化列表
1.初始化自定义类成员变量
如果当前类通过组合的方式使用其他类,并且需要初始化其他类中的成员变量,可以在初始化列表里调用其他类的构造函数(这里如果是通过继承的方式使用基类,也可以在派生类中的初始化列表中调用基类的构造函数)
日期类:
class Date
{
public:
Date(int year, int month, int day)
: year_(year)
, month_(month)
, day_(day)
{
cout << " Date() " << endl;
}
private:
int year_;
int month_;
int day_;
};
商品类:
class Goods
{
public:
Goods(int id,string name,int price,int year,int month,int day)
: date_(year,month,day)
, id_(id)
, name_(name)
, price_(price)
{
cout << " Goods() " << endl;
}
private:
Date date_;
int id_;
string name_;
int price_;
};
2.初始化顺序
初始化列表中初始化顺序与初始化列表无关,初始化列表是按照成员变量在类中定义的顺序进行初始化的
比如:
class test
{
public:
test(int a)
: mb(a)
, ma(mb)
{
}
void show()
{
cout << ma << " " << mb << endl;
}
private:
int ma;
int mb;
};
int main()
{
test t(666);
t.show();
return 0;
}
输出结果:
-858993460 666
按照成员变量在类中定义的顺序,先初始化ma,再初始化mb。
初始化ma时,mb未被初始化,ma被mb中的未知数初始化,值为-858993460。
初始化mb时,mb被a初始化,值为666
总结
在C++中,如果需要在构造函数中初始化成员变量,可以在初始化列表中进行初始化。从语义上来说,初始化列表中对成员变量赋值叫初始化,函数体中对对象赋值叫赋值。在初始化列表中初始化成员变量,需要注意成员变量的定义顺序。