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. uoj348【WC2018】州区划分

    题目链接 直接讲吨吨吨给的标准做法吧.记\(f(i,j)\)表示各个州(可以重叠)的城市数量之和为i,这些州的并集为j的方案数,反正若有两个州之间有交集最后的\(|j|\)会不等于\(i\).有 \( ...

  2. Vue学习之--------Vue生命周期beforeCreate、created、beforeMount、mounted、beforeDestroy 。。。(图解详细过程)(2022/7/17)

    文章目录 1.Vue生命周期 1.1 概念 1.2 图解 2.钩子函数的用法说明 2.1 beforeCreate()和created()的详细讲述 2.1.1 方法说明 2.1.2 代码实例 2.1 ...

  3. Masked Label Prediction: Unified Message Passing Model for Semi-Supervised Classification

    背景 消息传递模型(Message Passing Model)基于拉普拉斯平滑假设(领居是相似的),试图聚合图中的邻居的信息来获取足够的依据,以实现更鲁棒的半监督节点分类. 图神经网络(Graph ...

  4. Python 多重继承时metaclass conflict问题解决与原理探究

    背景 最近有一个需求需要自定义一个多继承abc.ABC与django.contrib.admin.ModelAdmin两个父类的抽象子类,方便不同模块复用大部分代码,同时强制必须实现所有抽象方法,没想 ...

  5. ML-决策树

    信息增益 香农熵: 指混乱程度,越混乱,值越大 信息增益(information gain): 在划分数据集前后信息发生的变化称为信息增益(香农熵的差) 基尼不纯度也可度量集合的无序程度 香农熵的计算 ...

  6. pod(五):pod hook(pod钩子)和优雅的关闭nginx pod

    目录 一.系统环境 二.前言 三.pod hook(pod钩子) 四.如何优雅的关闭nginx pod 一.系统环境 服务器版本 docker软件版本 Kubernetes(k8s)集群版本 CPU架 ...

  7. FHQ Treap 详解

    鲜花 一些鲜花放在前面,平衡树学了很久,但是每学一遍都忘,原因就在于我只能 70% 理解 + 30% 背板子,所以每次都忘.这次我采取了截然不同的策略,自己按照自己的理解打一遍,大获成功(?),大概打 ...

  8. Java单例模式,看这一篇就够了

    在创建型设计模式中,我们第一个学习的是单例模式(Singleton Pattern),这是设计模式中最简单的模式之一. 单例是什么意思呢? 单例就是单实例的意思,即在系统全局,一个类只创建一个对象,并 ...

  9. 深入学习SpringBoot

    1. 快速上手SpringBoot 1.1 SpringBoot入门程序开发 SpringBoot是由Pivotal团队提供的全新框架,其设计目的是用来简化Spring应用的初始搭建以及开发过程 1. ...

  10. 畅联新设备接入情况:新增威隆NB烟感

    双美接入,应该是电信AEP平台的. ---------------------------------------------------------------------------------- ...