在什么情况下会用到mutable

welcome1998 2007-09-20 02:17:59
RT
...全文
246 8 打赏 收藏 转发到动态 举报
写回复
用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
  • 打赏
  • 举报
回复
多线程

64,688

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧