《Effective C++》实现 章节
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++》实现 章节的更多相关文章
- More Effective C++ - 章节二 : 操作符(operators)
5. 对定制的 "类型转换函数" 保持警觉 允许编译器执行隐式类型转换,害处多过好处,不要提供转换函数,除非你确定需要. class foo { foo(int a = 0, in ...
- More Effective C++ - 章节一 : 基础议题
1. 仔细区分 pointers 和 references references和pointers的差别描述如下: pointer:当需要考虑"不指向任何对象"时,或者是考虑&qu ...
- Effective前端2:优化html标签
div { float: left; } .keyboard > div + div { margin-left: 8px; } --> div{display:table-cell;ve ...
- Effective Java 电子书 apk版本下载
下载安装包以后,安装即可阅读该书了,并且实时展示每章节代码哦,并且可以运行哦,赶快下载体验吧. Effective Java中文第二版下载地址:下载 应用截图:
- effective java读书小记(一)创建和销毁对象
序言 <effective java>可谓是java学习者心中的一本绝对不能不拜读的好书,她对于目标读者(有一点编程基础和开发经验)的人来说,由浅入深,言简意赅.每一章节都分为若干的条目, ...
- effective c++ 思维导图
历时两个多月的时间,终于把effective c++又复习了一遍,比较慢,看的是英文版,之前看的时候做过一些笔记,但不够详细,这次笔者是从头到尾的翻译了一遍,加了一些标题,先记录到word里面,然后发 ...
- Effective Java通俗理解(下)
Effective Java通俗理解(上) 第31条:用实例域代替序数 枚举类型有一个ordinal方法,它范围该常量的序数从0开始,不建议使用这个方法,因为这不能很好地对枚举进行维护,正确应该是利用 ...
- 《Effective Objective-C 2.0》摘要
前一段时间将<Effective Objective-C 2.0>这本书浏览了一遍,说一下几个觉得比较有意思的知识点. 感觉这本书是ios开发必看的一本书,最基础的,以及稍微高阶一点的oc ...
- Effective Java 第三版——42.lambda表达式优于匿名类
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
- Effective前端1---chapter 1 HTML/CSS优化
最近在读高效前端:web高效编程与优化实践,借此本书的感受总结下前端代码与性能优化,纯属自己见解,如有错误,欢迎指出. 1.能用HTML/CSS解决的问题就不要用js 场景1:鼠标悬浮时显示 鼠标悬浮 ...
随机推荐
- nginx 通过IP访问项目
项目新需求,因为是小范围使用的网站,所以不打算配域名,直接通过IP访问当前项目. 环境: LNMP 一键集成环境 当前IP指向的目录 :/home/wwwroot/default/ 但是我的项目.需要 ...
- Python学习三天计划-1
一.第一个Python程序 配置好环境变量后 打开CMD(命令提示符)程序,输入Python并回车 然后,在里面输入代码回车即可立即执行 Python解释器的作用是 将Python代码翻译成计算机认识 ...
- 怎样在GitHub上建立仓库、以及怎样实现分支代码的合并。保姆级别的教程
GitHub官网地址:https://github.com/ 注意:前提是已经注册了GitHub 文章目录 第一步:创建一个新的仓库 第二步.创建一个分支 第三步.编辑和发布更改的内容 第四步.拉取请 ...
- 【第1篇】人工智能(AI)语音测试原理和实践---宣传
前言 本文主要介绍作者关于人工智能(AI)语音测试的各方面知识点和实战技术. 本书共分为9章,第1.2章详细介绍人工智能(AI)语音测试各种知识点和人工智能(AI)语音交互原理:第3.4章介绍人工智 ...
- 7. url反向解析和静态文件
一.代码中url出现的位置 1.模版[html]中 1.<a href='urk'>超链接点击跳转<a/> 2.<form action='url' method='po ...
- Codeforces Round #830 (Div. 2) A-D
比赛链接 A 题解 知识点:贪心,数论. 先求出序列最大公约数 \(d\) ,如果为 \(1\) 直接输出 \(0\) . 否则,尝试用最后一个数操作, \(gcd(d,n) = 1\) 则可以,花费 ...
- Arctic 基于 Hive 的流批一体实践
背景 随着大数据业务的发展,基于 Hive 的数仓体系逐渐难以满足日益增长的业务需求,一方面已有很大体量的用户,但是在实时性,功能性上严重缺失:另一方面 Hudi,Iceberg 这类系统在事务性,快 ...
- 搭建harbor私有仓库
2-1.项目说明 Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器,由VMware开源,其通过添加一些企业必需的功能特性,例如安全.标识和管理等,扩展了开源 Docke ...
- scrapy出现SSL问题 如何解决? <twisted.python.failure.Failure OpenSSL.SSL.Error: [('SSL routines', '', 'unsafe legacy renegotiation disabled')]>
问题:<twisted.python.failure.Failure OpenSSL.SSL.Error: [('SSL routines', '', 'unsafe legacy renego ...
- 定位java程序中占用cpu最高的线程堆栈信息
找出占用cpu最高的线程堆栈信息 在java编码中,有时会因为粗心导致cpu占用较高的情况,为了避免影响程序的正常运行,需要找到问题并解决.这里模拟一个cpu占用较高的场景,并尝试定位到代码行. 示例 ...