const 的一件奇妙事情是,它允许你指定一个语义约束(也就是指定一个"不该被改动"的对象) ,而编译器会强制实施这项约束。它允许你告诉编译器和其他程序员某值应该保持不变。只要这(某值保持不变)是事实,你就该确实说出来,因为说出来可以获得编译器的襄助,确保这条约束不被违反。
char* const p=great ; //const point , non-const data
如果被指物是常量,有些程序员会将关键字const 写在类型之前,有些人会把它写在类型之后、星号之前。两种写法的意义相同,所以下列两个函数接受的参数类型是一样的zvoid f1(const Widget* pw);void f2(Widget const * pw);两种形式都有人用,你应该试着习惯它们。
const 最具威力的用法是面对函数声明时的应用。在一个函数声明式内, const可以和函数返回值、各参数、函数自身(如果是成员函数)产生关联。令函数返回一个常量值,往往可以降低因客户错误而造成的意外,而又不至于放弃安全性和高效性。举个例子,考虑有理数(rational numbers,详见条款24) 的operator* 声明式zclass Rational { ... };const Rational operator* (const Rational& lhs, const Rational& rhs);
if (a * b = c) //I I喔欧,其实是想做一个比较〈∞mpari阳1) 动作!如果a 和b 都是内置类型,这样的代码直截了当就是不合法。而一个"良好的用户自定义类型"的特征是它们避免无端地与内置类型不兼容 .因此允许对两值乘积做赋值动作也就没什么意思了。将operato沪的回传值声明为const 可以预防那个"没意思的赋值动作",这就是该那么做的原因。