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

运行结果:

总结:

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

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

相关推荐
0xDevNull3 小时前
Java反射机制深度解析:从原理到实战
java·开发语言·后端
小小亮013 小时前
Next.js基础
开发语言·前端·javascript
ALex_zry3 小时前
C++网络编程心跳机制与连接保活:长连接稳定性保障
开发语言·网络·c++
Amumu121384 小时前
Js:正则表达式(二)
开发语言·javascript·正则表达式
学嵌入式的小杨同学4 小时前
STM32 进阶封神之路(三十二):SPI 通信深度实战 —— 硬件 SPI 驱动 W25Q64 闪存(底层时序 + 寄存器配置 + 读写封装)
c++·stm32·单片机·嵌入式硬件·mcu·架构·硬件架构
米粒14 小时前
力扣算法刷题 Day 27
算法·leetcode·职场和发展
Sgf2274 小时前
ES8(ES2017)新特性完整指南
开发语言·javascript·ecmascript
好大哥呀5 小时前
C++ Web 编程
开发语言·前端·c++
ID_180079054735 小时前
小红书笔记评论 API,Python 调用示例与完整 JSON 返回参考
java·开发语言
Fuxiao___5 小时前
C 语言核心知识点讲义(循环 + 函数篇)
算法·c#