高效effective C++ 55条款之个人学习笔记二

条款11:在operator=里面处理自我赋值

该条款确保对象自我赋值的时候operator=有很好的行为,必须对对象进行判断,比较。注意Copy and swap技术,

还有注意当函数操作多个对象的时候,也能对其进行判断。

条款12: 复制对象的时候勿忘其每一个成分

对于对象的复制我们必须要保证其完整性,那么关键地方就在于copy构造和=赋值操作的时候,必须做到每个数据

成员全部复制到新的对象。特别注意当继承子类复制的时候,必须将父类每个成员考虑到,两种方式考虑,一种

记得加上初始化父类成员列表,一种就是从父类每个成员进行复制开始,逐层递进,这是一种比较良好的方法。

条款13:以对象管理资源

对象资源管理是一种比较直接易懂的资源管理方法。建立在C++对构造函数,析构函数,copying函数的基础上,

只要经过训练后,遵守这些方法,实践研发过程中基本会消除资源管理问题。RAII(Resource Acquisition Is

Initialization)这是一种资源管理,防止泄露的有效方法。常用的两个classes是tr1::shared_ptr类和 tr1:auto_ptr类。

RAII的本质内容是用对象代表资源,把管理资源的任务转化为管理对象的任务,将资源的获取和释放与对象的

构造和析构对应起来,从而确保在对象的生存期内资源始终有效,对象销毁时资源必被释放。换句话说,

拥有对象就等于拥有资源,对象存在则资源必定存在。

条款14: 在资源管理类中小心copying行为

该条款在你使用对象管理资源时候,有时候你不希望对象被复制,或者允许复制。那么你必须决定你的copying函数

是有编译器自动生成还是你自己进行定义。比如抑制copy或者使用计数法进行也是不错的选择。记得复制对象一定

要进行深度复制,将其每一个成员进行复制。

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

该条款是在当你需要通过这个资源管理对象对原始对象访问,操作时候必须考虑到的。

比如你要对class2中定义的class1的一些方法进行调用和操作。那么此时你必须在class2中提供一个对外的接口转换。

这样就有两种情况必须考虑。一种是显示转换函数如

class1 get(){return class1};另一种是隐式转换函数如 operator class1() const {return class1};

在这里一般显示转换比较直接,安全,但是隐式转换在使用的时候更直接。

条款16:成对使用new和delete时要采取相同形式

此条款在使用的时候,告诉我们我们平时new和delete默认调用的是operatornew和operatordelete函数。

(其实new和delete有好几种形式。比如说new有三种使用方式:plain new,nothrow new和placement new。

对应也有三种delete 我们默认是第一种)这里其实只需记住new []和delete[]要成对出现。

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

此条款提醒用户在调用的时候,特别是在函数参数传入的时候。如

ProcessWidget(new Widget,priority);

ProcessWidget(std::shared_ptr<Widget>(new Widget),priority)//注意此处。按照前面我们学习的资源管理条款,

为了防止泄露而将对象置于智能指针之内。这种思想没有问题,然后在这个参数传递的过程中,有一个很大的问题。

不同编译器参数压栈次序是不一样的。如果new成功了,接着执行priority函数失败返回。那么我们的对象指针就

彻底遗失了。从而导致了新的内存泄露。记住 必须独立的以单独语句进行对象置于智能指针之内。所以说有时候

简写代码不见得是好事。因为人为的导致了编译器编译参数的不确定性。

 

条款18:让接口容易被正确使用,不易被误用

C++接口包括,函数接口,类接口,模板接口等等。好的接口更加容易被使用,比如在类型创建和参数接口处理

时候,对其有效性和合法性进行验证,我们在设计的时候将进行一致性,兼容性判断。这样可以提高健壮性。

tr1::shared_ptr支持定制型删除器。注意这个可以防范dll问题,可以被用来自动解除互斥锁。

条款19:设计class犹如设计type

在这里你得宏观的考虑到你得类已经是一个新的类型。那么作为你自己设计的类。好的类设计你就得考虑很

多情况:新的type对象应该如何被创建和销毁,初始化和赋值的区别,type的数据成员合法值进行约束,type

需要配好的继承图系,type需要哪些转换,必须设计一个新的type类吗等等。

条款20:宁以pass-by-reference-to-const 替换pass-by-value

说到这个条款,要说明的是,C++默认的情况下传递参数是以副本形式。也就是会再创建一个临时的一样

的副本。在这里多数情况下,直接传递常量引用效率会更高,因为避免了副本的二次产生的开销。但是该

规则并不是适应所有情况,比如内置类型以及STL的迭代器和函数对象,它们以pass-by-value更合适恰当。

时间: 2024-10-25 20:37:39

高效effective C++ 55条款之个人学习笔记二的相关文章

高效effective C++ 55条款之个人学习笔记一

条款1:C++是一个语言体系 把C++语言作为一个成熟完整的语言体系,而不是单纯的C的扩展和延伸.因为它的特性比较广泛,比如面向对象,模板,标准库, 泛型编程等等.Object- oriented C++ .Template C++   STL containers, iterators,algorithms 条款2:尽量使用const,enum,inline替换#define关键字 这样我们可以使用编译器替换预编译器.因为预编译器会在编译之前,进行了替换,没有标记,不利用进行调试跟踪.(同时我

小猪的数据结构学习笔记(二)

小猪的数据结构学习笔记(二) 线性表中的顺序表 本节引言: 在上个章节中,我们对数据结构与算法的相关概念进行了了解,知道数据结构的 逻辑结构与物理结构的区别,算法的特性以及设计要求;还学了如何去衡量一个算法 的好坏,以及时间复杂度的计算!在本节中我们将接触第一个数据结构--线性表; 而线性表有两种表现形式,分别是顺序表和链表;学好这一章很重要,是学习后面的基石; 这一节我们会重点学习下顺序表,在这里给大家一个忠告,学编程切忌眼高手低,看懂不代表自己 写得出来,给出的实现代码,自己要理解思路,自己

spidering hacks 学习笔记(二)

看过去很乱,学习的记录东西而已,等我读完这本书,就把笔记给整理下!嘿嘿 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74

Caliburn.Micro学习笔记(二)----Actions

Caliburn.Micro学习笔记(二)----Actions 上一篇已经简单说了一下引导类和简单的控件绑定 我的上一个例子里的button自动匹配到ViewModel事件你一定感觉很好玩吧 今天说一下它的Actions,看一下Caliburn.Micro给我们提供了多强大的支持 我们还是从做例子开始 demo的源码下载在文章的最后 例子1.无参数方法调用 点击button把textBox输入的文本弹出来 如果textbox里没有文本button不可点,看一下效果图 看一下前台代码 <Stac

2. 蛤蟆Python脚本学习笔记二基本命令畅玩

2. 蛤蟆Python脚本学习笔记二基本命令畅玩 本篇名言:"成功源于发现细节,没有细节就没有机遇,留心细节意味着创造机遇.一件司空见惯的小事或许就可能是打开机遇宝库的钥匙!" 下班回家,咱先来看下一些常用的基本命令. 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/48092873 1.  数字和表达式 看下图1一就能说明很多问题: 加法,整除,浮点除,取模,幂乘方等.是不是很直接也很粗暴. 关于上限,蛤蟆不太清楚

JavaScript--基于对象的脚本语言学习笔记(二)

第二部分:DOM编程 1.文档象模型(DOM)提供了访问结构化文档的一种方式,很多语言自己的DOM解析器. DOM解析器就是完成结构化文档和DOM树之间的转换关系. DOM解析器解析结构化文档:将磁盘上的结构化文档转换成内存中的DOM树 从DOM树输出结构化文档:将内存中的DOM树转换成磁盘上的结构化文档 2.DOM模型扩展了HTML元素,为几乎所有的HTML元素都新增了innerHTML属性,该属性代表该元素的"内容",即返回的某个元素的开始标签.结束标签之间的字符串内容(不包含其它

马哥学习笔记二十四——分布式复制快设备drbd

DRBD: 主从 primary: 可执行读.写操作 secondary: 文件系统不能挂载 DRBD: dual primay, 双主(基于集群文件系统的高可用集群) 磁盘调度器:合并读请求,合并写请求: Procotol:drbd数据同步协议 A: Async, 异步  数据发送到本机tcp/ip协议栈 B:semi sync, 半同步  数据发送到对方tcp/ip协议 C:sync, 同步  数据到达对方存储设备 DRBD Source: DRBD资源 资源名称:可以是除了空白字符外的任意

【Unity 3D】学习笔记二十八:unity工具类

unity为开发者提供了很多方便开发的工具,他们都是由系统封装的一些功能和方法.比如说:实现时间的time类,获取随机数的Random.Range( )方法等等. 时间类 time类,主要用来获取当前的系统时间. using UnityEngine; using System.Collections; public class Script_04_13 : MonoBehaviour { void OnGUI() { GUILayout.Label("当前游戏时间:" + Time.t

Spring Batch学习笔记二

此系列博客皆为学习Spring Batch时的一些笔记: Spring Batch的架构 一个Batch Job是指一系列有序的Step的集合,它们作为预定义流程的一部分而被执行: Step代表一个自定义的工作单元,它是Job的主要构件块:每一个Step由三部分组成:ItemReader.ItemProcessor.ItemWriter:这三个部分将执行在每一条被处理的记录上,ItemReader读取每一条记录,然后传递给ItemProcessor处理,最后交给ItemWriter做持久化:It