C++57个入门知识点_40 常成员函数(用于定义不可修改类内部成员变量的函数,一般用来修饰Get函数;常成员函数this指针:const T* const;常成员函数内部变量修改方法:强转/关键字)

本文深入探讨C++中的常成员函数,解析其定义、作用及实现原理,并介绍如何在常成员函数中修改成员变量的方法。

前面我们已经学习了C++中重要的知识点,特别是虚函数可能会有些懵逼,但是需要我们在实践中不断的理解和尝试,写代码是进步最快的方式,接下来将会介绍一些简单但很重要的知识点,本篇介绍常成员函数。

总结:

1. 常成员函数: 用于在程序中定义不可修改内部成员变量的函数

  • 作用:无法修改数据成员,一般用来修饰Get的函数
  • 本质:this指针的类型:constT* const
  • 意义:让编译器提醒开发者该函数修改类的成员变量,用于const对象(引用或指针)

2. 编译器实现常成员函数原理
(1)普通的类成员函数this指针类型:T* const(表示该指针本身不能被修改)
(2)常成员函数this指针类型:const T* const(后面的const代表指针本身不能被修改,前面的const代表指向的内容不能被修改)

  • 表示该指针本身不能被修改
  • 表示指针指向的内容不能被修改

3. 常成员函数内部变量修改方法

  • 通过指针强转去除const属性
  • mutable关键字

在C++中其语法较为灵活,特别是指针可以说是杀手级的,允许你去改变进程中的任意一个内容,所以C++中尤其要做好检查。

1. 普通函数内部成员变量的可修改性

以下代码中int CInteger::GetNumber() {return m_nNumber;}作为获取变量的函数,其返回值我们是不希望被修改的,如何通过编译器来检查和实现m_nNumber不可被修改?

#include <iostream>

class CInteger
{
public:
	CInteger(int nNumber) {
		m_nNumber = nNumber;
	}

	int GetNumber();

	void SetNumber(int nNumber) {
		m_nNumber = nNumber;
	}

private:
	int m_nNumber;
};

int CInteger::GetNumber()
{
	m_nNumber = 1;
	return m_nNumber;
}

int main(int argc, char* argv[])
{
	CInteger i = 1;

	i.GetNumber();

	return 0;
}

2. 常成员函数

前面我们学过使用const修饰一个变量,可以将其变为常量例如const int n=1。参考C++57个入门知识点_02_const常量限制(解决C中define无法指明数据类型问题、常量一旦定义生命周期内不可修改、编译器在程序编译时期做的检查、编译时不确定的,才可以通过指针修改运行时的值)

const也是可以用来修饰函数,const int GetNumber() 代表返回值为一个常量,而int GetNumber() const修饰的函数,被称为 常成员函数

常成员函数: 用于在程序中定义不可修改内部变量的函数

  • 作用:无法修改数据成员,一般用来修饰Get的函数
  • 本质:this指针的类型:constT* const
  • 意义:让编译器提醒开发者该函数修改类的成员变量,用于const对象(引用或指针)

以下代码使用const修饰函数,在编译阶段实现内部不可以修改变量的限制

#include <iostream>

class CInteger
{
public:
	CInteger(int nNumber) {
		m_nNumber = nNumber;
	}
	int GetNumber() const;

	void SetNumber(int nNumber) {
		m_nNumber = nNumber;
	}

private:
	int m_nNumber;

};

int CInteger::GetNumber() const
{
	//Get函数作为获取变量的函数,返回值不能被修改
	m_nNumber = 1;
	return this->m_nNumber;
}

int main(int argc, char* argv[])
{
	CInteger i = 1;

	i.GetNumber();

	return 0;
}

运行结果:变量m_nNumber不可被修改
在这里插入图片描述

3. 编译器实现常成员函数原理

编译器如何在使用int GetNumber() const之后,智能的分辨出加了const后就不能修改函数内的变量。

const常成员函数,声明修改
(1)普通的类成员函数this指针类型:T* const(表示该指针本身不能被修改)
(2)常成员函数this指针类型:const T* const(后面的const代表指针本身不能被修改,前面的const代表指向的内容不能被修改)

  • 表示该指针本身不能被修改
  • 表示指针指向的内容不能被修改

(1)普通的成员函数的this指针

CInteger* const代表了指针本身不能被修改,前面已知类对象的this指针是不能被修改的
在这里插入图片描述
(2)常成员函数的this指针
常成员函数this指针类型:const T* const(后面的const代表指针本身不能被修改,前面的const代表指向的内容不能被修改)
在这里插入图片描述

4. 常成员函数内部成员变量的修改


通过欺骗编译器的方法去修改常成员函数内的变量,有以下两种方法:

(1)通过指针强转去除const属性

int CInteger::GetNumber() const
{
	CInteger* const p = (CInteger* const)this;
	p->m_nNumber = 134;
	return p->m_nNumber;
}

(2)mutable关键字

上述的方法比较挫,C++中提供了比较好的方法来修改常成员函数中常成员的值,只需要在成员变量前面加mutable

class CInteger
{
public:
	CInteger(int nNumber) {
		m_nNumber = nNumber;
	}

	int GetNumber() const;

	void SetNumber(int nNumber) {
		//this=&nNumber;
		m_nNumber = nNumber;
	}

private:
	mutable int m_nNumber;//如果想要在常成员函数内修改成员使用mutable int m_nNumber
};

int CInteger::GetNumber() const
{
	m_nNumber = 1;
	return m_nNumber;
}

5.学习视频地址:C++57个入门知识点_40 常成员函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十月旧城

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值