const 函数,但我可以"modify"类

const function, but I could "modify" the class

本文关键字:modify 我可以 函数 const      更新时间:2023-10-16

我有一个函数在一个类与const关键字:

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

马基雅维利是一个包含其他类的类,如Card和Table:

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

函数中的vectortable的向量。函数检查卡片是否排成一条直线。

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

cards[i].SetIntValue(14);

其中SetIntValue为Card类中的函数。

阅读一些问题,我读:

const在函数声明后表示该函数不允许改变任何类成员(除了那些被标记为可变的成员)。

函数不知道实参是Machiavelli格式,所以我可以更改一个类成员:table。我的推理哪里出错了?

声明为const的方法不能修改成员,只要它试图通过该方法的隐式this指针修改成员。

考虑以下类:

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意味着它不能修改它

因为你的const函数没有改变一个类成员

它改变了作为形参传递给函数的vector

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

const在函数声明后表示该函数不允许改变任何类成员(除了那些被标记为可变的成员)。

这并不完全正确。一个小而重要的修正是必要的。

函数声明后的

const表示函数不允许通过其类成员变量改变任何数据(通过标记为可变的变量除外)。

注意变量不是data,它是data的名称

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