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

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为linux
    Person 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++代码就看得云里雾里的;

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

正在起飞的蜗牛

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

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

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

打赏作者

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

抵扣说明:

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

余额充值