目录
前言
哈喽,大家好,本章是类和对象的下篇,学完这一篇,那我们关于类和对象的概念就掌握的差不多啦,那话不多说,让我们快点开始吧。
提示:以下是本篇文章正文内容,下面案例可供参考
一、初始化列表
1.再谈构造函数
上一篇我们讲到了,在创建对象时,编译器通过调用构造函数,给成员变量赋初值。但你可能不知道,除了使用构造函数,还有其他途径可以对成员变量进行初始化,那就是初始化列表,它和构造函数有什么共同点和区别呢,让我们一起来看看吧。
2.初始化列表特征
初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括号中的初始值或表达式。卸载构造函数的参数和大括号之间。
public:
Date(int year, int month, int day)
: _year(year)
, _month(month)
, _day(day)
{}
private:
int _year;
int _month;
int _day;
};
注意:
1.每个成员变量在初始化列表中只能出现一次(初始化只能进行一次)
2.类中包含以下成员,必须放到初始化列表进行初始化
(1)引用成员变量
(2)const成员变量
(3)自定义类型成员变量(该类没有默认的构造函数)
这三种类型有个共同点,都需要在定义时进行初始化(自定义类型变量需要调用构造函数)。我们可以理解为类中的成员变量是在初始化列表中完成定义的,所以以上三种成员必须放到列表中进行初始化,来保证定义和初始化同时进行。
3.尽量使用初始化列表
在类中,我们想要给成员变量赋初值,用构造函数和初始化列表都能实现。但最好用初始化列表,因为初始化列表在某些情况下可以节约时间。
(1)对于内置类型,使用初始化列表和构造函数没有什么区别
(2)对于自定义类型,使用初始化列表效率更高。
class Time
{
public:
Time(int hour = 0)
:_hour(hour)
{
cout << "Time()" << endl;
}
private:
int _hour;
};
class Date
{
public:
// 自定义类型,使用初始化列表 -》 构造函数
/*Date(int day, int hour)
:_t(hour)
{}*/
// 自定义类型,不使用初始化列表 -》 构造函数 +