条款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更合适恰当。