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

来源:互联网 发布:matlab把cell变成矩阵 编辑:程序博客网 时间:2024/05/16 23:36




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

 

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

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

 

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

 

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

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

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

 

条款13:以对象管理资源

 

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

只要经过训练后,遵守这些方法,实践研发过程中基本会消除资源管理问题。RAIIResource 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:成对使用newdelete时要采取相同形式

 

此条款在使用的时候,告诉我们我们平时newdelete默认调用的是operatornewoperatordelete函数

(其实newdelete有好几种形式。比如说new有三种使用方式:plain newnothrow newplacement 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更合适恰当

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 泡过的莲子煮不烂怎么办 绿豆有煮不熟的怎么办 吃了羊肉吃西瓜怎么办 吃了狗肉和绿豆怎么办 做的衣柜没有门怎么办 蒸馒头熟了会瘪怎么办 3dmax贴图太大了怎么办 嘴皮边缘颜色深怎么办 嘴巴周围肤色暗沉怎么办 中奖彩票被洗了怎么办 牙龈下面长米粒肉疙瘩怎么办 书画印章盖反了怎么办 金龙鱼一个月不吃东西怎么办 罗汉鱼头撞扁了怎么办 房顶开槽埋线白色不一样怎么办 顶上灯挪位置线怎么办 马蜂窝弄掉又来怎么办 蜂窝弄掉又有怎么办 2018年小龙虾底板脏怎么办 一本分数线擦边过怎么办 玩具塑料球扁了怎么办 胶皮与海绵开了怎么办 安卓不支持flash了怎么办 看视频要加载flash怎么办 下水道管子铁皮破了怎么办 炸金花牌一样大怎么办 玩棋牌游戏输了怎么办 苹果7插耳机外放怎么办 出国种菠菜抓了怎么办 在菲做菠菜抓到怎么办 3串1中两个怎么办 微博账号封停怎么办 阴阳师账号被永久封停怎么办 寒刃2账号被禁用怎么办 输了好多钱我该怎么办 亲朋打鱼别处在玩怎么办 做糯米蛋的蛋清怎么办 水田地没耙地平怎么办 宝宝拉鸡蛋花样大便怎么办 电子琴伴奏区无旋律音怎么办 手机触摸屏摔坏了怎么办