1、常函数介绍

1.1、什么是常函数

(1)常函数的定义:类的成员函数对类中任何成员不作修改而只能作访问的函数;简单来说,就是调用类的成员函数不会对类做任何修改;
(2)常函数的实现:常函数是依靠const关键字实现的,具体是在类中声明成员函数和实现成员函数时都用const关键字去修饰;

1.2、为什么需要常函数

(1)常函数是为了使用类的时候更安全。比如:有的成员函数只需要返回类的某些成员变量的值而不需要修改,就可以把这种成员函数定义成常函数,从语法上保证成员函数中不会修改;
(2)在C++项目的开发中,定义类(程序员A)和使用类(程序员B)的很可能是两个程序员,所以程序员之间约定一些规则。比如程序员B使用程序员A的定义的类,当程序员B看到类的成员函数被const修饰,就知道这是个常函数,调用这个成员函数不会修改对象的数据,可以放心使用;

1.3、使用常函数的好处

(1)首先要知道常函数是C++语言提供的一种机制,用来保证成员函数不会修改类的成员;但是就算C++不提供常函数机制,程序员也同样可以实现常函数的效果,只要程序员不在成员函数里修改类的成员即可;
(2)如果不使用常函数机制,那么就要靠程序员自己保证不在成员函数中修改类的成员变量。靠程序员去保证是不靠谱的,尤其是在大型程序中,所以常函数机制可以强制保证成员函数不会去修改成员变量;
(3)常函数可以让使用类的程序员明确知道调用成员函数不会修改类的成员变量。就和C语言用const去修饰函数的传参一样,明确表示函数不会修改传进来的参数;

2、C++中的const关键字

(1)const关键字在C语言中就有,C++兼容C,所以C中const的用法C++中全都支持,参考博客:《const关键字与指针》;
(2)const修饰引用,主要用于函数传参,限制函数内部对实参进行修改;
(3)const修饰成员函数(常函数),限制成员函数在内部修改成员变量;

3、mutable关键字

(1)mutable的作用是突破const限制,有点和const的作用反着干的意思:const修饰成员函数让成员函数不能在内部修改成员变量,而mutable修饰成员变量,让常函数在内部又可以修改mutable修改的成员变量;
(2)const和mutable关键字,体现了C++语言给程序员预留了相当大的灵活度,程序员既可以用const去实现常函数,又可以用mutable去给某些成员变量特殊性,让常函数在内部可以修改用mutable修饰的成员变量;

4、示例代码

4.1、person.hpp

#ifndef PERSON_HPP
#define PERSON_HPP#include <string>
using namespace std;namespace MAN{class Person{public:int age;//获取姓名,用const修饰成常函数,表示内部不会修改成员变量string getName(void) const; //构造函数Person(){};Person(string myname){this->name=myname; this->getNameCnt=0;};private:string name;    //人的名字,不希望被修改mutable int getNameCnt; //名字被查询的次数};}
#endif // PERSON_HPP

4.2、person.cpp

#include "person.hpp"
#include <iostream>using namespace std;string MAN::Person::getName(void) const
{//因为getNameCnt变量被mutable修饰,所以这里才可以修改 this->getNameCnt++;   cout << "getNameCnt=" << this->getNameCnt << endl;return this->name;
}

4.3、main.cpp

#include <iostream>
#include "person.hpp"using namespace std;
using namespace MAN;int main()
{//初始化name为linuxPerson p1("linux");cout << "p1.name=" << p1.getName() << endl;cout << "p1.name=" << p1.getName() << endl;cout << "p1.name=" << p1.getName() << endl;return 0;
}

4.4、代码执行结果

root@ubuntu:# ./app
getNameCnt=1
p1.name=linux
getNameCnt=2
p1.name=linux
getNameCnt=3
p1.name=linux

4.5、代码分析

(1)Person类的getName成员函数被const修饰成常函数,但是getName函数在内部修改了getNameCnt成员变量,不是严格意义上的常函数;
(2)getNameCnt成员变量可以在常函数中被修改是因为用mutable修饰,突破了常函数的限制;
总结:C++的语法很灵活,像const和mutable几乎就是相反的两个特性,这些特性可以让程序员写出很多高效的代码,但同时也增加了学习C++语言的难度,如果没有理解这些语言特性就很可能看C++代码就看得云里雾里的;

5、推荐

我会在C++专栏持续根据更新C++相关的知识点,这里也给大家推荐一款学习C++的神器,我也是在用这一款神器在学习C++。
链接:学习神器跳转
如果你是想入门C++这门语言或者是找C++岗位的工作,都推荐你试试这个网站,里面有针对C++知识点的选择题、编程题,更有C++岗位的面试题

【C++入门】const和mutable关键字、常函数介绍相关推荐

  1. const和mutable关键字

    const修饰变量表示改变量内容不可修改,在类中,const还可以修饰成员函数,修饰成员函数后就不可以更改成员变量了. 可以看出,this指针是const*const类型,既不可以修改其内容,也不能修 ...

  2. 【C/C++ 关键字 存储类说明符】C/C++ 的mutable 关键字 忽略对该数据成员的常量性检查在const函数中修改变量值

    这里写目录标题 1. 引言 1.1 mutable关键字的简介 2. mutable关键字的设计意图 (The Design Intent of the mutable Keyword) 2.1 为什 ...

  3. 为什么用const保护了成员变量,还要再定义一个mutable关键字来突破const的封锁线?

    为什么用const保护了成员变量,还要再定义一个mutable关键字来突破const的封锁线? 保护类的成员变量不在成员函数中被修改,是为了保证模型的逻辑正确,通过用const关键字来避免在函数中错误 ...

  4. C++基础知识(常函数和常对象)

    1.常函数  void func()  const {}  常函数 2.常函数  修饰是 this指针  const Type * const this 3.常函数  不能修饰this指针指向的值 4 ...

  5. C++(常函数、常对象)

    常函数.常对象 首先明确: 常函数不能修改成员变量(可以调用,不能修改) 想要修改成员变量,必须在成员变量前加mutable关键字 常对象只能调用常函数,但是普通对象既可以调用普通函数也可以调用常函数 ...

  6. C++中的const成员函数介绍

     List { 02 private: 03      Node * p_head; 04      int length; 05      -- 06 Public: 07      int Get ...

  7. C++常函数的用法详解

    C++常成员函数用法 1.在一个普通成员函数后面加上const修饰,就是常成员函数 返回值 函数名( 形参表 )const {函数体} 注意: 普通成员函数才有常函数.C++中构造函数,静态成员函数, ...

  8. swift1.2语言函数和闭包函数介绍

    swift1.2语言函数和闭包函数介绍 在编程中,随着处理问题的越来越复杂,代码量飞速增加.其中,大量的代码往往相互重复或者近似重复.如果不采有效方式加以解决,代码将很难维护. swift1.2语言函 ...

  9. 除了允许变量被const函数修改之外,'mutable'关键字是否有任何其他用途?

    前段时间我遇到了一些用<code>mutable关键字标记类的成员变量的代码. 据我所知,它只是允许你修改const方法中的变量: class Foo { private: mutable ...

最新文章

  1. 漫画:小白为了面试如何刷题?(呕心沥血算法指导篇)
  2. 阿里某员工哀叹:头条的文档太混乱!阿里的文档读起来舒服!
  3. 我的配置(vc可以禁止控制台输出)
  4. Java 异常处理的误区和经验总结
  5. 蒙特卡洛梯度估计方法(MCGE)简述
  6. 经典C语言程序100例之七一
  7. springboot @RequestBody 接收字符串
  8. sed行首行尾添加字符
  9. 跳转到_301跳转常见问题汇总
  10. vscode插件开发总结
  11. CSDN如何获得积分?
  12. Q 语言 -- 赋值表达式
  13. WordPress首页上设置倒计时
  14. Kali Linux 安装网易云音乐打不开的解决方法
  15. HTML <blockquote> 标签
  16. 百度BAE部署微信开发环境
  17. Python3.7入门什么Bug?Bug最基本的调试Debug
  18. 动环监控系统的服务器配置,动环监控系统服务器维护
  19. java多页码分页_对页码进行分页
  20. Java条形码生成-Barcode4j

热门文章

  1. 项目二 管理与维护Linux系统
  2. Symbian进程间通信
  3. 树莓派造服务器(三):内网穿透方案
  4. 离线数据分析平台实战驴妈妈项目实战(完整)
  5. iOS 视屏播放软件(AVPlayer)
  6. 天猫商城推广专员个人简历模板
  7. CRC-16 Modbus代码
  8. 路径规划中常用的地图结构
  9. 服务器框架语言,Perfect:Swift 语言服务器端软件框架简介
  10. 【storybook】你需要一款能在独立环境下开发组件并生成可视化控件文档的框架吗?(二)