一:为什么使用初始化列表比较高效?
答:因为在初始化列表中对成员变量初始化,是直接调用成员变量的拷贝构造函数对其初始化;
而在构造函数体内对成员变量初始化;是先在进入函数之前调用成员变量自身的默认构造函数,创建一个真正成员变量对象,然后在函数体内调用成员变量对象的赋值运算符重载函数,给对象赋值;
代码:
#include<iostream>
using namespace std;
class Time
{
public:
Time()//默认构造函数
{
cout<<"time的默认构造函数"<<endl;
_hour=0;
_min=0;
_second=0;
}
Time(const Time& t)//拷贝构造函数
{
cout<<"time的拷贝构造函数"<<endl;
_hour=t._hour;
_min=t._min;
_second=t._second;
}
Time& operator=(const Time &t)//赋值运算符重载
{
cout<<"time的赋值运算符重载"<<endl;
if (this!=&t)
{
_hour=t._hour;
_min=t._min;
_second=t._second;
}
return *this;
}
public:
int _hour;
int _min;
int _second;
};
class Date
{
public:
//在函数体内初始化
Date(int year,int month,int day,const Time& t)
{
cout<<"data的构造函数"<<endl;
_day=day;
_month=month;
_year=year;
_t=t;
}
//在初始化列表初始化
Date(int year,int month,int day,const Time& t)
:_year(year)
,_month(month)
,_day(day)
,_t(t)
{
cout<<"data的构造函数"<<endl;
}
public:
int _year;
int _month;

Time _t;
};
int main()
{
Time t;
Date d1(2007,6,7,t);
return 0;
}
运行结果:
//在函数体内初始化
//在初始化列表初始化
二、必须在初始化列表中初始化的成员变量:
(1)常量成员变量(常量创建时必须初始化)
(2)引用类型成员变量(引用创建时必须初始化)
(3)没有缺省函数类型的成员变量;
解释(3):默认构造函数又叫缺省构造函数,缺省构造函数包括无参构造函数和全缺省构造函数;
当一个类没有缺省构造函数时,此时这个类的对象作为另一个类的成员变量,当没有对这个成员变量
在初始化列表中初始化时,这个成员变量会先调用自身默认构造函数创建真正的对象,然后在函数内调用自己的赋值运算符对自己赋值;
三、初始化列表初始化成员变量的顺序
在初始化列表中,成员变量按照声明的顺序依次初始化,而不按照初始化列表的出现的顺序
代码:
#include<iostream>
using namespace std;
class Date
{
public:
Date(int x)
:_day(x)
,_month(_day)
,_year(_month)
{}
void Printf()
{
cout<<_year<<"-"<<_month<<"-"<<_day<<endl;
}
private:
int _year;
int _month;
int _day;
};
int main()
{
Date d(3);
d.Printf();
return 0;
}
结果: