Effective C++ 总结笔记(三)
三、资源管理
13.以对象管理资源
1.为了防止资源泄漏,请使用RAII对象,在构造函数里面获得资源,并在析构函数里面释放资源.
2. 引用计数型智慧指针(RCSP):持续追踪多少个指针指向该资源,无人指向他时自动删除该资源,如unique_ptr、shared_ptr和auto_ptr(现在已经没有了,可能改成weak_ptr)。
14.在资源管理类中小心copying行为
一般资源管理类复制时可以选择以下做法:
禁止复制(复制不合理)。
“引用计数法”(使用tr1::shared_ptr指定“删除器”阻止引用次数为0时的删除行为)。
复制底层资源(“深度拷贝”)。
转移底部资源的拥有权(auto_ptr)。
15.在资源管理类中提供对原始资源的访问
- APIs往往要求访问原始资源,所以每一个RAII class应该提供一个“取得其所管理之资源”的办法。
- 对原始资源的访问可能经由显示转换或隐式转换。一般而言显示转换比较安全,但隐式转换对客户比较方便。
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函数

- 如果你要为某个函数的所有参数(包括被this指针所指的那个隐喻参数)进行类型转换,啊、那么这个函数必须是个non-member。
- 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++ 总结笔记(三)的更多相关文章
- 《Effective C++》第三版笔记
阅读此笔记前,请先阅读 <Effective C++>第二版笔记 和 <More Effective C++>笔记 这里只记录与上面笔记不同的条款,主要是 "面对 ...
- Effective C++(第三版)笔记 ---- 第一部分让自己习惯C++
内容从侯捷译版的<Effective C++>(第三版)摘录 条款一 C++作为一个多种范式融合的语言,可以看成是语言的联邦,它包含了一下四种主要的次语言: C.C++以C为基础,很多时候 ...
- Effective STL 读书笔记
Effective STL 读书笔记 标签(空格分隔): 未分类 慎重选择容器类型 标准STL序列容器: vector.string.deque和list(双向列表). 标准STL管理容器: set. ...
- Effective STL读书笔记
Effective STL 读书笔记 本篇文字用于总结在阅读<Effective STL>时的笔记心得,只记录书上描写的,但自己尚未熟练掌握的知识点,不记录通用.常识类的知识点. STL按 ...
- Effective STL 学习笔记 39 ~ 41
Effective STL 学习笔记 39 ~ 41 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...
- Effective STL 学习笔记: Item 22 ~ 24
Effective STL 学习笔记: Item 22 ~ 24 */--> div.org-src-container { font-size: 85%; font-family: monos ...
- Effective STL 学习笔记 Item 21:Comparison Function 相关
Effective STL 学习笔记 Item 21:Comparison Function 相关 */--> div.org-src-container { font-size: 85%; f ...
- 《Effective Java》笔记45-56:通用程序设计
将局部变量的作用域最小化,可以增强代码的可读性和可维护性,并降低出错的可能性. 要使用局部变量的作用域最小化,最有力的方法就是在第一次使用它的地方才声明,不要过早的声明. 局部变量的作用域从它被声明的 ...
- Oracle学习笔记三 SQL命令
SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)
- 《CMake实践》笔记三:构建静态库(.a) 与 动态库(.so) 及 如何使用外部共享库和头文件
<CMake实践>笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE <CMake实践>笔记二:INSTALL/CMAKE_INSTALL_PREFIX &l ...
随机推荐
- YbtOJ#723-欧拉之树【莫比乌斯反演,虚树】
正题 题目链接:http://www.ybtoj.com.cn/contest/121/problem/2 题目大意 给出\(n\)个点的一棵树,每个点有一个权值\(a_i\),求 \[\sum_{i ...
- 深度学习|基于LSTM网络的黄金期货价格预测--转载
深度学习|基于LSTM网络的黄金期货价格预测 前些天看到一位大佬的深度学习的推文,内容很适用于实战,争得原作者转载同意后,转发给大家.之后会介绍LSTM的理论知识. 我把code先放在我github上 ...
- 利用Jackson序列化实现数据脱敏
几天前使用了Jackson对数据的自定义序列化.突发灵感,利用此方法来简单实现接口返回数据脱敏,故写此文记录. 核心思想是利用Jackson的StdSerializer,@JsonSerialize, ...
- python日志配置及调用
0.日志基础操作 import logging logging.basicConfig( #1.日志输出的位置,终端和文件 filename='access.log', #,不指定默认打到终端上 #2 ...
- SphereEx 创始人张亮云咖访谈回顾:构建数据服务的新思路
2021 年 7 月 21 日,2021 亚马逊云科技中国峰会在上海盛大开幕.本次大会以"构建新格局,共赢云时代"为主题,邀请到来自技术社区.开源软件基金会.开源创业代表.女性开发 ...
- 七牛云的 python sdk 是如何 批量删除资源的
今天做项目的时候用到七牛云,关于对资源的操作是在后端做的,用的SDK,但是,在网上没找到详细的解析,官方文档也没有太详细的解说,所以无奈只好看下源码 这里做一下简单的记录 from qiniu imp ...
- 题解 [HAOI2017]方案数
题目传送门 Solution 我们没有障碍的时候很好做,直接设 \(f_{i,j,k}\) 表示到 \((x,y,z)\) \(x\) 有 \(i\) 位为 \(1\),\(y\) 有 \(j\) 位 ...
- 洛谷4035 JSOI2008球形空间产生器 (列柿子+高斯消元)
题目链接 qwq 首先看到这个题,感觉就应该从列方程入手. 我们设给定的点的坐标矩阵是\(x\),然后球心坐标\(a_1,a_2....a_n\) 根据欧几里得距离公式,对于一个\(n维空间\)的第\ ...
- SpringBoot整合JDBC-调用数据库
SpringData 对于数据访问层,无论是 SQL(关系型数据库) 还是 NOSQL(非关系型数据库),Spring Boot 底层都是采用 Spring Data 的方式进行统一处理. Sprin ...
- PTA习题6-8 统计一行文本的单词个数 (15分)
参考<c和指针>里面运用strtok函数打印空白标记符(如\n,\t)的程序改写而成的代码 在之前我自己写了一个60行的链表版本的统计程序 相比之下这个strtok函数的程序要简洁明了的多 ...