我有一本书,上面写着这样的内容:
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
关键字的一些阅读:
考虑两个类类型变量:
class Boo { ... };
Boo b0; // mutable object
const Boo b1; // non-mutable object
现在您可以在 Boo
上调用
b0
的 任何成员函数,但只能在
const
上调用 b1
限定的成员函数。
Bar
保证不会更改正在调用的对象。例如,请参阅 C++ FAQ 中有关 const 正确性的部分。