浏览 247
分享
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 int
foo
, 他们认为前者更一致因此可读性也更好: 遵循了const
总位于其描述的对象之后的原则. 但是一致性原则不适用于此, “不要过度使用” 的声明可以取消大部分你原本想保持的一致性. 将const
放在前面才更易读, 因为在自然语言中形容词 (const
) 是在名词 (int
) 之前.这是说, 我们提倡但不强制const
在前. 但要保持代码的一致性! (Yang.Y 注: 也就是不要在一些地方把const
写在类型前面, 在其他地方又写在后面, 确定一种写法, 然后保持一致.)
评论列表