C++ 成员初始化列表

如果数据成员是常量或者引用的情况:

1.常量和引用不可以在构造函数中进行赋值:
cpp 复制代码
#include<iostream>
using namespace std;
class A
{
public:
	A(int i = 0)
	{
		m_i = 10;
		m_j = 30;  //error 这一句代码叫做赋初值
		m_k = m_i;  //error
	}
private:
	int m_i;//变量
	const int m_j;//常量
	int& m_k;//引用
};
2.常量也不可以在类的数据成员定义时去赋值:
cpp 复制代码
#include<iostream>
using namespace std;
class A
{
public:
	A(int i = 0)
	{
		m_i = 10;
	}
	const int &GetJ()
	{
		return m_j;
	}
private:
	int m_i;//变量
	const int m_j=30;//常量
};
int main()
{
	A aa;
	cout << aa.GetJ() << endl;
	return 0;
}

这样是错误的,但是在高版本的编译器可以运行成功输出m_j的值,但是低版本的编译器不能运行。

3.常量必须在成员初始化列表(冒号语法)进行初始化(赋值)
cpp 复制代码
#include<iostream>
using namespace std;
class A
{
public:
	A(int i = 0):m_j(50)//这一句代码叫做初始化,成员初始化列表
	{
		m_i = 10;
	}
	const int &GetJ()
	{
		return m_j;
	}
private:
	int m_i;//变量
	const int m_j;//常量
};
int main()
{
	A aa;
	cout << aa.GetJ() << endl;
	return 0;
}

运行结果:

4.引用必须在成员初始化列表(冒号语法)进行初始化(赋值)
cpp 复制代码
#include<iostream>
using namespace std;
class A
{
public:
	A(int i = 0):m_j(50),m_k(m_i)
	{
		m_i = 10;
	}
	const int &GetJ()
	{
		return m_j;
	}	
	const int &GetK()
	{
		return m_k;
	}
private:
	int m_i;//变量
	const int m_j;//常量
	int& m_k;//引用
};
int main()
{
	A aa;
	cout << aa.GetJ() << endl;
	cout << aa.GetK() << endl;
	return 0;
}

运行结果:

总结:

成员初始化列表是为了解决类成员的初始化困惑。

数据成员是常量或者引用的时候必须要初始化,在普通函数中要在声明的时候初始化,在类中要在成员初始化列表进行初始化。

相关推荐
dear_bi_MyOnly3 小时前
栈和队列:从原理到应用全解析
c语言·开发语言·c++·学习·分类
Want5953 小时前
Python大雪纷飞①
开发语言·python·数学建模
代钦塔拉3 小时前
【C++/Qt 进阶】设计模式系列(4):原型模式——用“克隆“代替“重新构造“
c++·qt·设计模式
yujunl4 小时前
重写了一个BOM查询的脚本
开发语言
事圆则缓4 小时前
Kotlin 集合与序列:给页面一份清楚的数据
开发语言·windows·kotlin
事圆则缓4 小时前
Kotlin 异步与并发:从一次搜索请求走到状态流
android·开发语言·kotlin
从小白到软工4 小时前
4-3 项目-学生成绩管理系统(上)
c语言·开发语言·数据结构·经验分享·ai编程
悠仁さん4 小时前
非类型模板参数的特化与偏特化
java·数据结构·算法