C++之 mutable

来源:互联网 发布:神通数据库 7.0 下载 编辑:程序博客网 时间:2024/05/22 03:49

mutable 关键字
1. 在C++中,mutable是为了突破const的限制而设置的。被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中,甚至结构体变量或者类对象为const,其mutable成员也可以被修改。

struct  ST  {        int a;        mutable int b;   };    const ST st={1,2};  st.a=11;//编译错误  st.b=22;//允许 


2. mutable在类中只能够修饰非静态数据成员。mutable 数据成员的使用看上去像是骗术,因为它能够使const函数修改对象的数据成员。然而,明智地使用 mutable 关键字可以提高代码质量,因为它能够让你向用户隐藏实现细节,而无须使用不确定的东西。我们知道,如果类的成员函数不会改变对象的状态,那么这个成员函数一般会声明成const的。但是,有些时候,我们需要在const的函数里面修改一些跟类状态无关的数据成员,那么这个数据成员就应该被mutalbe来修饰。

class  ST    {    int a;    mutable int showCount;    void Show()const;    …    };  ST::Show()  {    …//显示代码    a=1;//错误,不能在const成员函数中修改普通变量    showCount++;//正确  }


3. const承诺的是一旦某个变量被其修饰,那么只要不使用强制转换(const_cast),在任何情况下该变量的值都不会被改变,无论有意还是无意,而被const修饰的函数也一样,一旦某个函数被const修饰,那么它便不能直接或间接改变任何函数体以外的变量的值,即使是调用一个可能造成这种改变的函数都不行。这种承诺在语法上也作出严格的保证,任何可能违反这种承诺的行为都会被编译器检查出来.
4. mutable的承诺是如果某个变量被其修饰,那么这个变量将永远处于可变的状态,即使在一个const函数中。这与const形成了一个对称的定义,一个永远不变,而另外一个是永远可变.
5. 看一个变量或函数是否应该是const,只需看它是否应该是constant或invariant,而看一个变量是否应该是mutable,也只需看它是否是forever mutative。

6. 这里出现了令人纠结的3个问题
* 1. 为什么要保护类的成员变量不被修改?
* 2. 为什么用const保护了成员变量,还要再定义一个mutable关键字来突破const的封锁线?
* 3. 到底有没有必要使用const 和 mutable这两个关键字?
7. 保护类的成员变量不在成员函数中被修改,是为了保证模型的逻辑正确,通过用const关键字来避免在函数中错误的修改了类对象的状态。并且在所有使用该成员函数的地方都可以更准确的预测到使用该成员函数的带来的影响。而mutable则是为了能突破const的封锁线,让类的一些次要的或者是辅助性的成员变量随时可以被更改。没有使用const和mutable关键字当然没有错,const和mutable关键字只是给了建模工具更多的设计约束和设计灵活性,而且程序员也可以把更多的逻辑检查问题交给编译器和建模工具去做,从而减轻程序员的负担。

引用

博客: http://blog.csdn.net/tht2009/article/details/6920511

原创粉丝点击