【深入理解】初始化列表

初始化列表用于成员变量的定义阶段初始化,特别是适用于const对象、引用对象以及无默认构造函数的类型。初始化顺序遵循成员变量的声明顺序,而非初始化列表的顺序。这在多层嵌套或依赖初始化的情况下需要注意,以避免错误的初始化顺序导致的问题。

目录

       一、什么是初始化列表?

        二、初始化列表长啥样?

        三、初始化列表的特性

        1、由于是在定义阶段进行的初始化,所以,只能在定义阶段进行的初始化类型便只能在初始化列表中进行初始化。

        2、初始化顺序不是跟着初始化列表走的,而是跟着类中成员变量的声明顺序进行的初始化:


     一、什么是初始化列表?

        初始化列表,成员变量初始化的地方,只有在这里进行的操作才能叫做初始化。

        之前学的浅显的类似于链表阶段的Init()的构造函数是相当于用了赋值操作在函数体内进行的对变量的copy,而初始化列表是在定义阶段进行的初始化。

        二、初始化列表长啥样?

// 初始化列表
Date::Date(int year, int month, int day)
	:_year(year)
	, _month(month)
	, _day(day)
{}

        仍然以Date类进行学习,以冒号 ":" 开始进行第一个成员变量的初始化操作,以逗号 "," 分隔接下来剩余的成员变量,最后一个不加分号,每个成员变量后面跟着用括号括起来的用来进行初始化操作的初始值或者表达式,这就是初始化列表的模样。

        很像拷贝构造的样子。

        三、初始化列表的特性

        1、由于是在定义阶段进行的初始化,所以,只能在定义阶段进行的初始化类型便只能在初始化列表中进行初始化。

        ①const对象

        ②引用对象

        ③无默认构造函数的自定义类型

        2、初始化顺序不是跟着初始化列表走的,而是跟着类中成员变量的声明顺序进行的初始化:

        比如:

class Date
{
private:
	int _year;
	int _month;
	int _day;
};

        在Date类中就是按照年/月/日的顺序进行 初始化,所以如果在初始化列表时不是年/月/日的顺序的话,会造成误解,如果是在其他类中,会造成更加严重的影响:

 代码以供测试:

class A
{
public:
	A(int a)
		:_a1(a)
		, _a2(_a1)
	{}
private:
	int _a2;
	int _a1;
};

int main()
{
	A a(1);

	return 0;
}

        从中可以清晰地看出,类A的初始化顺序应该是_a2, _a1,但是初始化列表却写成了先初始化_a1, _a2,所以导致了将随机值初始化给了_a2。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值