我在一个具有const
关键字的类中有一个函数:
bool Machiavelli::IsStraight(std::vector<Card>& cards) const{}
Machiavelli是一个内部有其他类的类,如Card和Table:
class Table{
private:
std::map<int, std::vector<Card> > table;
....
};
函数中的vector
是table
的向量。该功能检查卡是否组装成直线。
现在,在函数中我改变了Card函数数据的值:
cards[i].SetIntValue(14);
其中SetIntValue
是Card类中的函数。
读一些问题,我读到:
函数声明后的
const
意味着不允许该函数更改任何类成员(标记为可变的类除外)。
该函数不知道参数是在Machiavelli中,所以我可以更改一个类成员:table
。我的推理失败了吗?
答案 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
中的数据相同