在普通类成员函数的参数表后面(花括号前面)加上const,这个成员函数就是常成员函数
格式:返回类型 函数名(参数表) const {函数体}
常成员函数中的this指针是一个常量指针,一般不能在常成员函数中修改成员变量值
#include <iostream>
#include<string>
using namespace std;
class A {
public:
A(int data):m_data(data){}
void print (void)const { //常成员函数,const修饰的是函数内的this指针
//在这个函数内this指针是常量指针,所以一般不能在这个函数内修改成员变量值
cout << m_data << endl;
m_xx = 99; //由于mutable,所以可以修改
cout << m_xx << endl;
//int* p=const_cast<int*>(&m_spec);//非要修改变量值,先去常转换【方式一】
//*p = 200;
const_cast<A*>(this)->m_spec = 200; //给this指针去常
cout << m_spec << endl;
}
private:
int m_data;
int m_spec;
mutable int m_xx;//mutable不受const属性的影响,任何时候都可以修改
//mutable的中文意思是“可变的,易变的”
};
int main()
{
A a(100);
a.print();
return 0;
}
注意:权限
#include <iostream>
#include<string>
using namespace std;
class A {
public:
void func1(void)const{ //常函数
cout << "常函数" << endl;
}
void func2(void) {
cout << "非常函数" << endl;
}
};
int main()
{
A a; //非常对象
const A b; //常对象
a.func1(); //a的地址给const this时,是缩小权限,所以合法
a.func2();
//非常对象:非常函数和常函数都可以调用
b.func1();
//b.func2(); 错,因为b具有const,而func2中的this没有const,所以b的地址给this时,是扩大权限,非常危险,不合法
//常对象:只能调用常函数,不能调用非常函数
//错误原因:常对象的常指针this,传给非常函数的非常指针this,扩大的指针的权限,所以不行
const A* p;
//p->func2() 错
const A& aa;
//aa.func2() 错
}
常函数和非常函数可以构成函数的重载