文章目录
一. 初始化列表
1.1 实现
在之前,我们了解了构造函数,它是用来初始化对象的,它是在函数体内(即在花括号里面)进行初始化的。
class Data
{
public:
Data(int year, int month, int day)
{
_year = year;
_month = month;
_day = day;
}
private:
int _year;
int _month;
int _day;
};
其实,初始化还有一种方法,叫做:初始化列表。它不在函数体里面,而是在花括号外面。
语法理解上,初始化列表可以认为是:每个成员变量定义初始化的地方。且每个成员变量在初始化列表中只能出现一次。
初始化列表的形式是什么?
以冒号
:
开始,以逗号,
分隔数据。每个成员变量后面有一个括号,括号里面是初始值/表达式。
class Data
{
public:
Data(int year, int month, int day)
:_year(year)
,_month(month)
,_day(_day)
{
}
private:
int _year;
int _month;
int _day;
};
- 初始化列表初始化的顺序:
按照类中声明的顺序来的(与在初始化列表中出现的先后顺序无关)
1.2 何时必须使用初始化列表
有三种情况,必须使用初始化列表:
- 没有默认构造的类类型成员变量
- 引用成员变量
- const成员变量
那为什么单单是这三个必须使用初始化列表呢?
引用必须在定义的时候就初始化,我们没有见过int a=9;int& b;
这种形式的吧,它只定义了b,但又没说b是谁的别名,这种形式是错误的,正确的是定义+初始化(说清它是谁的别名)int a = 9;int& b=a;
const变量是必须初始化的。const变量是不可以修改的,只有一次修改的机会,就是在定义,初始化的时候。const int j;
这种是会报错的,因为没有初始化。const int j = 2;
//没有默认构造的类类型成员变量
class Stack
{
};
class MyQueue
{
public:
//编译器默认生成的MyQueue默认构造函数调用了Stack的默认构造函数,完成了两个Stack类型的成员变量的初始化
//那如果Stack没有默认构造函数呢?就只能初始化列表了
MyQueue(int n = 90)
:_push(n)
, _pop(n)
{
}
private: