- 在C++中,为了禁止成员函数修改成员数据的值,可以将它设置为常成员函数
- 设置方法就是在函数体之前加上const关键字
classX{voidfunc(参数1, 参数2,...)const{}};#include<iostream>usingnamespacestd;classStudent{private:intage;string name;public:Student(intage,conststring&name){this->age=age;this->name=name;}voidwhoami(void)const{age++;// 引发报错cout<<"我是: "<<name<<" 我今年: "<<age<<endl;}};intmain(void){Students1(22,"张三");s1.whoami();return0;}- 常函数的实现本质:
- 常函数中的this指针是常指针,所以不能在常函数中修改成员变量
classA{public:voidprint(void)const{...}//编译前voidprint(constA*this){...}//编译后};- 常函数的使用注意事项:
- 常对象只能调用常函数,非常对象既可以调用非常函数 也可以调用常函数
- 函数名和形参表相同的成员函数,常版本和非常版本可以构成重载
- 常对象只能选择常版本
- 非常对象优先选择非常版本
- 被mutable修饰的成员可以常函数中修改
#include<iostream>usingnamespacestd;classA{public:A(intmm=0,intnn=0):m(mm),n(nn){}voidfun(void){//void func(A * this)cout<<__func__<<endl;}voidbar(void)const{cout<<__func__<<endl;}voidfun(void)const{//void func(const A *this)cout<<__func__<<"const"<<endl;m++;//n++;//语法错误}private:mutableintm;intn;};intmain(void){A a;a.fun();a.bar();constA b;//b.fun(); //语法错误b.bar();return0;}