const
首先看下代码
class Triangular
{
public:
Triangular();
Triangular( const Triangular &tri);
Triangular(int len = 1, int beg_pos = 1);//默认参数只需给出一次即可
virtual ~Triangular();
int length() const {
return _length;}//这里的函数后面加了 const
int beg_pos() const {
return _beg_pos;}
int elem(int pos) const;
bool next(int &val);
bool next_reset() {
_next = _beg_pos -1;}
protected:
private:
int _length;
int _beg_pos;
int _next;
string _name;
static vector<int> _elems;
};
int Triangular::elem(int pos) const
{
return _elem[pos-1];
}
为了不改变class object的内容,可以在成员函数上表明为cosnt。
而定义的要求:const紧接在参数列表之后,而在class主题定义之外的需要在声明和定义中指定const,如上述的int Triangular::elem(int pos) const
如果我们在一个定义为const的成员函数里改变class object的内容会出现报错
bool Triangular::next(int &val) const
{
if(_next <_beg_pos +_length -1)
{
val = _elems[_next++]; //这里改变了_next
return true;
}
return false;
}
error: increment of member ‘Triangular::_next’ in read-only object|
编译上述代码可能会出现的错误
error: increment of member ‘Triangular::_next’ in read-only object|
我们需要在代码文件里声明
(来源:https://blog.csdn.net/weixin_34342992/article/details/93343099)
vector<int> Triangular::_elems;//这里不注明会出现没有引用的错误
Mutable
我们再来实验一个代码
int sum(const Triangular &trian)
{
if(! trian.length())
return 0;
int val,sum = 0;
trian.next_reset();
while(trian.next(val))
sum += val;
return sum;
}
上述的代码目前是不能通过编译的
因为next_reset和next改变了_next 的值。而如果我们真的很想实现上述代码,让_next的值可以改变,我们可以修改类的声明
class Triangular
{
.....
bool next(int &val) const;
bool next_reset() {
_next = _beg_pos -1;} const
....
mutable int _next;
.....
};