三、资源管理

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. NOI.AC#2144-子串【SAM,倍增】

    正题 题目链接:http://noi.ac/problem/2144 题目大意 给出一个字符串\(s\)和一个序列\(a\).将字符串\(s\)的所有本质不同子串降序排序后,求有多少个区间\([l,r ...

  2. P4451-[国家集训队]整数的lqp拆分【生成函数,特征方程】

    正题 题目链接:https://www.luogu.com.cn/problem/P4451 题目大意 给出\(n\),对于所有满足\(\sum_{i=1}^ma_i=n\)且\(\forall a_ ...

  3. CF125E MST company (凸优化+MST)

    qwq自闭的一个题 我来修锅辣!!!!!! 这篇题解!可以\(hack\)全网大部分的做法!!! 首先,我们可以把原图中的边,分成两类,一类是与\(1\)相连,另一类是不与\(1\)相连. 原题就转化 ...

  4. 洛谷2120 [ZJOI2007]仓库建设(斜率优化dp)

    感觉和锯木厂那个题很类似的. 其实这个题还那个题唯一的区别就是\(dp\)转移式子中的\(f\)变成了\(g\) qwq不想多说了 直接看我的前一篇题解吧qwq #include<iostrea ...

  5. 洛谷3348 大森林 (LCT + 虚点 + 树上差分)

    这可真是道神仙题QWQ问了好多\(dalao\)才稍微明白了一丢丢做法 首先,我们假设不存在\(1\)操作,那么对于询问的一段区间中的所有的树,他们的形态应该是一样的 甚至可以直接理解为\(0\)操作 ...

  6. C#开发BIMFACE系列48 Nginx部署并加载离线数据包

    BIMFACE二次开发系列目录     [已更新最新开发文章,点击查看详细] 在前一篇博客<C#开发BIMFACE系列47 IIS部署并加载离线数据包>中详细介绍了IIS部署并访问的完整步 ...

  7. 好程序员打造核心教培天团,着力培养IT高级研发人才

    随着数字化进程加快,各行各业数字化转型迫在眉睫,技术人才战略成为企业发力重点,IT高级研发人才已经成为企业的"核心资产",对企业发展起关键性作用,然而市场上高级研发人才极为稀缺.据 ...

  8. 异构智联Wi-Fi+蓝牙模组,连接快、准、稳!

    下班回家打开门,电灯.电视.空调.音响.电动窗帘.扫地机器人--一呼百应,有序开工,原本冰冷的房子立刻变成了温暖港湾.可以说,舒适便捷的智能设备已经完全融入了我们的生活中. 从单一场景.单一设备,到现 ...

  9. 初学Python-day8 案例2

    中奖率 1 import random 2 num = 123456 3 i = 1 4 while True: 5 win = random.randrange(100000, 999999) 6 ...

  10. SharkCTF2021 Babyhttp && get_or_lose

    两道web. Babyhttp: 直接dirsearch,发现同时存在git和bak泄露:经验证,git的没用. 访问index.php.bak, 下载源码: 抓包,改包,发包即可. get_or_l ...