随笔-34  评论-108  文章-0  trackbacks-0
    存储描述符mutable用来特别说明某个类的成员变量需要以一种允许更新的方式存储--即使它是某个const对象的成员。换言之,mutable意味着“不可能是const”。
    举例如下:
class Test
{
  public:
void SetValue(int i) const {m_i=i;}
private:
mutable int m_i;
};
    上面的代码在使用的时候是没有问题的,但是如果int m_i的定义去掉mutable,则会出现 “error C2166: l 值指定常数对象”这样的错误提示。
    可能有朋友说,可以通过const_cast 之类的转换实现,但是这个运算符并不是总能正确的转换的。
posted on 2007-02-11 08:35 探丫头 阅读(1246) 评论(4)  编辑 收藏 引用 所属分类: 编程语言——C++

评论:
# re: 存储描述符mutable[未登录] 2007-02-11 16:18 | BBSky
"static_const"应该是const_cast  回复  更多评论
  
# re: 存储描述符mutable 2007-02-11 16:31 | 平凡小草
@BBSky
晕,我真是服气了,怎么犯这样的错误,谢谢提醒  回复  更多评论
  
# re: 存储描述符mutable 2007-02-11 20:10 | anonymous
以通过const_cast 之类的转换实现,但是这个运算符并不是总能正确的转换的

首先,你这个结论是错误的。其次,const_cast 不应该用于这种情况。实际上一般就不应该使用const_cast。mutable的目的也不是用在这种情况下。
以下摘自:
http://blog.chinaunix.net/u/23408/showart_191168.html

*** "const" 修饰成员函数

“const”还可以用来修饰成员函数以表明它不会破坏对象的逻辑不变性。

**** 物理不变与逻辑不变

逻辑不变(Logical Constness)指的是对象的呈现给用户的状态不变,但它的成员变量是否变化则不一定。与逻辑不变相对应的还有物理不变(Physical Constness)。所谓物理不 变指的是对象的任何成员变量都不作任何改动。有时两者是一致的,但有很多时候两者并不一致。例如:假设有如下多线程环境下的set类, 它的成员函数getData()获取指定键值的元素。

*** 关键字“mutable”

上一节讲到const成员函数应当保持对象逻辑上不变。但是一个成员函数被定义成const成员 后,编译器禁止它修改对象的任何属性。如果成员函数确实需要在不破坏对象逻辑不变性的 前提下修改某一属性就需要借助关键字“mutable”了。

关键字“mutable”表示被修饰者在任何情况下都不为常量。上例中MtSet把_mutex_定义成 mutable变量。不论MtSet的对象是否为常量,_mutex_都是一个“变”量。  回复  更多评论
  
# re: 存储描述符mutable 2007-02-14 11:21 | 平凡小草
@anonymous
谢谢这么耐心的指导,以后多向你学习  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理