C++系列总结——mutable关键字
介绍
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对象中那些不会影响外部观察的成员。
C++系列总结——mutable关键字的更多相关文章
- volatile关键字和mutable关键字
如果不用volatile关键字会如何?可能会造成一个后果就是:编译器发现你多次使用同一个变量的值,然后它可能会假设这个变量是不变的值,并且把这个变量的值放入寄存器中,方便下一次使用,提高存取速度. 一 ...
- const成员函数和mutable关键字
一.const成员函数 class MyClass { public: void fun() const { } private: int m_nValue; } const成员函数内不能修改成员变量 ...
- 可变lambda, lambda使用mutable关键字
关于lambda的捕获和调用 C++ primer上对可变lambda举的例子如下: size_t v1=42; auto f=[v1] () mutable{return ++v1; }; v1=0 ...
- C++98常用特性介绍——mutable关键字
讲mutable前,先讲一下const函数,讲const函数前,先讲一下函数前后加const的区别 一.C++函数前后加const的区别 1)函数前加const:普通函数或非静态成员函数前均可加con ...
- 面试问题之C++语言:mutable关键字
转载于:https://www.cnblogs.com/xkfz007/articles/2419540.html mutable关键字 mutable的中文意思是"可变的,易变的" ...
- 【面试普通人VS高手系列】volatile关键字有什么用?它的实现原理是什么?
一个工作了6年的Java程序员,在阿里二面,被问到"volatile"关键字. 然后,就没有然后了- 同样,另外一个去美团面试的工作4年的小伙伴,也被"volatile关 ...
- C++中的mutable关键字
mutalbe的中文意思是“可变的,易变的”,跟constant(既C++中的const)是反义词. 在C++中,mutable也是为了突破const的限制而设置的.被mutable修饰的变量,将永远 ...
- mutable关键字
mutalbe的中文意思是“可变的,易变的”,跟constant(既C++中的const)是反义词.在C++中,mutable也是为了突破const的限制而设置的.被mutable修饰的变量(muta ...
- 深入理解C++中的mutable关键字
mutalbe的中文意思是“可变的,易变的”,跟constant(既C++中的const)是反义词. 在C++中,mutable也是为了突破const的限制而设置的.被mutable修饰的变量,将 ...
随机推荐
- scala 2.11.x/spec/03-types.md
scala/spec/03-types.md title: Types layout: default chapter: 3 --- Types Type ::= FunctionArgTypes ' ...
- 设置mysql InnoDB存储引擎下取消自动提交事务
mysql 存储引擎中最长用的有两种,MyISAM 存储引擎和InnoDB存储引擎. 1.MyISAM 存储引擎 不支持事务,不支持外键,优势是访问速度快: 2.InnoDB存储引擎 支持事务,一般项 ...
- 别以为真懂Openstack: 虚拟机创建的50个步骤和100个知识点(3)
四.Nova-compute 步骤17:nova-compute接收到请求后,通过Resource Tracker将创建虚拟机所需要的资源声明占用 步骤18:调用Neutron API配置Networ ...
- 安卓开发笔记(十六):'Request(okhttp3.Request.Builder)' has private access in 'okhttp3.Request
当出现了'Request(okhttp3.Request.Builder)' has private access in 'okhttp3.Request的错误的时候,实际上是我们在写代码的时候少打了 ...
- [Swift]LeetCode382. 链表随机节点 | Linked List Random Node
Given a singly linked list, return a random node's value from the linked list. Each node must have t ...
- [Swift]LeetCode633. 平方数之和 | Sum of Square Numbers
Given a non-negative integer c, your task is to decide whether there're two integers a and b such th ...
- PHP算法之冒泡排序
//冒泡排序 //①思路,先比较出第一次,找一个最大的值,排到最后; //②重复count遍之后,就能得到排序; //③优化,每一次循环之后不需要再次全部重复; $array = [11,5,4,58 ...
- java在方法中获取request对象
在spring的普通类中: HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getReques ...
- Socket网络编程知识点
静态方法 与类无关,不能访问类里的任何属性和方法类方法 只能访问类变量属性@property 把一个方法变成一个静态属性, flight.status @status.s ...
- Zara带你快速入门WPF(3)---触发器篇
一.前言 使用触发器,可以动态的改变控件的外观,因为一些事件或属性改变了,把鼠标移动到按钮上,按钮就会改变其外观.通常这些必须写在C#代码中,使用WPF也可以使用XAMl实现,而这只会影响UI. 属性 ...