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. NVIDIA Isaac Gym安装与使用

    NVIDIA做的Isaac Gym,个人理解就是一个类似于openai的Gym,不过把环境的模拟这个部分扔到了GPU上进行,这样可以提升RL训练的速度. 官网:https://developer.nv ...

  2. 齐博x1万能数据统计接口

    为何叫万能数据统计接口呢?因为可以调用全站任何数据表的数据总条数,并且可以设置查询条件http://qb.net/index.php/index/wxapp.count.html?table=memb ...

  3. 七、Ajax请求

    七.Ajax请求 客户端(浏览器)向服务端发起请求的形式: 地址栏:GET 超链接标签:GET form表单:GET或POST Ajax(重要):GET或POST或PUT或DELETE AJAX(As ...

  4. SpringBoot&MyBatisPlus

    5. SpringBoot 学习目标: 掌握基于SpringBoot框架的程序开发步骤 熟练使用SpringBoot配置信息修改服务器配置 基于SpringBoot完成SSM整合项目开发 5.1 入门 ...

  5. jvm双亲委派机制详解

    双亲委派机制 ​ 记录一下JVM的双亲委派机制学习记录. 类加载器种类 ​ 当我们运行某一个java类的main方法时,首先需要由java虚拟机的类加载器将我们要执行的main方法所在的class文件 ...

  6. ansible回调插件介绍(待完成)

    简介 ansible回调插件(callback plugins)允许为事件添加一些额外响应.这里的事件包括了执行任务(task)的结果,例如(ok.failed.unreachable.skipped ...

  7. MvvmLight框架的基本使用

    关于MvvmLight框架的介绍可以看这篇,说的很详细,在此记录下来以作复习,通过一个简单的例子说明MvvmLight的基本使用 https://www.cnblogs.com/3xiaolonglo ...

  8. Java项目有可能做到所有的代码逻辑均可热部署吗?

    前言 首先我们明确下什么叫做热部署,热部署是在不重启java虚拟机的前提下,自动更新class的行为,从而更新整个运行时的逻辑. 在java开发领域,热部署一直是一个难以解决的问题,java虚拟机理论 ...

  9. 【Java并发002】使用级别:线程同步与线程通信

    一.前言 本文介绍Java多线程技术,分为五个部分:多线程的两种实现方式--继承Thread类和实现Runnable接口:线程同步应用:三人吃苹果:线程同步+线程通信应用之一:生产者-消费者问题:线程 ...

  10. JavaEE Day01 基础加强

    今日内容 1.Junit单元测试(测试类) 2.反射 3.注解 一.Junit单元测试 1.概述 测试分类 1. 黑盒测试:不需要写代码,给输入值,看程序是否能够输出期望的值 2.白盒测试:需要写代码 ...