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

Posted 正在起飞的蜗牛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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++代码就看得云里雾里的;

5、推荐

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

以上是关于C++入门const和mutable关键字常函数介绍的主要内容,如果未能解决你的问题,请参考以下文章

c++ const修饰成员函数

深入理解C++中的mutable关键字

C++中如何可以修改const函数内的成员变量的值?

mutable关键字

转C++ const成员变量和成员函数(常成员函数)

常函数