C++系列总结——mutable关键字
程序员文章站
2022-04-28 10:44:48
介绍 的中文意思是易变的,是C++的一个关键字。它的作用就是允许修改被const修饰的对象的成员变量。 常用场景 什么情况下我们会使用到mutable? 一般我们会用 修饰get类的函数,明确函数内部不会修改任何成员变量,但是如果内部的成员变量需要多线程读写,我们必须加锁保证多线程安全。毫无疑问,加 ......
介绍
mutable
的中文意思是易变的,是c++的一个关键字。它的作用就是允许修改被const修饰的对象的成员变量。
常用场景
什么情况下我们会使用到mutable?
一般我们会用const
修饰get类的函数,明确函数内部不会修改任何成员变量,但是如果内部的成员变量需要多线程读写,我们必须加锁保证多线程安全。毫无疑问,加锁操作是要修改锁对象的,此时就用到了mutable
。
#include <mutex> class a { public: int get() const { std::lock_guard<std::mutex> lk( m ); return value; } void set( int v ) { value = v; return; } private: mutable std::mutex m; // 不加mutable,编译就会报错 int value; }; int main() { a a; return; }
还有比如我们使用std::set:
保存对象,当我们修改对象中非key的值时也需要用到mutable
,不然就得重新构造对象,设置非key的值,再重新塞入set
中。
#include <set> class a { public: void set( int v ) const { value = v; return; } bool operator<( const a& rhs ) const { return key < rhs.key; } private: int key; mutable int value; // 不加mutable,编译就会报错 }; int main() { std::set<a> s; s.insert( a() ); s.begin()->set( 10 ); return 0; }
std::set
的迭代器类型总是const_iterator
。这很好理解,因为对象的在std::set
中的位置是根据其key值确定的,如果允许修改,那么std::set
结构就不对了,再加上编译器无法确定函数内是否会修改key,所以通过其迭代器对象操作的函数必须是const
修饰的。同理,std::map
的first
也是如此。
结合以上两种情况,我们总结一下就能得出mutable
可以用来修饰const对象中那些不会影响外部观察的成员。
上一篇: 内部优化/外部链接