【C/C++】类成员进阶——类中常量成员const

创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡><)!!
主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!
c++系列专栏:C/C++零基础到精通

给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ

c语言内容:

专栏:c语言之路重点知识整合

【c语言】全部知识点总结


目录

  • 一、定义常量(构造函数初始化)
  • 二、常函数
    • 常函数中不能修改类中的成员属性
    • 常函数中不能调用一般函数(反过来可以):
    • 常函数和普通函数的区别
  • 三、常量指针升降级
  • 本文全部代码:

一、定义常量(构造函数初始化)

定义一个CTest类,使用const关键字定义常量m_b

class CTest
{		
public:
	int m_a;
	const int m_b;
	CTest() 
	{
		m_a = 1;
		m_b = 2;			//m_b常量  这里是赋值
	}
};

当我们像其余的变量一样在构造函数中给定初始值时,常量出现了报错:

【C/C++】类成员进阶——类中常量成员const_第1张图片

常量的特性是:定义就必须初始化,一旦初始化后就不能再进行修改

实际上,上面的方式在构造函数中并不是真正的初始化,而是对变量进行赋值

当类中有const类型的变量时,在定义的时候必须要初始化,
而这个初始化操作是在初始化参数列表中完成的,而构造函数的函数体代码中进行的操作严格来说是赋值,而并非初始化。
先执行初始化参数列表,在执行构造函数体中的代码。对于普通的变量来说也可在初始化参数列表中初始化。

初始化参数列表用来真正初始化对象中成员属性,构造参数列表后加冒号,多个成员属性用逗号分隔

像这样:

class CTest
{		
public:
	int m_a;
	const int m_b;
	//初始化参数列表:用来真正初始化对象中成员属性,构造参数列表后加冒号,多个成员属性用逗号分隔
	//使用圆括号做初始化,常量必须在这里初始化,对于变量来说无所谓
	CTest() : m_a(2),m_b(3)
	{
		m_a = 1;
		//m_b = 2;	//m_b常量  这里是赋值
	}
};

初始化参数列表初始化成员的顺序取决于:成员在类中声明的顺序


二、常函数

常函数:类中的成员函数参数列表后面有const修饰时,称之为常函数,其主要作用是为了能够保护类中的成员变量、限制修改。

定义常函数:

与其他的成员函数定义格式不同 ``常函数为: 返回类型 函数名 const {...}

	void fun(/* const CTest* const this */)const	//指向的值不能修改
	{
		cout << m_a << "    " << m_b << endl;
	}

常函数中不能修改类中的成员属性

常函数的特性:不能修改类中的非静态成员,因为const修饰this指针变为const 类* const this,也就是执行 this->变量=val操作是非法的,但可以查看成员变量。

对于静态成员属性不但能查看,也能对其修改,因为静态成员不是属于对象的,并不在const 约束范围内。

void fun(/* const CTest* const this */)const	//指向的值不能修改
	{
		cout << m_a << "    " << m_b << endl;
		m_a=10;	//变量也不能修改
			m_b=10;	//常量不能修改
			m_c = 20;	//在常函数中可以修改静态变量  因为m_c可以不使用this 指针调用
	}

如果要通过常函数对类成员属性进行修改,可以通过mutable关键字:

class CTest
{
	int m_a;
	mutable int m_b;
	void fun()const
	{
		//m_a = 10;	//非法
		m b = 20;	//合法
	}
};

常函数中不能调用一般函数(反过来可以):

	void fun(/* const CTest* const this */)const	//指向的值不能修改
	{
		fun2();			//不能调用普通函数
		funstatic();
	}
	void fun2()			//CTest* const this			指针安全级别降级 非法
	{
		fun();			//指针安全级别 升级
	}
	static void funstatic()
	{
		//静态中只能使用静态成员
		fun();	//error
		fun2();	//error
	}

常函数和普通函数的区别

  • 本质区别:常函数 this指针类型: const 类 * const this 普通函数:类 * const this

  • 常函数不能修改类中的成员属性,也不能调用一般函数 (反过来可以) 一般函数可以修改类成员变量 也可以调用常函数

这是因为常量指针升降级的问题:

三、常量指针升降级

指针的安全级别不能从高级降到低级,可以从安全级别低升级到高

	const int a = 1:
	int b = 20;
	
	const int* p1 = &a;
	int* p2 = &b;

p2 = p1:

指针的安全级别降级操作,不允许 错误:C2440 “=”: 无法从const int * 转换为 int *

p1 = p2

指针的安全级别升级操作,允许int* -> const int*

同理,常量对象也不能调用普通的成员函数,只能调用常函数。

本文全部代码:

#include 
#include 
using namespace std;
class CTest
{		
public:
	int m_a;
	const int m_b;
	static int m_c;
	//初始化参数列表:用来真正初始化对象中成员属性,构造参数列表后加冒号,多个成员属性用逗号分隔
	//使用圆括号做初始化,常量必须在这里初始化,对于变量来说无所谓

	CTest() : m_a(2),m_b(3)
	{
		m_a = 1;
		//m_b = 2;	//m_b常量  这里是赋值
	}

	//初始化参数列表初始化成员的顺序取决于:成员在类中声明的顺序


	//常函数和普通函数的区别
	/*
	1.本质区别:常函数 this指针类型: const 类 * const this  普通函数:类 * const this
	2.常函数不能修改类中的成员属性,也不能调用一般函数  (反过来可以)	一般函数可以修改类成员变量 也可以调用常函数
	*/

	//常函数
	void fun(/* const CTest* const this */)const	//指向的值不能修改
	{
		cout << m_a << "    " << m_b << endl;
		//m_a=10;	//变量也不能修改
		//m_b=10;	//常量不能修改
		m_c = 20;	//在常函数中可以修改静态变量  因为m_c可以不使用this 指针调用


		//mutable关键字:常函数中可以修改变量
		/*
		int* p=(int *)&this->m_a;
		*/
		//fun2();		//不能调用普通函数
		funstatic();
	}
	void fun2()	//CTest* const this			指针安全级别降级 非法
	{
		fun();			//指针安全级别 升级
	}
	static void funstatic()
	{
		//静态中只能使用静态成员
		//fun();	//error
		//fun2();	//error
	}
};

int CTest::m_c = 10;

int main()
{
	CTest tes;
	cout << tes.m_a << "    " << tes.m_b << endl;

	return 0;
}

大家的点赞、收藏、关注将是我更新的最大动力! 欢迎留言或私信建议或问题。
大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容!如果本文哪里有错误的地方还请大家多多指出(●'◡'●)

你可能感兴趣的:(C/C++,c语言,c++,开发语言,学习,笔记)