我有一本书,上面写着:
class Foo
{
public:
int Bar(int random_arg) const
{
// code
}
};
什么意思?
在函数声明后用关键字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,所以不能修改成员变量。
可以放宽不允许函数写入类的任何变量的“const 函数”限制。为了让一些变量即使在函数被标记为“const 函数”时也是可写的,这些类变量被标记为关键字mutable
。因此,如果一个类变量被标记为可变,并且一个“const 函数”写入这个变量,那么代码将编译干净并且变量可以改变。 (C++11)
与处理const
关键字一样,在C++ 语句中更改const 关键字的位置具有完全不同的含义。 const
的上述用法仅适用于在括号后的函数声明末尾添加 const
时。
const
在 C++ 中是一个被过度使用的限定符:语法和排序通常与指针结合起来并不简单。关于 const
正确性和 const
关键字的一些阅读:
Const correctness
The C++ 'const' Declaration: Why & How
我是一名优秀的程序员,十分优秀!