强烈建议在任何可以使用的情况下都要使用 const
。
定义:在声明的变量或参数前加上关键字 const
用于指明变量值不可修改;为类中的函数加上 const 限定表明该函数不会修改类成员变量的状态。
const int foo;
class Foo {
int Bar (chat c) const;
};
优点:人们更容易理解变量是如何使用的,编辑器可以更好地进行类型检测、更好地生成代码。人们对编写正确的代码更加自信,因为他们知道所调用的函数被限定了能或不能修改变量值。即使是在无锁的多线程编程中,人们也知道什么样的函数是安全的。
缺点:如果你向一个函数传入 const
变量,函数原型中也必须是 const
的(否则变量需要 const_cast
类型转换),在调用库函数时这尤其是个麻烦。
结论:const
变量、数据成员、函数和参数为编译时类型检测增加了一层保障,更好的尽早发现错误。因此,我们强烈建议在任何可以使用的情况下使用 const
:
- 如果函数不会修改传入的引用或指针类型的参数,这样的参数应该为
const
; - 尽可能将函数声明为
const
,访问函数应该总是const
,其他函数如果不会修改任何数据成员也应该是const
,不要调用非const
函数,不要返回对数据成员的非const
指针或引用; - 如果数据成员在对象构造之后不再改变,可将其定义为
const
。
然而,也不要对const
过度使用,像 const int * const * const x;就有些过了,即便这样写精确描述了 x,其实写成 const int** x 就可以了。
关键字 mutable 可以使用,但是在多线程中是不安全的,使用时首先要考虑线程安全。
关于 const
位置:
有人喜欢 int const *foo 形式不喜欢 const int* foo,他们认为前者更加一致因此可读性更好:遵循了 const
总位于其描述的对象(int)之后的原则。但是,一致性原则不适用于此,“ 不要过度使用 ” 的权威抵消了一致性使用。将 const
放在前面才更易读,因为在自然语言中形容词(const
)是在名词(int
)之前的。
这是说,提倡 const
在前,并不是要求,但要兼顾代码的一致性!