1、常函数介绍
1.1、什么是常函数
1.2、为什么需要常函数
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关键字
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
错误展示:
如果没有 mutable 修饰,则error: increment of member ‘MAN::Person::getNameCnt’ in read-only object

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/64520.html