社区
C++ 语言
帖子详情
在什么情况下会用到mutable
welcome1998
2007-09-20 02:17:59
RT
...全文
246
8
打赏
收藏
在什么情况下会用到mutable
RT
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
8 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
iambic
2007-09-26
打赏
举报
回复
如果你为自己的类加了某种cache,可能会需要mutable。
freshlifeO
2007-09-26
打赏
举报
回复
看到过一个举例应用:
程序中我们经常会用到Get..函数,这类函数通常我们认为是不会改变对象状态的(如Chiyer(星羽)所说 )。这里,所以通常编码规范的话会把该函数定为const。假设我们要返回的值是一个需要通过复杂计算而来,并且在系统中会经常的改变,这个时候mutable就有用了。把 需要计算的值声明为mutable就可以在该const的Get..函数中临时来计算,不必时刻的去更新该变量值,从而是节约了系统的资源。
lidewyb
2007-09-26
打赏
举报
回复
也不能这么说,既然C++标准有这个关键字,就肯定有它的合理性。
yuanchuang
2007-09-26
打赏
举报
回复
taodm((不能收CSDN社区短信息,请莫浪费精力)) ( 两星(中级)) 信誉:100 2007-9-20 16:12:49 得分:0
?
实在是太少需要使用。基本上如果你用了,就是错用。
-----------
这回答经典加NB
neversaydie518
2007-09-25
打赏
举报
回复
偶学习
taodm
2007-09-20
打赏
举报
回复
实在是太少需要使用。基本上如果你用了,就是错用。
星羽
2007-09-20
打赏
举报
回复
使用可变(mutable)成员隐藏实现细节
关键字 mutable 是一个奇怪的修饰符(specifier),它只能够用于一个类的非静态数据成员。下面我将讨论 mutable 的语义和用法,但是首先我要解释一下 C++ 对象模型的一个关键概念。
对象的状态
一个对象的状态由其非静态数据成员的值构成,因此,修改一个数据成员将会改变整个对象的状态。将一个成员函数声明为 const 能够保证它不会改变对象的状态。
然而在一些情况下,对象的逻辑状态与其物理状态之间可能有差别。例如,对于一个表示绘画图像的对象就存在这种情况。如果图像还没有更改,那么我们就认为其状态没有发生变化。然而,从底层实现方面来说,如果大对象在一段时间没有活动,那么它们的内存通常会被交换到一个文件中。交换一个图像并不会真地影响其状态,但是对象的一些数据成员可能会发生变化,在这里可能会发生变化的是指针、标志位等。
在用户调用一个诸如 Redraw() 之类的 const 成员函数时,他们并不关心这个函数在内部是如何实现的。从他们的角度来说,这个函数并不改变对象的逻辑状态,因此被声明为 const。Redraw() 有可能修改对象的物理状态这一事实是一个他们不应该关心的实现细节。例如:
int Image::Redraw() const
{
if (isLoaded==false)
{
//..read image data from a disk into a local buffer
isLoaded=true; //changing a data member's value
}
//..paint image in the screen
}
可变(mutable)数据成员
如果尝试编译这段代码,你会得到一个编译错误。虽然 Redraw() 声明为 const,但是它修改了一个数据成员。解决这个编译错误的方法是将 isLoaded 声明为一个 mutable 数据成员:
class Image {
public:
int Redraw() const;
//..
private:
mutable bool isLoaded;//can be changed by a const function
};
不像普通的数据成员,const 成员函数可以修改 mutable 数据成员。
Mutable 数据成员的使用看上去像是骗术,因为它能够使 const 函数修改对象的数据成员。然而,明智地使用 mutable 关键字可以提高代码质量,因为它能够让你向用户隐藏实现细节,而无须使用不确定的东西,比如 const_cast<>。
babala512
2007-09-20
打赏
举报
回复
多线程
mutable
1.
mutable
关键字 (C++) 字典意思adj. 易变的,不定的;性情不定的 语法意思如果需要在const成员方法中修改一个成员变量的值,那么需要将这个成员变量修饰为
mutable
。即用
mutable
修饰的成员变量不受const成员方法的限制。 可以认为
mutable
的变量是类的辅助状态,但是只是起到类的一些方面表述的功能,修改他的内容我们可以认为对象的状态本身并没有改变的。实际上由于co...
Const的使用
情况
在C程序中,const的用法主要有定义常量、修饰函数参数和修饰函数返回值。而在C++程序中,它除了上述功能外,还可以修饰函数的定义体,定义类中某个成员函数为恒态函数,即不改变类中的数据成员。对于定义常量的用法,这里就不多说了,重点看一下修饰函数参数、修饰函数返回值以及修饰函数的定义体。 0)修饰变量或指针 int ii=0; const int i=0; //i是...
《并发编程设计模式》序言之概念
并发的的概念错综繁杂,herb sutter就曾用盲人摸象来比喻过,这个寓言对国人来说再清楚不过了,每个人对并发及其相关的概念都有自己的见解,并为此争论不休,却几乎都是只见树木,不见森林 什么场景
下会
用到
并发?如何对这些场景及其涉及相关概念进行分类,抽象?如何根据分析结果从以往的经验(自己的以及他人的)中找出相对应的解决方案,或者构造出新的解决方案?这篇序言将会解决前两个问题:
[Object-C]_[初级]_[关于块block的引用外部变量的规则]
场景 在开发 Object-C 程序时, 很多
情况
下会
用到
它的块 block 特性, 这个 block 其实就是 lambda 表达式. 这个 block 和 lambda有什么区别, 还有什么需要注意的编程点? 我们在使用 dispatch_async 函数进行 GCD 异步编程时, 在 block 里引用的外部范围的 object 变量是否需要 retain? 如果不 retain 的...
c++关键字详解(volatile,
mutable
, explicit, dynamic_ cast(expression))等
1 volatile 有些变量是用volatile关键字声明的。当两个线程都要
用到
某一个变量且该变量的值会被改变时,应该用volatile声明,该关键字的作用是防止优化编译器把变量从内存装入CPU寄存器中。如果变量被装入寄存器,那么两个线程有可能一个使用内存中的变量,一个使用寄存器中的变量,这会造成程序的错误执行。 volatile的意思是让编译器每次操作该变量时一定要从内存中真正取出,而不是
C++ 语言
64,688
社区成员
250,496
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章