Note of Justin

关于工作和读书的笔记

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  47 Posts :: 0 Stories :: 45 Comments :: 0 Trackbacks

留言簿(14)

搜索

  •  

积分与排名

  • 积分 - 51714
  • 排名 - 433

最新评论

阅读排行榜

评论排行榜

 

[原创文章欢迎转载,但请保留作者信息]

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完成两个方向的转换),不过层次太高,我还没能看到有需要用的地方@#¥%

posted on 2009-12-15 15:16 Justin.H 阅读(472) 评论(4)  编辑 收藏 引用 所属分类: Effective C++ 炒冷饭

Feedback

# re: Effective C++ 炒冷饭 - Item 3 const不离手 2009-12-15 19:02 陈梓瀚(vczh)
concept是概念,conceptual的意思应该是【概念上的const】,也就是说,在可能的情况下,通过限制一个类的接口来达到const。

举个例子,假设vector继承了一个readonly_vector接口(当然这是开玩笑了),你可以写
const readonly_vector& get_names()//我不想名字列表被修改
{
return this->names;
}

const readonly_vector&就算被const_cast成了readonly_vector&,你也不能修改里面的对象,除非dynamic_cast回vector&。

好了,这就是conceptual constness了。  回复  更多评论
  

# re: Effective C++ 炒冷饭 - Item 3 const不离手 2009-12-15 19:05 陈梓瀚(vczh)
再者,看下面这个类
class ClassAWrapper
{
private:
ClassA* object;
public:
ClassA* GetObject()const
{
return object;
}
};
这样是编译得过的,因为指针本身你不能改。好了,如果你连object指向的对象都不想被修改怎么办呢,你光const ClassQWrapper&是没用的,你应该:
const ClassA* GetObject()const

这就是conceptual constness了,其实conceptual constness比bitwise constness要严格,不是后门。  回复  更多评论
  

# re: Effective C++ 炒冷饭 - Item 3 const不离手 2009-12-15 21:36 Justin.H
多谢vczh的分享!看来搬家来cppblog是对的:)

我不认同您对conceptual constness的解释:
重新看了一下Item3,以及参考了下面的链接,我想conceptual constness可以这样解释:具备conceptual constness的对象/函数,其行为对于该对象/函数以外的数据是const的,不会篡改别人的东东。但是不保证它不会修改对象/函数内部的成员:当这些成员用mutable修饰的时候,我们可以在一个const函数中修改这些mutable成员的值。
所以说这样的constness是概念上的,实际上在这样的函数中有可能改变了一些变量的值,只不过没有与它声称的constness矛盾而已。
所以应该说bitwise constness比conceptual constness的要求更严格些。

如有谬误,还请指出。
多谢多谢!

http://www.cprogramming.com/tutorial/const_correctness.html
http://www.highprogrammer.com/alan/rants/mutable.html  回复  更多评论
  

# re: Effective C++ 炒冷饭 - Item 3 const不离手 2009-12-16 00:14 陈梓瀚(vczh)
这么看来他们也不是谁包含谁的关系  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理