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


Item27:尽量少做转型动作

关于这一点,专门开了一个新的总结:

http://blog.csdn.net/m0_37316917/article/details/70037711


Item28:避免返回handles指向对象的内部成分

总结:

  • 避免返回handles(包括引用,指针,迭代器)指向对象内部。遵守这条条款可增加封装性,帮助const成员函数的行为像个const,并将发生“虚吊号码牌”(dangling handles)的可能性降至最低。

Item29:为“异常安全”而努力是值得的

当异常被抛出时:

  • 不泄露任何资源。
  • 不允许数据破坏。

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

    • 基本承诺:如果异常抛出,程序内的任何事物依然保持在有效状态下。没有任何对象或数据结构会因此破坏。所有对象都处于一种内部前后一致的状态。然而程序的现实状态可能无法预料。举个例子,我们可以撰写changeBackground使得一旦有异常被抛出时,PrettyMenu对象可以继续拥有原背景图像,或者令它拥有一个默认的背景图像,但客户无法预期是哪一种情况,如果想知道,恐怕要调用某个成员函数的时候才能知道了。
    • 强烈保证:如果异常抛出,程序状态不改变。调用这样的函数需要有这样的认识:如果函数成功,就是完全成功,如果函数失败,程序就回到调用之前的状态。
    • 不抛掷(nothrow)保证:承诺绝对不抛出异常,因为它们总是能够完全它们原先承诺的功能。作用于内置类型(int等)身上所有的操作都提供nothrow保证。

      总结:
  • 异常安全函数即使发生异常也不泄露资源或允许任何数据破坏。这样的函数区分为三种可能:基本型,强烈型,不抛异常型。
  • “强烈保证型”往往能够以copy-and-swap实现出来,但“强烈保证”并非对所有函数都可实现或具备现实意义。
  • 函数提供的“异常安全保证”通常最高只等于其所调用的各个函数的“异常安全保证”中的最弱者。

Item30:透彻了解inline的里里外外

inline函数通常一定被置于头文件内,因为大多数环境在编译过程中进行inling,而为了将一个“函数调用”替换为“被调用的函数的本体”,编译器需要知道那个函数长什么样子,inling在大多数C++程序中是编译期行为。
大部分编译器拒绝太过复杂(例如带有循环或递归)的函数inling,而对所有的virtual函数调用(除非是最平淡无奇的)也都会使得inling落空。这应该不会令你惊讶,因为virtual意味着“等待,直到运行期才确定调用哪个函数”,而inling意味着“执行前先将调用的动作做替换为被调用函数的本体”。
inling函数无法随着程序的升级而升级,换句话说,如果f是程序库中的一个inling函数,客户将f函数本体编进程序中,一旦程序库设计者决定改变f,所有用到f的客户端程序都必须重新编译,这将是很大的负担,而如果f是个non-inline函数,一旦它有任何修改,客户端都只需要重新链接就好,远比重新编译的负担要小的多,如果程序库采用动态连接,升级版函数升值可以不知不觉地被应用进程吸纳。

总结:

  • 将大多数inling限制在小型、被频繁调用的函数上。这可使日后的调试过程和二进制升级更容易,也可使潜在的代码膨胀的问题最小化,使程序的运行速度最大化。
  • 不要只因为template function出现在了头文件,就将它声明为inline。

Item31:将文件间的编译依存关系降至最低

①如果使用object references或者object pointers可以完成任务,就不要使用objects,你可以只靠一个类型声明式就定义出指向该类型的references和pointers,但如果定义某类型的objects,就需要用到该类型的定义式。

②如果能够,尽量以class声明式替换class定义式,注意:当你声明一个函数而它用到某个class的时候,你并不需要该class的定义式,纵使函数以by value的方式传递该类型的参数(或者返回值)。

class Date;//class声明式
Date today;//没问题,这里并不需要Date的定义式
void clearAppoinment(Date d);//这里也不需要 但是在函数被调用之前,Date的定义式一定得被曝光才行

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

《Effective C++》实现 章节的更多相关文章

  1. More Effective C++ - 章节二 : 操作符(operators)

    5. 对定制的 "类型转换函数" 保持警觉 允许编译器执行隐式类型转换,害处多过好处,不要提供转换函数,除非你确定需要. class foo { foo(int a = 0, in ...

  2. More Effective C++ - 章节一 : 基础议题

    1. 仔细区分 pointers 和 references references和pointers的差别描述如下: pointer:当需要考虑"不指向任何对象"时,或者是考虑&qu ...

  3. Effective前端2:优化html标签

    div { float: left; } .keyboard > div + div { margin-left: 8px; } --> div{display:table-cell;ve ...

  4. Effective Java 电子书 apk版本下载

    下载安装包以后,安装即可阅读该书了,并且实时展示每章节代码哦,并且可以运行哦,赶快下载体验吧. Effective Java中文第二版下载地址:下载 应用截图:

  5. effective java读书小记(一)创建和销毁对象

    序言 <effective java>可谓是java学习者心中的一本绝对不能不拜读的好书,她对于目标读者(有一点编程基础和开发经验)的人来说,由浅入深,言简意赅.每一章节都分为若干的条目, ...

  6. effective c++ 思维导图

    历时两个多月的时间,终于把effective c++又复习了一遍,比较慢,看的是英文版,之前看的时候做过一些笔记,但不够详细,这次笔者是从头到尾的翻译了一遍,加了一些标题,先记录到word里面,然后发 ...

  7. Effective Java通俗理解(下)

    Effective Java通俗理解(上) 第31条:用实例域代替序数 枚举类型有一个ordinal方法,它范围该常量的序数从0开始,不建议使用这个方法,因为这不能很好地对枚举进行维护,正确应该是利用 ...

  8. 《Effective Objective-C 2.0》摘要

    前一段时间将<Effective Objective-C 2.0>这本书浏览了一遍,说一下几个觉得比较有意思的知识点. 感觉这本书是ios开发必看的一本书,最基础的,以及稍微高阶一点的oc ...

  9. Effective Java 第三版——42.lambda表达式优于匿名类

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...

  10. Effective前端1---chapter 1 HTML/CSS优化

    最近在读高效前端:web高效编程与优化实践,借此本书的感受总结下前端代码与性能优化,纯属自己见解,如有错误,欢迎指出. 1.能用HTML/CSS解决的问题就不要用js 场景1:鼠标悬浮时显示 鼠标悬浮 ...

随机推荐

  1. 最近无聊搭建一个齐博X1的下载页面

    https://layui.wanxiangsucai.com/ 用layui官方镜像站的模版 改了个齐博X1的下载页面 https://x1.wanxiangsucai.com/ 哈哈哈!!! 还有 ...

  2. vue3渲染函数(h函数)的变化

    vue3 渲染函数(h函数)的更改 h函数的更改总结 1==>h 现在全局导入,而不是作为参数传递给渲染函数 2==>渲染函数参数更改为在有状态组件和函数组件之间更加一致 3==>v ...

  3. 部署RAID 10

    额外添加4块硬盘,用于搭建RAID 10 检查linux的磁盘 [root@local-pyyu ~]# fdisk -l |grep '/dev/sd[a-z]' 磁盘 /dev/sda:21.5 ...

  4. 云原生之旅 - 6)不能错过的一款 Kubernetes 应用编排管理神器 Kustomize

    前言 相信经过前一篇文章的学习,大家已经对Helm有所了解,本篇文章介绍另一款工具 Kustomize,为什么Helm如此流行,还会出现 Kustomize?而且 Kustomize 自 kubect ...

  5. Java 动态代理原理图解 (附:2种实现方式详细对比)

    ​ 动态代理在 Java 中有着广泛的应用,例如:Spring AOP 面向切面编程,Hibernate 数据查询.以及 RPC Dubbo 远程调用等,都有非常多的实际应用@mikechen 目录 ...

  6. clang在编译时指定目标文件所需的最低macOS版本

    调研这个的原因,是因为有个同事在macOS 12.2上打包好的程序,放在macOS 10.15上运行时报错: Dyld Error Message:  Symbol not found: __ZNKS ...

  7. 又拍云之 Keepalived 高可用部署

    在聊 Keepalived 之前,我们需要先简单了解一下 VRRP.VRRP(Virtual Router Redundancy Protocol)即虚拟路由冗余协议,是专门为了解决静态路由的高可用而 ...

  8. getAddress和getHostAddress的区别

    getAddress方法和getHostAddress类似,它们的唯一区别是getHostAddress方法返回的是字符串形式的IP地址,而getAddress方法返回的是byte数组形式的IP地址.

  9. NC-UClient下载安装应用详解

    aliases: [] tags : " #NC " summary: [UClient下载安装NCC应用详解] product: [NCX] author : [yaenli] ...

  10. C#自定义控件开发(1)

    自定义控件可以用组件或者用户控件来开发,如果是基于基础控件,进行一些扩展,那么可以使用组件,其它的情况可以使用用户控件. 首先新建一个类库项目,然后添加一个组件,取名为ButtonExtend,再添加 ...