Note of Justin

关于工作和读书的笔记

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

留言簿(14)

搜索

  •  

积分与排名

  • 积分 - 51740
  • 排名 - 433

最新评论

阅读排行榜

评论排行榜

[原创文章欢迎转载,但请保留作者信息]
Justin 于 2009-12-31


好吧,我承认2009最后一天我做了一次标题党……因为此条规是读到现在感觉写得最糊涂的一条,理解起来自然也是稀里糊涂。所以需要“骗”来更多的高手来找碴:) 真实的题目应该是尽量少用类型转换。

大师先是复习了一下类型转换的三种形式(前面两种都是C风格的旧式类型转换):
  1. (类型) 表达式
  2. 类型(表达式)
  3. C++风格的类型转换
既然是Effective C++,自然要重点介绍后者。当然,大师也提倡用新的工具,因为:
  • 容易程序中找到发生类型转换的代码(通过搜索转换关键字)
  • 新风格的类型转换细化了不同种类的类型转换,有利于编译器发现可能的错误(编译器啊编译器……)
C++风格的类型转换有以下四种:(具体用处参考primer之类的字典……)
  • const_cast:设置或是去除对象的const属性。
  • dynamic_cast:主要用于继承关系层次中的向上、向下转换,以及类之间的交叉转换。会进行转换安全性检查。
  • static_cast:可用于内置类型的转换,以及继承关系层次中的向上转换。没有转换安全性检查。
  • reinterpret_cast:简单的强制将一个指针转换为另外一种指针或整数类型,不做任何检查。
但是,这里要说的是尽可能的避免动用类型转换。因为:
  • 类型转换还可能引发额外的代码运行。比如说dynamic_cast就会通过调用strcmp来比较类的名称,从而完成继承关系中不同类对象的转换,这个时候就不仅仅是简单的变变类型了。因此,说“类型转换仅是告诉编译器把一种类型的数据当成另外一种来参与计算”其实是一个理解上的误区。
  • 类型转换也有可能带来额外开销:比如书中用static_cast进行的继承关系的向上转换,就会自作主张地生成一个临时的对象。
  • 在C++中,两个指向同一个对象的不同指针可能拥有不同的地址值。【不理解,书上也没有例子,股沟了很久也没有答案,还请赐教】
因此,不仅要尽可能的避免转换类型,而且在不得不使用类型转换的时候,也应该考虑将转换的代码用函数封装起来。
posted on 2010-01-22 09:04 Justin.H 阅读(313) 评论(1)  编辑 收藏 引用 所属分类: Effective C++ 炒冷饭

Feedback

# re: Effective C++ 炒冷饭 - Item 27 珍爱生命 远离类型转换 2010-03-14 20:40 Euan
【两个指向同一个对象的不同指针可能拥有不同的地址值】
常见的像多重继承:
class point 2d{...}
class point 3d : public point2d{...}
class vertex{...}
class vertex3d : public point3d, public vertex{...}

vertex3d v3d;
vertex *pv = &v3d;
point2d *p2d = &v3d;
point3d *p3d = &v3d;

经编译器转化后可能这样:

pv = (vertex*)(((char*)&v3d) + sizeof( point3d ));

而 p3d、p2d 只是简单拷贝v3d的地址就行了。

---------------------
详细可以参看《深度探索C++对象模型 (Inside The C++ Object Model)》
  回复  更多评论
  


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