c++中类的数据成员初始化次序

3 篇文章 0 订阅

c++中类的数据成员初始化次序

今天学了一个知识点,感觉还挺重要的,就是当一个类中的某个数据成员同时拥有就地初始化、构造函数初始化列表和构造函数函数体里的赋值,那么它会先执行哪个?最后生效的又是哪个呢?
根据老师的讲解,数据成员的初始化次序依次为:
就地初始化 > 构造函数的初始化列表 >构造函数里的赋值(严格意义上不能成为初始化)
而当三种初始化方式都有时,构造函的函数体里的赋值肯定执行,并且生效,但是就地初始化和构造函数初始化列表的执行情况是怎样呢?写段代码测试一下

#include<iostream>
#include<cstdio>

using namespace std;

int n = 0;
class STU{
private:
	int id = ++n;		//就地初始化 
public:
	STU(){};		 
	STU(int id):id(id){	//初始化列表 
	}
	int getId(){
		return id;
	}
	~STU(){
	}
};

int main(){
	cout << n << endl;		
	STU s1{};	//调用无参构造
	cout << "n = " << n << ",id = " << s1.getId()<< endl;	
	STU s2{10};	
	cout << "n = " << n << ",id = " << s2.getId()<< endl;
	
	return 0;
} 

运行结果为:
0
n = 1,id = 1
n = 1,id = 10
可以看出,当调用无参构造时,id执行了就地初始化,而当调有参构造函数时,id没有执行就地初始化,而是直接执行了构造函数初始化列表。
所以当一个数据成员同时拥有就地初始化和初始化列表时,它会忽略就地初始化而执行构造函数初始化列表。
如果到代码中的有参构造函数的函数体中加上 this->id = 20; ,运行结果会变为:
0
n = 1,id = 1
n = 1,id = 20
可以看到赋值把初始化列表给id初始化的值覆盖掉了,这里在情理之中。

参考文献

中国大学mooc中c++程序设计(面向对象进阶)中4.2 成员的初始化次序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值