C++ this与常成员函数
在普通类成员函数的参数表后面(花括号前面)加上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() 错 }
常函数和非常函数可以构成函数的重载