三、资源管理

13.以对象管理资源

1.为了防止资源泄漏,请使用RAII对象,在构造函数里面获得资源,并在析构函数里面释放资源.

2. 引用计数型智慧指针(RCSP):持续追踪多少个指针指向该资源,无人指向他时自动删除该资源,如unique_ptr、shared_ptr和auto_ptr(现在已经没有了,可能改成weak_ptr)。

14.在资源管理类中小心copying行为

一般资源管理类复制时可以选择以下做法:

禁止复制(复制不合理)。

“引用计数法”(使用tr1::shared_ptr指定“删除器”阻止引用次数为0时的删除行为)。

复制底层资源(“深度拷贝”)。

转移底部资源的拥有权(auto_ptr)。

15.在资源管理类中提供对原始资源的访问

  1. APIs往往要求访问原始资源,所以每一个RAII class应该提供一个“取得其所管理之资源”的办法。
  2. 对原始资源的访问可能经由显示转换或隐式转换。一般而言显示转换比较安全,但隐式转换对客户比较方便。

Shared_ptr等智能指针的get成员函数可以实现显式转换(安全,受欢迎)返回原始资源指针。

16.成对使用new和delete时采取相同的形式

new和delete对应,new[ ]和delete[ ]对应

17.以独立语句将newed对象置入智能指针

如果不这样做,一旦异常被抛出,有可能导致难以察觉的资源泄露。

四、设计与声明

18.让接口容易被正确使用,不易被误用

1.好的接口很容易被正确使用,不容易被误用;努力达成这些性质

2.“促进正确使用”的办法包括接口的一致性,以及与内置类型的行为兼容;“防治误用”的办法包括建立新类型,限制类型上的操作,束缚对象值,以及消除用户的资源管理责任

3.tr1::shared_ptr支持定制型删除器,可预防DLL问题,可被用来自动解除互斥锁等等

19.设计class犹如设计type

Class的设计就是type的设计,在定义一个新type之前,回顾本条款的问题。

20. 以pass-by-reference替换pass-by-value

1. 尽量以pass-by-reference-to-const替换pass-by-value,比较高效,并可避免切割问题

2. 对于内置类型,以及STL的迭代器和函数对象pass-by-value往往更高效

原因:缺省情况下C++以by value方式传递对象至函数。除非你另外指定,否则函数都是以实际实参的副本为初值,而调用端所获得的亦是函数返回值的副本,而这些副本是由对象的拷贝构造函数产出,会带来费时操作。

21.必须返回对象时,不要返回reference

1. 绝不要返回pointer或reference指向一个local stack对象(在函数退出前被销毁)

2. 不要返回pointer或reference指向一个heap对象(用户不知道如何delete)

3. 不要返回pointer或者reference指向local static对象而有可能需要多个这样的对象(同一行不能调用多次该函数,static只有一份)

22.将成员变量声明为private

1. 将成员变量隐藏在函数接口背后,可以为所有可能的实现提供弹性,例如可使得成员变量被读写时轻松通知其他对象、可以验证class的约束条件以及函数的前提和事后状态等。

2.切记将成员变量申明为private,这可具有语法的一致性、更精确的访问控制、封装、提供class作者充分的实现弹性等优点

3.protected并不比public更有封装性

如果不是private的。一旦需要改变客户的一些功能,就会破坏太多客户码(需要修改的代码更多)。

23.宁以non-member、non-friend替换member函数

1.愈多函数可访问它,数据的封装性就愈低,故member函数封装性差

2.将所有便利函数放在多个头文件内但隶属同一个命名空间,意味客户可以轻松扩展这一组便利函数,降低了编译依存性,这正是STL的做法

24.若所有参数皆需类型转换,请为此采用non-member函数

  1. 如果你要为某个函数的所有参数(包括被this指针所指的那个隐喻参数)进行类型转换,啊、那么这个函数必须是个non-member。
  2. Member函数的反面是non-member函数。

*25.考虑写出一个不抛异常的swap函数

1.提供一个public swap成员函数,让它高效置换你的两个类型的两个对象值

2.在你的class或template所在的命名空间内提供一个non-member swap,并令他调用上述swap函数。

3.如果你正在编写一个class,为你的class特化std::swap。并令它调用你的swap成员函数。

4.如果你调用swap,请包含using声明式,以便让std::swap在你的函数内曝光可见,然后不加namespace修饰符,赤裸裸的调用swap。

Effective C++ 总结笔记(三)的更多相关文章

  1. 《Effective C++》第三版笔记

    阅读此笔记前,请先阅读 <Effective C++>第二版笔记  和  <More Effective C++>笔记 这里只记录与上面笔记不同的条款,主要是 "面对 ...

  2. Effective C++(第三版)笔记 ---- 第一部分让自己习惯C++

    内容从侯捷译版的<Effective C++>(第三版)摘录 条款一 C++作为一个多种范式融合的语言,可以看成是语言的联邦,它包含了一下四种主要的次语言: C.C++以C为基础,很多时候 ...

  3. Effective STL 读书笔记

    Effective STL 读书笔记 标签(空格分隔): 未分类 慎重选择容器类型 标准STL序列容器: vector.string.deque和list(双向列表). 标准STL管理容器: set. ...

  4. Effective STL读书笔记

    Effective STL 读书笔记 本篇文字用于总结在阅读<Effective STL>时的笔记心得,只记录书上描写的,但自己尚未熟练掌握的知识点,不记录通用.常识类的知识点. STL按 ...

  5. Effective STL 学习笔记 39 ~ 41

    Effective STL 学习笔记 39 ~ 41 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...

  6. Effective STL 学习笔记: Item 22 ~ 24

    Effective STL 学习笔记: Item 22 ~ 24 */--> div.org-src-container { font-size: 85%; font-family: monos ...

  7. Effective STL 学习笔记 Item 21:Comparison Function 相关

    Effective STL 学习笔记 Item 21:Comparison Function 相关 */--> div.org-src-container { font-size: 85%; f ...

  8. 《Effective Java》笔记45-56:通用程序设计

    将局部变量的作用域最小化,可以增强代码的可读性和可维护性,并降低出错的可能性. 要使用局部变量的作用域最小化,最有力的方法就是在第一次使用它的地方才声明,不要过早的声明. 局部变量的作用域从它被声明的 ...

  9. Oracle学习笔记三 SQL命令

    SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)  

  10. 《CMake实践》笔记三:构建静态库(.a) 与 动态库(.so) 及 如何使用外部共享库和头文件

    <CMake实践>笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE <CMake实践>笔记二:INSTALL/CMAKE_INSTALL_PREFIX &l ...

随机推荐

  1. P5956-[POI2017]Podzielno【数学】

    正题 题目链接:https://www.luogu.com.cn/problem/P5956 题目大意 \(B\)进制下,给出序列\(a\),\(a_i\)表示数字\(i\)有多少个.求一个最大的\( ...

  2. NOIP模拟66

    T1 接力比赛 解题思路 其实就是一个背包 DP ,也没啥好说的也就是一个优化,每次枚举之前的前缀和. 比较妙的就是一个 random_shuffle 可以整掉部分卡人的数据(但是好像 sort 一下 ...

  3. 编译原理: FIRST(x) FOLLOW(x) SELECT(x)的计算

    目录 First计算 Follow计算 Select计算 已知文法G[S]: S→MH|a H→LSo|ε K→dML|ε L→eHf M→K|bLM 判断G是否是LL(1)文法. First计算 F ...

  4. 初识Tomcat源码

    Tomcat 部署的三种方式 打包成war包 部署到webapp目录录下 为什么要打包成war包,而不是jar包呢? 因为jar包可能是一个项目,也可能是一个依赖,Tomcat读取容易造成混淆.于是一 ...

  5. CAM 模板样式表

    视图 模板类型 模板子类型 类型 子类型 刀具类型 刀具子类型 加工工序 mill_planar FACE_MILLING_AREA 100 261     加工工序 mill_planar FACE ...

  6. .jar文件没有Java(TM) Platform SE binary打开方式解决办法

    下面是我个人在打开.jar文件时候的一些小问题: 明明已经配置好了环境变量.jar文件却没有 Java(TM) Platform SE binary 的打开方式, 网上查了资料点明是环境变量的问题,后 ...

  7. ThreadLocalRandom类原理分析

    1.Random类及其局限性 public int nextInt(int bound) { if (bound <= 0) throw new IllegalArgumentException ...

  8. 初学python写个自娱自乐的小游戏

    一.摘要 当编写完后的代码执行第一次后达到了目标的预期效果,内心有些许满足,但是当突发情况产生后,程序便不能正常运行,于是准备从简单的版本开始出发,综合考虑使用者的需求,和使用过程中会遇到的问题,一步 ...

  9. MySQL:提高笔记-1

    MySQL:提高笔记-1 学完基础的语法后,进一步对 MySQL 进行学习 说明:这是根据 bilibili 上 黑马程序员 的课程 mysql入门到精通 后做的笔记 1. 索引 1.1 索引概述 M ...

  10. Python Linux Ubuntu apt安装PyCharm

    PyCharm一个是Python集成开发环境,它既提供收费的专业版,也提供免费的社区版本.PyCharm带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,比如调试.语法高亮.Proj ...