我有一本书,上面写着:
class Foo { public: int Bar(int random_arg) const { // code } };
这是什么意思?
在函数声明后用关键字表示的“const 函数”const使此类函数更改类的成员变量成为编译器错误。但是,在函数内部读取类变量是可以的,但是在函数内部写入会产生编译器错误。
const
考虑这种“const 函数”的另一种方法是将类函数视为采用隐式this指针的普通函数。因此,一个方法int Foo::Bar(int random_arg)(最后没有 const)会产生一个类似 的函数int Foo_Bar(Foo* this, int random_arg),而一个类似的调用Foo f; f.Bar(4)将在内部对应于类似的东西Foo f; Foo_Bar(&f, 4)。现在在末尾添加 const ( int Foo::Bar(int random_arg) const) 可以理解为带有 const this 指针的声明:int Foo_Bar(const Foo* this, int random_arg)。由于this这种情况下的类型是 const,所以不能修改成员变量。
this
int Foo::Bar(int random_arg)
int Foo_Bar(Foo* this, int random_arg)
Foo f; f.Bar(4)
Foo f; Foo_Bar(&f, 4)
int Foo::Bar(int random_arg) const
int Foo_Bar(const Foo* this, int random_arg)
可以放宽不允许函数写入类的任何变量的“const 函数”限制。为了让一些变量即使在函数被标记为“const 函数”时也是可写的,这些类变量用关键字标记mutable。因此,如果一个类变量被标记为可变,并且一个“const 函数”写入这个变量,那么代码将编译干净并且变量可以改变。(C++11)
mutable
像往常一样处理const关键字时,在 C++ 语句中更改 const 关键字的位置具有完全不同的含义。上述用法const仅适用于const在括号后添加到函数声明的末尾时。
const是 C++ 中一个过度使用的限定符:语法和排序通常与指针结合起来并不简单。const关于正确性和const关键字的一些读数:
常量正确性
C++ ‘const’ 声明:为什么和如何