multable虽然在日常的工作中很少用到,但是毕竟multable属于c++语法中的一个关键自所以,在大多数的面试中经常被提到,所以如果你要重新找工作了还是要了解这个关键字的
再了解multable之前我们要先认真的回顾一下什么叫常函数,常函数无非就是带const修饰的函数罢了,为什么要有常函数这个概念,因为为了封装的良好性,优势我们用到的一些函数并不需要我们去改变类中的参数,和成员变量,仅仅只是为了显示和输出的作用,因此才引进常函数,哪为什么要再这里提到常函数呢,应为multable的英文意思主要是可变的,我们了解到c++中,一件事情并不是绝对的,如果有常函数,那么一定有可以修改的方法,这里就用到了这个关键字。。看一下下面的代码
class ClxTest { public: void Output() const; }; void ClxTest::Output() const { cout << "Output for test!" << endl; } void OutputTest(const ClxTest& lx) { lx.Output(); } |
类ClxTest的成员函数Output是用来输出的,不会修改类的状态,所以被声明为const的。
函数OutputTest也是用来输出的,里面调用了对象lx的Output输出方法,为了防止在函数中调用其他成员函数修改任何成员变量,所以参数也被const修饰。
如果现在,我们要增添一个功能:计算每个对象的输出次数。如果用来计数的变量是普通的变量的话,那么在const成员函数Output里面是不能修改该变量的值的;而该变量跟对象的状态无关,所以应该为了修改该变量而去掉Output的const属性。这个时候,就该我们的mutable出场了——只要用mutalbe来修饰这个变量,所有问题就迎刃而解了。
下面是修改过的代码:
class ClxTest { public: ClxTest(); ~ClxTest(); void Output() const; int GetOutputTimes() const; private: mutable int m_iTimes; }; ClxTest::ClxTest() { m_iTimes = 0; } ClxTest::~ClxTest() {} void ClxTest::Output() const { cout << "Output for test!" << endl; m_iTimes++; } int ClxTest::GetOutputTimes() const { return m_iTimes; } void OutputTest(const ClxTest& lx) { cout << lx.GetOutputTimes() << endl; lx.Output(); cout << lx.GetOutputTimes() << endl; } |