三、资源管理

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. 深入浅出WPF-09.Command(命令)

    命令 1)命令系统的基本元素 命令(Command),WPF的命令实际上就是实现了ICommand接口的类,平时使用最多的是RoutedCommand类 命令源(Command Source),即命令 ...

  2. Cnblogs 主题2

    洪卫:https://www.cnblogs.com/shwee/p/9060226.html https://sunhwee.com 1 #header{display:none;} /* 将默认的 ...

  3. 3-等待线程终止的join方法

    等待线程终止的join方法 在项目实践中经常会遇到一个场景,就是需要等待某几件事完成之后才能继续往下执行,比如线程加载资源等等. package com.heiye.learn1; public cl ...

  4. 如何在前端通过JavaScript创建修改CAD图形

    背景 在之前的博文CAD图DWG解析WebGIS可视化技术分析总结.CAD_DWG图Web可视化一站式解决方案-唯杰地图-vjmap中讲解了如何把CAD的DWG格式的图纸Web可视化的方案,那在Web ...

  5. AES解密尾部出现乱码问题

    说明 在使用AES解密的时候我发现解密出来的字符串尾部一直都有乱码 解决方案 尾部字符串的ascii码就是删除位索引 具体代码: cryptor = AES.new('AES_KEY'.encode( ...

  6. NOIP模拟80

    学考+OJ改名祭 T1 邻面合并 解题思路 状压 DP ...(于是贪心竟然有 60pts 的高分?? code) 状态设计的就非常妙了,如果状态是 1 就表示是一个分割点也就是一个矩形的右边界. 那 ...

  7. 全连接层dense作用

    参考来源

  8. MacOS安装使用Kettle

    一.环境说明 操作系统版本:macOS Big Sur 11.6.1 机型:Intel版本 JDK版本:Amazon Corretto-openjdk8 Kettle版本:Kettle8.9 二.问题 ...

  9. BUAA软件工程个人作业-软件案例分析

    BUAA个人博客作业-软件案例分析 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 软件案例分析 我在这个课程的目标是 学习开发软件的能力 这个作 ...

  10. 空格替换 牛客网 程序员面试金典 C++ Python

    空格替换 牛客网 程序员面试金典 C++ Python 题目描述 请编写一个方法,将字符串中的空格全部替换为"%20".假定该字符串有足够的空间存放新增的字符,并且知道字符串的真实 ...