再探“构造函数”

一. 初始化列表

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 何时必须使用初始化列表

有三种情况,必须使用初始化列表:

  1. 没有默认构造的类类型成员变量
  2. 引用成员变量
  3. 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:
	
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值