const函数,但我可以修改"班级

时间:2016-09-11 13:39:22

标签: c++ const

我在一个具有const关键字的类中有一个函数:

bool Machiavelli::IsStraight(std::vector<Card>& cards) const{}

Machiavelli是一个内部有其他类的类,如Card和Table:

class Table{
    private:
            std::map<int, std::vector<Card> > table;
    ....
};

函数中的vectortable的向量。该功能检查卡是否组装成直线。

现在,在函数中我改变了Card函数数据的值:

cards[i].SetIntValue(14);

其中SetIntValue是Card类中的函数。

读一些问题,我读到:

  函数声明后的

const意味着不允许该函数更改任何类成员(标记为可变的类除外)。

该函数不知道参数是在Machiavelli中,所以我可以更改一个类成员:table。我的推理失败了吗?

3 个答案:

答案 0 :(得分:7)

声明为const的方法无法修改成员,只要它尝试通过implicit this pointer of the method修改成员。

考虑以下课程:

struct foo
{
    void bar(int *i) const {
        *i = 0;
        _m = 0;
    }

    int j;
    int _m;
};

假设我们打电话

foo f;
f.bar(&f.j);

然后就行了

        *i = 0;

很好。即使它实际上正在修改j,但它并没有通过this进行修改。但是,

        _m = 0;

真的意味着

        this->_m = 0;

所以它不会构建 - 函数的const意味着它无法修改它。

答案 1 :(得分:2)

因为您的const函数未更改类成员。

它正在将作为参数传递的向量更改为函数。

无论调用函数是什么,传递恰好是同一个类的成员的向量是一个完全不同的问题。

答案 2 :(得分:1)

  函数声明后的

const意味着不允许该函数更改任何类成员(标记为可变的类除外)。

这不完全正确。需要进行一次小但重要的修正。

  函数声明后

const表示不允许该函数通过更改任何数据 其类成员变量(除了 via 标记为可变的那些。

请注意,变量不是数据,而是数据的名称

由于cards不是类成员变量,因此可以通过cards更改数据,即使它与成员变量table中的数据相同