mutable是C++中的一个关键字,意思是可变的。mutable主要用途就是针对const函数。如果没有const关键字,也就没有mutable关键字。
先来看如下代码:
1 2 3 4 5 6 7 8 9 |
string Circle::toString() const { if(radius < 0) { x = y = radius = 0; } return doubleToString(x) +" " + doubleToString(y) +" " + doubleToString(radius); } |
toString()成员函数是const函数,但是它里面有修改成员变量x = y = radius = 0,但const函数里是不能成员修改变量,哪这样要如何处理?
C++提供了关键字mutable,为解决这类问题算是提供一个后门。
如上代码要修改成能通过编译,要在三个变量(x/y/radius)前面加关键字mutable,告诉编译器这几个成员变量是可变的。
mutable作用例子全代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
//梁笔记 //zouzhongliang.com #include <iostream> #include <string> using namespace std; class circle { private: mutable double x,y; //加mutable关键字 mutable double radius; //加mutable关键字 string doubleToString(double num) const { char str[256]; sprintf(str, "%lf", num); string result = str; return result; } public: circle(){ x = 0; y = 0; radius = 10; } ~circle(){ } string toString() const { if(radius < 0) { x = y = radius = 0; } return doubleToString(x) +" " + doubleToString(y) +" " + doubleToString(radius); } }; int main() { circle c1; string str = c1.toString(); return 0; } |
大家可能会想不定义成const函数不就可以了,但这是下策,不是好的办法。因像toString()函数一看 函数名就应该是const函数。
注:在编程中不要只管运行结果的正常,还要处理让代码更有可读性。