前面我们已经学习了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 常成员函数

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

  1. C++57个入门知识点_17 类的访问权限及C语言模拟类的封装(类的私有权限突破方法:编译期进行权限检查,运行期通过指针修改类的私有成员变量;利用函数指针对结构体中成员变量进行修改;CPU大小尾排列)

    接上篇:C++57个入门知识点_16 类的标准写法(类名.成员变量.成员函数及对象命名规则:成员变量一般为私有,成员函数为公有并暴露给外部使用成员变量:防止类过大,声明写在.h,实现写在.cpp,调用 ...

  2. C++57个入门知识点_50 菱形继承与虚继承(C++中语法允许多重继承造成菱形继承;会造成近亲结婚的问题;可以通过虚继承的方式解决;实际项目中不多用多重继承)

    上篇C++57个入门知识点_49 多重继承与组合(一个类同时具有多个类的属性的方法:多重继承或者组合:多重继承:一个类同时继承多个类:多重继承构造和析构的顺序与普通继承类似:组合:类中包含多个成员对象 ...

  3. 类的概念、成员函数的定义方式、类的访问控制和封装、类的大小、this指针

    文章目录 类的概念 struct class class和struct的区别是什么呢? 类中成员函数的两种定义方式 声明和定义都在类中 声明和定义分离 类的访问控制和封装 类的封装特性 类的大小 结构 ...

  4. 虚函数之定义一个基类Shape,在此基础上派生出Rectangle和Circle再使用Rectangle类创建一个派生类Square。

    定义一个基类Shape,在此基础上派生出Rectangle和Circle,二者都有getArea( )函数计算对象的面积,再使用Rectangle类创建一个派生类Square.将getArea()改造 ...

  5. python函数用于创建对象_Python-创建类并使用函数更改其对象值

    有人建议我把这个重新贴出来以便更清楚. 上完一节课,剩下的就不上这节课了.欢迎任何指导.我已经得出了这个问题的一部分,在那里我坚持要保持简短.我还附上了我的工作. 在下面的工作中,我希望能够创建一个包 ...

  6. java min 函数的使用方法_【Python】Java程序员学习Python(五)— 函数的定义和使用...

    不想做一个待宰的羔羊!!!!要自己变得强大.... 函数的定义和使用放在最前边还是有原因的,现在语言趋于通用,基本类型基本都是那些,重点还是学习对象的使用方法,而最根本的还是方法的使用,因此优先介绍, ...

  7. 面向对象、封装、private关键字、set和get方法、this关键字、构造方法、API

    文章目录 1. 类和对象 1.1 面向对象和面向过程编程思想 面向过程编程思想 面向对象编程思想 举例对比2种编程思想 1.2 类的概述 类的概述 类的组成 举例 小结 1.3 对象的概述 对象的概念 ...

  8. SQL SERVER 用户自定义函数如何定义.

    CREATE   FUNCTION     创建用户定义函数,它是返回值的已保存的   Transact-SQL   例程.用户定义函数不能用于执行一组修改全局数据库状态的操作.与系统函数一样,用户定 ...

  9. python函数的定义及使用

    一.函数的定义与使用 1)函数的定义: 1.函数是一种功能抽象, 是一段具有特定功能的.可重用的语句组,用函数名来表示并通过函数名完成功能调用.l 2.函数也可以看作是一段具有名字的子程序,可以在需要 ...

最新文章

  1. postmessage and sendmessage
  2. 《深入理解ES6》笔记——块级作用域绑定(1)
  3. JNI的一个简单实例
  4. ios 视频知识补充---分解LFLiveKit
  5. 关于文档的基本操作---ElasticSearch
  6. hornetq_Spring 3 HornetQ 2.1集成教程
  7. 随时随地查看业务数据,DataV移动端新功能上新
  8. spring 事务隔离级别和传播行为_Java工程师面试1000题146-Spring数据库事务传播属性和隔离级别...
  9. caffe 添加自定义层(custom layer)
  10. java中怎么打开标尺_PageOffice如何显示/隐藏Word文档中的标尺
  11. 将两个文件的路径作为参数传递给脚本_将Docker与pipeline一起使用
  12. 安捷伦频谱仪的使用方法图解_频谱仪的简单操作使用方法lbrack;1rsqb;
  13. 简单爬虫 爬取百度图片并批量重命名
  14. c语言 go to 用法,c语言中 go to语句的使用方法
  15. 【Adobe Illustrator 教程】3. 认识钢笔工具
  16. 计算机语言排行榜2015,2015年3月编程语言排行榜:F#排名达到11
  17. Apollo API网关 阿波罗
  18. kindle上查看微信读书的书籍
  19. 世界主要港口中英文对照表
  20. 算法之狄克斯特拉算法

热门文章

  1. 90后程序员已经出家了
  2. python批量重命名文件下所有文件
  3. 自媒体初创公司未来计划_技术与现实世界:4家正在改变室内设计未来的初创企业...
  4. Windows10下 :TNS-01190错误
  5. Vuex的使用(五)——mapGetters的定义和用法
  6. #如何创新玩转HarmonyOS开发#厚积薄发
  7. 艺术海报,纸上的舞台--江苏
  8. linux ant 编译,【Jenkins】linux下Jenkins集成ant进行编译并发送结果
  9. 微信小程序星星评分组件
  10. 使用PyTorch实现对花朵的分类