6.12. const 用法
Tip
我们强烈建议你在任何可能的情况下都要使用 const. 此外有时改用 C++11 推出的 constexpr 更好。
定义:
在声明的变量或参数前加上关键字const用于指明变量值不可被篡改 (如const int foo). 为类中的函数加上const限定符表明该函数不会修改类成员变量的状态 (如class Foo { int Bar(char c) const; };).
优点:
大家更容易理解如何使用变量. 编译器可以更好地进行类型检测, 相应地, 也能生成更好的代码. 人们对编写正确的代码更加自信, 因为他们知道所调用的函数被限定了能或不能修改变量值. 即使是在无锁的多线程编程中, 人们也知道什么样的函数是安全的.
缺点:
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 intfoo, 他们认为前者更一致因此可读性也更好: 遵循了const总位于其描述的对象之后的原则. 但是一致性原则不适用于此, “不要过度使用” 的声明可以取消大部分你原本想保持的一致性. 将const放在前面才更易读, 因为在自然语言中形容词 (const) 是在名词 (int) 之前.这是说, 我们提倡但不强制const在前. 但要保持代码的一致性! (Yang.Y 注: 也就是不要在一些地方把const写在类型前面, 在其他地方又写在后面, 确定一种写法, 然后保持一致.)
