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;
}

运行结果:

总结:

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

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

相关推荐
辞旧 lekkk10 分钟前
【Redis初阶】常见数据类型
开发语言·数据库·c++·redis·学习·缓存·bootstrap
帅次42 分钟前
Kotlin 与 Java 互操作:混合工程里的平台类型与 API 边界
java·开发语言·kotlin·suspend·nullable
六点_dn43 分钟前
Linux学习笔记-printf命令
linux·运维·算法
遥感知识服务2 小时前
Sentinel-1 + DEM + FwDET + 随机森林:从快速水深初估到多因子误差修正
算法·随机森林·sentinel
来一碗刘肉面2 小时前
顺序表与链表的比较
数据结构·算法·链表
alphaTao2 小时前
LeetCode 每日一题 2026/7/13-2026/7/19
算法·leetcode
nnerddboy2 小时前
脑电信号处理实战 03 | 运动想象脑机接口入门:ERD/ERS、CSP 空间滤波与左右拳想象解码
算法·信号处理
dtq04242 小时前
C语言-结构体详解
c语言·开发语言·学习
梅雅达编程笔记3 小时前
编程启蒙|Scratch 转 Python 系列第9天:字典/哈希表积木双向对照(AI大模型参数配置表实战)
开发语言·人工智能·python·numpy·pandas
持力行3 小时前
C++与Java变量声明、定义及内存分配的核心区别
java·开发语言·c++