初始化列表
对类的初始化有2种方法,一种是在构造函数中一次定义,另外一种就是初始化列表。
2种方法总的来说还是,初始化列表较为高
效,而且有3种情况必须放在初始化列表中
分别为:
• 常量成员,因为常量只能初始化不能赋值,所以必须放在初始化列表里面
• 引用类型,引用必须在定义的时候初始化,并且不能重新赋值,所以也要写在初始化列表里面
• 没有默认构造函数的类类型,因为使用初始化列表可以不必调用默认构造函数来初始化,
而是直接调用拷贝构造函数初始化。
下来看看初始化列表的例子:
# define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<windows.h>
using namespace std;
class Time
{
public:
Time()
{
cout << "Time()" << endl;
_hour = 0;
_minute = 0;
_second = 0;
}
Time(const Time& t)
{
cout << "Time (const Time& t)" << endl;
_hour = t._hour;
_minute = t._minute;
_second = t._second;
}
private:
int _hour;
int _minute;
int _second;
};
class Date
{
public:
//EXP1
Date(int year, int month, int day,Time& t)
{
cout << "Date()- 非初始化列表 " << endl;
_year = year;
_month = month;
_day = day;
_t = t;
}
//EXP2
Date(int year, int month, int day, Time& t)
: _year(year)
, _month(month)
, _day(day)
, _t(t)
{
cout << "Date ()- 初始化列表 " << endl;
}
private:
int _year; // 年
int _month; // 月
int _day; // 日
Time _t; // 时间
};
void Test()
{
Time t1;
Date d1(2015, 4, 29, t1);
}
int main()
{
Test();
system("pause");
return 0;
}
现在上面Date类有2个构造函数分别是EXP1和EXP2分别让他们运行可以发现都可以让程序跑过去,
初始化列表初始化和普通初始化具有一定的优势的~(这里一定先注释掉另外一个)。
初始化列表和非初始化列表效率是不同的,一般是初始化列表高一点,具体为什么初始化列表的效率高呢?
首先如果你是非初始化列表的步骤是什么? 如果你是一个自定义类型,在参数的时候调用一次构造函数,然后在下面赋值的时候调用
拷贝构造函数,这样就是构造+拷贝构造,而初始化列表是直接把参数附进来也就是一次性的构造就结束了.