[原创文章欢迎转载,但请保留作者信息]
Justin 于 2009-10-26
布道到这个时候,
Scott Meyers
已经开始语重心长的讲授C++程序员的生存哲学:吝啬。
这里,高尚是高尚者的墓志铭,const是吝啬者的通行证。咱玩儿C++啥都要吝啬,无论什么对象,没有特殊关系的就只能眼看手不动。要做到不让别人动自己的宝贝,就要用const,哪怕你心里没那么小气,也要抛出个const出来显示咱的层次:强中自有强中手,个个const不离手……
上面纯属个人瞎扯,书上没有这样写,这样写只因为瞎扯能让人记忆犹新。但是从大师的题目(Use const whenever possible)就可以看出来,所谓的瞎扯其实也不是完全没有道理。
首先要知道const可以通用在对象上,函数参数和返回值上,甚至是用在限制函数本身。
大量声明const的做法有点“宁可错杀一千不可放过一个”的味道,就算我滥用了const,顶多在编译的时候报错:“对不起,您要修改的对象是个const…… ”反之,如果因为疏忽没有定义一个原本应该是const的对象,造成的错误就是隐性的。所以只要存在不需要改动的(或者根本就不能改动的)对象,就把她打上const的烙印,让外人动不得。
大师就是大师,说完了这些,马上给自己留了一条后路……
Compilers enforce bitwise constness, but you should program using conceptual constness.
这里有提到constness(这个词有点难解释,就理解为const的名词形式吧sigh…)的两个门派: bitwise学院派和conceptual实用派。
bitwise constness阵营应该都是很学究的,这里认为如果一个函数被声明是const,你就绝对不能修改对象里的任何成员(static成员除外)。做人就要表里如一,说一不二。
主张conceptual constness流的当然都比较好说话,虽然你是const党,但需要的时候,还是应该有例外的嘛。正所谓人无完人,const也没有绝对的const~
编译器都是古板的,所以它很坚定D投身学院派。跟着大师混的程序员都是聪明的,当然是实用派的粉丝。
但是粉丝又要依赖古板的编译器……
所以大师传授了独门绝学mutable:用mutable限定的对象,哪怕是在const函数里,一样可以修改,爱咋玩咋玩!
和const有关的还有在const和非const对象间的转换问题(用const_cast和static_cast完成两个方向的转换),不过层次太高,我还没能看到有需要用的地方@#¥%