C++ 面向对象中的mutable和const
本文主要记录我对面向对象中 const(不变) 以及 mutable(可变) 的理解
const
- const加在成员函数后面(同时在声明与定义中指定)
这样做是为了告诉编译器,这个成员函数不会修改类的类对象的内容。先看看一下代码:
int sum(const Test &t){
int start = t.beg_pos();
int len = t.length();
int res = 0;
for(int i=0;i<len;++i){
res += t.elem(start+i);
}
return res;
}
代码中类t是const引用参数,因此我们在调用t的函数的时候必须保证t不会被修改。但调用函数的时候,编译器不会知道哪些函数会修改t的内容。因此,必须在函数后面决定是否加const,来告诉编译器这个函数是否会改变对象的内容。
(虽然编译器不会每个函数分析它是const还是non-const,但对于声明为const的函数,它会检查有没有修改对象的内容)
- 成员函数可以根据const与否重载
下面这个类中,我们为val函数提供了const版本和non-const版本。
Non-const 的对象会调用non-const版(对象内容改变了也没关系),而const对象则会调用const版。
class Test{
public:
Test(const MyTest& val)
:_val(val){}
const Test& val()const{ return _val};
Test& val(){ return _val};
private:
MyTest _val;
};
mutable
在const对象中,我们不希望修改对象的内容。但在某些类里面我们必须通过修改某些变量来做类似遍历的操作,但这个时候必会与const冲突。这是我们可以在变量前面加mutable,以此告诉编译器修改这个变量不会破坏对象的常量性。
Q.E.D.