Effective C++ 总结笔记(四)

五、实现

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

尽可能延后变量定义式的出现,甚至应该尝试延后这份定义直到能够给他初值实参为止,这样不仅能避免构造和析构非必要对象,避免无意义的default行为,也可增加程序的清晰度并改善程序效率。

27.*尽量少做转型动作

const_cast通常被用来将对象的常量性移除,也是唯一有此能力的C++style转型操作符。

dynamic_cast主要用来执行“安全向下转型”,之所以需要dynamic_castc,是因为你想在一个你认定的派生类对象身上执行派生类操作函数,但你只有一个指向base class 的指针或引用,需要用这个来进行由上而下的转换(基类向下转换成子类)。

reinterpre_cast意图执行低级转型,实际动作取决于编译器。它可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针,不能将非32bit的实例转成指针。最普通的用途就是在函数指针类型之间进行转换,不可移植

static_cast用来强迫隐式转换,基本什么都可以转。但无法转const->non-const,这个只有const_cast才办到。适用范围最广的,适用于很多隐式转换,基本数据类型的转换,基类指针与子类指针的相互转换,或者添加const属性,任何类型转换为void类型,static_cast在下行转换时不安全,是因为即使转换失败,它也不返回NULL ,而dynamic_cast转换失败会返回NULL;对于上行转换,dynamic_caststatic_cast是一样的

1. 如果可以,尽量避免转型,特别是在注重效率的代码中避免dynamic_cast;试着发展无需转型的替代设计

2. 如果转型是必要的,试着将它隐藏于某个函数后。客户可以调用该函数而不需要将转型放进他们的代码中。

3. 宁可使用C++-style转型,不要使用旧式转型(新式转型很容易辨识出来,而分门别类)

28.避免返回handles指向对象内部成分

避免返回handles(包括references、指针、迭代器)指向对象内部(包括成员变量和不被公开的成员函数),否则会破坏封装性,使const成员函数的行为矛盾,以及发生“空悬虚吊号牌码”。

29.为“异常安全”努力是值得的

当异常被抛出时,带有异常安全性的函数会:

  1. 不泄露任何资源
  2. 不允许数据败坏

异常安全函数提供一下三个保证之一:

  1. 基本承诺:如果异常被抛出,程序内的任何事物仍然保持在有效状态下。
  2. 强烈保证:如果异常被抛出,程序状态不改变。(如果调用失败程序会回到“调用函数之前的状态”)
  3. 不抛掷保证:承诺绝不抛出异常。

可能的话提供“nothrow保证”,当“强烈保证”不切实际时,就必须提供“基本保证”。

函数提供的“异常安全保证”通常最高只等于其所调用之各个函数的“异常安全保证”中的最弱者

30.透彻了解inlining的里里外外

1. Public内的成员函数默认是inline,inline函数在大多数C++程序中是编译器行为。

2. 大部分编译器拒绝太过复杂的(例如带有循环或者递归)的函数inline,而对所有的virtual函数的调用都会是inlie落空。

3. Inline意味着执行前会将调用动作替换为被调用函数的主体,需要额外空间,会使代码膨胀。

  1. 一个表明inline函数实际是否inline取决于编译器。inline只是给编译器的建议,大部分的

编译器拒绝将太过复杂的函数inlining,隐喻方式是将函数定义于class定义式内

随着程序库的升级,inline函数需要重新编译,而non-inline函数只需重新连接

将大多数inlining限制在小型、被频繁调用的函数身上。

Template的具现化与inlining无关(Template放在头文件只是因为一般在编译器完成具现化动作)

31.将文件间的编译依存关系降至最低

正确做法:

编译依存最小化的设计策略:

1、如果使用object references或object pointers可以完成任务,就不要用objects

2、如果能够,以class声明式替换class定义式

3、为声明式和定义式提供不同的头文件

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值