一、再探构造函数
在之前的文章中我们大致将构造函数讲完了,但是还有一个比较重要的知识点当时没有讲到,因为如果把这部分内容加上去,会让前面的内容难度变得非常高,所以这部分内容放到这里来讲。
接下来进入今天的正题,我们今天要补充的内容就是构造函数中的'初始化列表',它可以帮我们对成员变量进行初始化,我们还是先来看看它的语法格式 (刚开始学可能看起来怪怪的,熟悉了就好了),如下:
class Date {
public:
//不使用初始化列表
Date(int year = 2025, int month = 1, int day = 1) {
_year = year;
_month = month;
_day = day;
}
//使用初始化列表
Date(int year = 2025, int month = 1, int day = 1):_year(year),_month(month),_day(day) {
//在花括号中 (函数体中) 可以正常执行其它代码,这里就不演示了
}
private:
int _year;
int _month;
int _day;
};
在上面的代码中,有两个构造函数,一个不使用初始化列表和一个使用了初始化列表,在这里它们的作用都是一样的,就是根据用户传来的年月日对当前对象进行初始化。
那么既然上面的代码中,无论是否使用了初始化列表,两个构造函数的作用都相同,而且这个初始化列表还这么丑,它到底有什么不同之处呢?接下来我们就正式介绍初始化列表。
初始化列表非常重要,有 3 类成员变量必须使用初始化列表进行初始化,如果不使用初始化列表就会报错,它们分别是 const 成员变量、引用成员变量以及自定义类型成员变量。那么为什么这 3 类成员变量就必须使用初始化列表进行初始化呢?
其中 const 成员变量以及引用成员变量比较特殊,它们都只能初始化一次,如果我们将其写在构造函数内部进行初始化会有一定的歧义,比如 const 成员变量只能初始化一次,往后这个成员变量的值就不能修改了,如果它在函数体出现两次,该选择哪个值作为它的结果。
而引用对象也是,只能初始化一次,往后只能修改引用对象的值,而不能修改引用对象的指向,如果在构造函数函数体中出现了两次,最终该选择哪个变量作为它的引用对象呢?我们来看如下伪代码:


