1.mutable 的核心用法
2.mutable 的使用限制
1.mutable 的核心用法
1).回顾:const成员函数的默认规则,类的const成员函数中,默认不能修改任何普通的成员变量
#include <iostream>#include <string>usingnamespacestd;classPerson{private:stringname;intaccess_count;// 访问计数:记录getName被调用的次数public:Person(stringn):name(n),access_count(0){}// const成员函数:默认不能修改成员变量stringgetName()const{access_count++;// 错误!const函数不能修改普通成员变量returnname;}};intmain(){constPersonp("Alice");cout<<p.getName()<<endl;return0;}
2).mutable的核心用法:豁免const函数的修改限制,给access_count加上mutable修饰后,就能在const成员函数中修改它
#include <iostream>#include <string>usingnamespacestd;classPerson{private:stringname;mutableintaccess_count;// mutable修饰:允许const函数修改public:Person(stringn):name(n),access_count(0){}// const成员函数:可以修改mutable变量stringgetName()const{access_count++;// 合法!mutable变量不受const限制cout<<"getName被调用了 "<<access_count<<" 次"<<endl;returnname;}// 获取访问计数(辅助函数)intgetCount()const{returnaccess_count;}};intmain(){constPersonp("Alice");// const对象,只能调用const成员函数cout<<p.getName()<<endl;// 输出:getName被调用了 1 次 → Alicecout<<p.getName()<<endl;// 输出:getName被调用了 2 次 → Alicecout<<"总调用次数:"<<p.getCount()<<endl;// 输出:2return0;}
2.mutable 的使用限制
a."只能修饰类的非静态成员变量":不能修饰全局变量,局部变量,函数参数,静态成员变量(static),const变量
![]()
b.线程安全:如果mutable变量被多线程访问,需要手动加锁(const函数不保证线程安全)