一、再谈构造函数
初始化列表
我们先从上一章的栈开始讲
Stack 不具备默认构造,Myqueue 也无法生成默认构造,那我们只能去显示的写构造
- 这个时候就需要用到我们的初始化列表
初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量" 后面跟一个放在括号中的初始值或表达式。
👇代码实现
class Date
{
public:
Date(int year, int month, int day)
: _year(year)
, _month(month)
, _day(day)
{
}
private:
int _year;
int _month;
int _day;
};
- 【注意】
- 每个成员变量在初始化列表中只能出现一次
- 类中包含以下成员,必须放在初始化列表位置进行初始化:
⭐引用成员变量
⭐const成员变量
⭐自定义类型成员(且该类没有默认构造函数时)
🔺所以对于第一个问题,我们就很好的解决了
//Stack 不具备默认构造, MyQueue 也无法生成默认构造
class MyQueue
{
public:
MyQueue(int n)
:_pushst(n)
,_popst(n)
,_size(0)
{
}
private:
//
Stack _pushst;
Stack _popst;
int _size;
};
但是有一个必须在初始化列表初始化:那就是const
-
因为const必须在定义的时候就初始化
-
相同的,引用在定义的时候初始化
⭐ 根据这个,我们可以得出以下结论
- 尽量使用初始化列表初始化,因为不管你是否使用初始化列表,对于自定义类型成员变量,一定会先使用初始化列表初始化。
class A
{
public:
A(int a)
:_a1(a)
,_a2(_a1)
{
}
void Print() {
cout<<_a1<<" "<<_a2<<endl;
}
private: