class Foo
{
public:
int Bar(int random_arg) const
{
// code
}
};
const
在函数声明后用关键字表示的“常量函数”, 使该类函数更改class 的成员变量成为编译器错误。但是,在函数内部可以读取类变量,但是在该函数内部进行写入将产生编译器错误。
考虑这种“常量函数”的另一种方法是将类函数视为带有隐式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)
。
现在,在末尾int Foo::Bar(int random_arg) const
添加const 可以理解为带有const指针的声明:int Foo_Bar(
const Foo* this
, int random_arg)
。由于this
这种情况下的类型为const,因此无法修改成员变量。
可以放宽“常量函数”的限制,不允许函数写入类的任何变量。为了使某些变量即使在函数被标记为“ const function”时也可写,这些类变量被标记为mutable
。因此,如果将类变量标记为可变的,并且“ const函数”写入此变量,则代码将干净地编译,并且该变量可能会更改。(C ++ 11)
通常,在处理const
关键字时,更改C ++语句中const关键字的位置具有完全不同的含义。上面的用法const
仅适用于在const
括号后添加到函数声明的末尾。
const
C#是C ++中过度使用的限定符:与指针结合使用时,语法和顺序通常并不简单。
参考文献:
C ++“ const”声明:为什么和如何:http://duramecho.com/ComputerInformation/WhyHowCppConst.html
常量正确性 :http://www.parashift.com/c++-faq-lite/const-correctness.html