c/c++语言开发共享C++系列总结——mutable关键字

介绍 的中文意思是易变的,是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::mapfirst也是如此。

结合以上两种情况,我们总结一下就能得出mutable可以用来修饰const对象中那些不会影响外部观察的成员。

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/c-cdevelopment/604519.html

(0)
上一篇 2021年5月12日
下一篇 2021年5月12日

精彩推荐