Effective C++读书笔记(五)

条款26: 尽可能延后变量定义式的出现时间

  • 增加程序的清晰度
  • 改善程序效率:只进行必要的操作

条款27: 尽量少做转型操作

四种新式转型:

  • const_cast(expression): 可移除const特性
  • dynamic_cast(expression): 安全向下转型,可用于检测继承体系
    • 此转型的目的是需要执行一个derived class操作函数,而手里只有一个指向base的pointer或reference,只能靠这个来处理对象
    • dynamic的执行速度很慢,尽量避免
  • reinterpret_cast(expression): 低级转型,实际动作可能取决于编译器。(用的较少)
  • static_cast(expression): 强迫隐式转换,各种转型(和reinterpret_cast相比相对安全)

  • 在c++中,一个对象在转型时会计算一个偏移量,这样对象就可能拥有一个以上的地址,而对象的布局方式和地址计算方式随编译器的不同而不同,所以有些”由于知道对象如何布局”而设计的转型可能不会在所有平台都适用

  • 转型会创建一个副本!如果想对对象本身调用转型后的操作不能直接转型再调用!
  • 如果转型是必要的,尽量将其隐藏于某个函数背后。客户随后可以调用该函数,而不需将转型放进他们自己的代码内
  • 宁肯使用C++-style(新式转型),不要使用旧式转型。前者容易辨别并有着分门别类的职责

条款28: 避免返回handles指向对象内部成分

  • 如果对象的一个get函数返回了一个私有成员变量的普通指针/引用,客户可以修改私有成员变量的值,这是不合理的
  • 如果怕返回的是一个const类型的指向私有变量的指针/引用,可以避免客户修改,但可能会造成dangling handles问题: 临时对象销毁后指针变成空悬状态

条款29: 为”异常安全”努力绝对值得

  • 当异常被抛出时,带有异常安全性的函数会:
    • 不泄露任何资源
    • 不允许数据败坏
  • 三种可能保证:基本型,强烈型,不抛异常型
  • “强烈保证”异常安全策略: copy-and-swap,但并非对所有函数都可实现或具备实际意义
  • 函数或系统提供的异常安全保证通常最高只等于其调用的各个函数的”异常安全保证”中的最弱者