作为程序员,你写的程序(就拿个类来说吧)只有三种可能:
1.为程序员用户写的,供其它程序员用,自己充当功能的封装角色,就像程序库的设计者一样
2.仅仅自己用,就像把局部重复次数比较多的代码段写成函数一样
3.自己用,其它程序员也想用,毕竟重用是编程的最高境界
把一个类成员函数适时的加上const关键字对于以上三种情况都是有着积极的意义,以下是三种
情况的理由:
1.加上const关键字,程序员通过接口声明就会立即明白该函数是不会更改对象的状态,通常程
序员可不会去看实现
2.对于一个类成员函数行为往往我们从语义上去判断它会不会改变对象的状态,如果是不应该的
话,我们在写它的实现之前就应该设成const。类是对象的抽象,设计类的函数(行为)都是极尽
的去模拟对象。设成const可以避免自己在编程中无意修改了对象的状态,过了一段时间它的作用
更可以和注释一样
3.理由是1+2
说了这么多其实是为了说明mutable的作用做铺垫,明白const在修饰成员函数的作用,你才能深刻体
会到mutable是多么有必要。
mutalbe的中文意思是“可变的,易变的”,跟constant(既C++中的const)是反义词。
在C++中,mutable也是为了突破const的限制而设置的。被mutable修饰的变量,将永远处于可变的状态,
即使在一个const函数中。我们知道,如果类的成员函数不会改变对象的状态,那么这个成员函数一般会
声明成const的。但是,有些时候,我们需要在const的函数里面修改一些跟类状态无关的数据成员,那么
这个数据成员就应该被mutalbe来修饰。
举个例子:
class CDog
{
void bark(void) const{cout << "汪汪..." << endl;} //为了节省篇幅,写成内联形式的
private:
int m_iCount;
/*假设狗叫一次就代表有一个陌生人来了,iCount用来记录陌生人个数,它的改变不会
改变狗实例本身的状态。注意只是假设不能较劲,实际情况不是这样的(对一个陌生人狗
不只叫一声吗等等)
*/
};
现在要计数陌生人的个数怎么办?这样:
void bark(void) const{cout << "汪汪..." << endl; ++m_iCount;}
/*注意:编译错误,还有一点就是const限制不了修改类成员变量
(静态的成员变量叫类变量,非静态的叫实例变量)*/
这样不行,那怎么办?有两种解决方案:
1.去掉bark的const修饰符
2.给计数实例变量iCount加上mutable修饰符,如下:
mutable int m_iCount;
计数器m_iCount被mutable修饰,那么它就可以突破const的限制,在被const修饰的函数里面也能被修改。
如果选择1,那么前面所列的种种const修饰符的好处就荡然无存,而如果选择2两者兼得,孰优孰劣?