const 函数,但我可以"modify"类
const function, but I could "modify" the class
我有一个函数在一个类与const
关键字:
bool Machiavelli::IsStraight(std::vector<Card>& cards) const{}
马基雅维利是一个包含其他类的类,如Card和Table:
class Table{
private:
std::map<int, std::vector<Card> > table;
....
};
函数中的vector
是table
的向量。函数检查卡片是否排成一条直线。
现在,在函数中我改变了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
中的相同数据。
相关文章:
- 函数向量_指针有不同的原型,我可以构建一个吗
- 我可以使用 g++ 进行三种比较 (<=>) 吗?
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 我可以信任表示整数的浮点或双精度来保持精度吗
- 我可以将一个用clang c++11编译的对象与另一个用c++17编译的对象链接起来吗
- 为什么我可以通过引用修改常量返回
- 我可以在 C++ 中的函数体之外进行操作吗?
- 我可以重新分配/覆盖std::字符串吗
- C++-我可以创建另一个类的成员并在构造函数中使用它吗
- 我可以将调用类的"this"传递给 lambda 函数吗?
- 我可以检测和更改 gcc/g++ 中结构的当前数据对齐设置吗?
- 为什么我可以使用比分配的内存更多的内存
- 在一个读写器队列中,我可以用volatile替换原子吗
- 我可以把基础班提升为儿童班吗
- 我可以做些什么来消除或最小化这种将提供相同功能和行为的代码重复
- 我可以使用什么来停止循环而不是"返回 0"?
- 我可以使用反向迭代器作为ForwardIt吗
- 我可以创建一个包含两个变量的 for 循环,但时间复杂度仍然为 O(n) 吗?
- 我可以与 python 服务器而不是 c++ 客户端建立 tcp/ip 套接字吗?
- const 函数,但我可以"modify"类