一. 再看构造函数
我们之前已经了解了构造函数的基本内容,那么这里我们将深入认识构造函数。
1.函数体内赋初值
class Date
{
public:
Date(int year, int month, int day)
{
_year = year;
_month = month;
_day = day;
//可以进行多次赋值,但一般不这么做
_year = 1;
}
private:
int _year;
int _month;
int _day;
};
首先,对于构造函数体内的赋值我们不能称之为初始化。首先我们要理解:初始化只能初始化一次,而构造函数体内可以多次赋值。那么对象成员变量的初始化是在什么时候进行的呢?这就要接下来要介绍的初始化列表要做的事了。
2.初始化列表
初始化列表是以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括号中的初始值或表达式。其形式如下:
class Date
{
public:
Date(int year = 0, int month = 1, int day = 1)
:_year(year)
,_month(month)
{
_day = day;
}
private:
int _year;
int _month;
int _day;
};
几点注意
- 每个成员变量在初始化列表中只能出现一次(初始化只能初始化一次)
- 类中包含以下成员,必须放在初始化列表位置进行初始化:
(1)const成员变量:由于const变量初始化之后就不能更改,因此需在初始化列表进行初始化。
(2)引用成员变量:引用成员变量只能作为一个变量的引用,一旦初始化,就不能再作为其他变量的引用,因此引用变量也只能再初始化列表初始化。
(3)自定义类型成员变量(没有默认构造函数情况下):由于没有默认构造函数时,自定义类型变量是不能初始化的,此时程序也无法编译,因此没有默认构造函数的自定义类型成员变量必须在初始化列表进行初始化。
class B
{
public:
B(int i)
:_i(i)
{
}
private:
int _i;
};
class A
{
public:
A(int a, int& b, int bb)
:_a(a)
,_b(b)