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() 错 }
常函数和非常函数可以构成函数的重载
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)