《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:鼠标悬浮时显示 鼠标悬浮 ...
随机推荐
- Dubbo 02: 直连式
直连式 需要用到两个相互独立的maven的web项目 项目1:o1-link-userservice-provider 作为服务的提供者 项目2:o2-link-consumer 作为使用服务的消费者 ...
- Ubuntu安装错误 server64 busybox-initramfs安装失败
因为想试试在Linux系统上爆破 所以安装了一下Ubuntu.第一次安装包报了个server64 busybox-initramfs.在安装系统那边.我一直还以为是我磁盘分配错了. 后来在网上找了资料 ...
- JavaBean组件<jsp:forward>动作<jsp:param>动作登录页面输入用户名和密码,然后进入检查页面判断是否符合要求,符合要求跳转到成功界面,不符合要求返回登录界面,显示错误信息。
JavaBean组件 JavaBean组件实际是一种java类.通过封装属性和方法成为具有某种功能或者处理某个业务的对象. 特点:1.实现代码的重复利用.2.容易编写和维护.3.jsp页面调用方便. ...
- coding上创建项目、创建代码仓库、将IDEA中的代码提交到coding上的代码仓库、Git的下载、IDEA上配置git
文章目录 一.Git的安装以及子啊IDEA上配置Git(下载好的可以跳过) 二.怎样让IDEA和Git建立关系 三.在coding上创建项目 四.在coding上创建代码仓库 五.Git工作理论 六. ...
- 驱动开发:内核枚举Registry注册表回调
在笔者上一篇文章<驱动开发:内核枚举LoadImage映像回调>中LyShark教大家实现了枚举系统回调中的LoadImage通知消息,本章将实现对Registry注册表通知消息的枚举,与 ...
- LcdTools如何导出内置画面为bmp图片
运行LcdTools,先设置好图片所需分辨率参数,点击"画面设置"栏,修改下图所示参数 点击"画面设置"栏,在"画面资源"栏找到需要导出的画 ...
- GIT入门与Gitee的使用
一:Git是什么? Git是目前世界上最先进的分布式版本控制系统. 工作原理 / 流程: Workspace:工作区Index / Stage:暂存区Repository:仓库区(或本地仓库)Remo ...
- Django Admin save 重写 保存
在 django admin管理控制台中,用户按下"Save and add another",表单的字段值仍然填充最后插入的值 并且保存 在ModelAdmin中添加选项save ...
- day11-Servlet01
Servlet01 官方api文档:https://tomcat.apache.org/tomcat-8.0-doc/servletapi/index.html Servlet和Tomcat的关系:一 ...
- JavaScript之数组高阶API—reduce()
一文搞懂JavaScript数组中最难的数组API--reduce() 前面我们讲了数组的一些基本方法,今天给大家讲一下数组的reduce(),它是数组里面非常重要也是比较难的函数,那么这篇文章就好好 ...