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

运行结果:

总结:

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

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

相关推荐
吃好睡好便好6 分钟前
MATLAB仿真框图2
开发语言·matlab·仿真·simulink
码完就睡16 分钟前
数据结构——树、二叉树基础概念
数据结构·算法
豆沙沙包?26 分钟前
C++-程序的内存模型(P84-P88)
java·jvm·c++
jufeng130728 分钟前
【系列:MiniKV 原理剖析 · 第 8 篇(完结篇)】
linux·c++·log4j·软件工程·makefile
VL——MOESR1 小时前
【LuoguP1967】货车运输【生成树】【倍增】
c++·算法·题解·倍增·生成树
手写码匠1 小时前
华为云Flexus+DeepSeek征文|Agent 记忆系统实战:用 DeepSeek-R1/V3 + Dify 会话变量打造跨会话长期记忆
人工智能·深度学习·算法·aigc
小当家.1051 小时前
MCP 协议深度解析:AI 领域的 USB-C 接口
开发语言·人工智能·agent·tool·mcp
草莓熊Lotso1 小时前
【Linux网络】从0手写Reactor反应堆(二):完善核心细节——ET非阻塞读写、分层架构与回调机制
linux·运维·服务器·网络·c++·tcp/ip·架构
accept 99%1 小时前
python版提取 PDF 的常用第三方库与工具
开发语言·python·pdf
lzhdim1 小时前
C# 通过 Windows API 实现进程内存读写操作
开发语言·windows·c#