C++ 4.3 metable和const

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;
.....
};

猜你喜欢

转载自blog.csdn.net/weixin_43387612/article/details/107290908
4.3