构造函数和初始化列表的关系
1构造函数
除了有函数名 函数参数 函数体 还可以有初始化列表。
2初始化列表
是以:开头,后跟一系列以逗号分割的初始化字符段。
1关系
构造函数可以使用初始化列表 也可以不使用初始化列表(有些特殊场景下必须使用初始化列表)
2区别
以前认为构造函数是给对象进行初始化的,其实严格意义上函数体内的语句,只能叫做赋初值,而初始化列表才能叫做真正的初始化。
3初始化
是在一个变量定义的时候赋予的值才叫初始化。
2必须使用初始化列表的三种情况
1、引用成员变量
因为引用必须在定义的时候初始化,而构造函数体中的语句是赋值,所以应该使用初始化列表初始化
2、const修饰的成员变量
因为const修饰的成员变量也必须在定义的时候初始化,所以必须使用初始化列表
3、没有默认构造的自定义类型成员变量
因为使用构造函数一定不可避免的会调用自定义类型成员变量的默认构造,然而使用初始化列表可以避免使用默认构造函数,直接调用该成员变量的拷贝构造
class Time //声明一个Time类,类中有三个成员变量,和一个有参构造函数
{
public:Time(int hour, int minuter, int second, int day){_hour = hour;_minuter = minuter;_second = second;}private:int _hour;int _minuter;int _second;
};//声明一个Date类,类中有一个int类型成员变量、一个引用、一个const修饰、一个自定义类型
class Date
{
public: Date(int year, int month, int day, Time& t):_year(year), _month(month), _day(day), _t(t) //初始化列表,_t(t)这个调用的是拷贝构造,为什么会调用拷贝构造,可以看本文【链接】{}private:int _year;int& _month; //引用const int _day; //const修饰Time _t; //没有默认构造的自定义类型
};int main()
{Time t(23, 43, 40); //实例化一个Time对象Date d(2023, 11, 14, t);return 0;
}
4初始化列表的好处
在没有默认构造的自定义类型成员变量的调用中,可以减少一次函数栈帧的调用
当有大量对象时,使用初始化链表的好处还是很多的,降低函数压栈带来的开销。
能用则用。