读书笔记Effective C++04[个人向]

1.尽可能延后变量定义式的出现时间,一旦出现变量的声明最好当场初始化(注意与赋值的区别),比如 string password("123456")。通过copy构造函数可以避免无意义的default构造行为。经常出现的一个情况是,变量如果需要在循环中使用,那么是应该定义在循环外然后每次复制,还是每次都在循环内部构造和析构呢?如果赋值的成本低于一组构造和析构,并且循环的次数很大时,在循环外定义大体上比较高效,否则应当使用在循环内定义。

2.强制类型转换的新式方法,如static_cast<type>这种,能够比较清晰地辨识出来。在C++中,基类的指针base* 和它的派生类的指针derived*都可以指向一个派生类对象object,可以使用base* temp=& object做一个隐式转换,但有时候这两个指针的值并不一样,会有一个偏移量作用在derived*身上,用以取得正确的base* 指针。(当然这种情况可能根据编译器的不同而出现差别)。

3.避免返回handles(引用、指针、迭代器)指向对象内部。一旦这种handle被传出去了,就是在暴露“handles比对象更长寿”的风险。应当将dangling handles的可能性降到最低。

4.异常安全性有两个条件:a、不泄露任何资源,比如上锁后对资源的操作失败确保可以再进行下一步解锁;b、不允许数据被破坏,比如即时对资源的操作失败了对象内的其他成员不会先改变等。

5.异常安全函数提供 以下三个保证:a、基本承诺:如果异常被抛出,没有任何对象或者数据会因此被破坏,所有对象都应该处于前后一致的状态。b、强烈保证:如果异常被抛出,程序的状态不改变。即函数失败以后,会恢复到调用函数之前的状态。c、不抛掷保证:承诺不抛出异常,因为他们总能干完被期待的活儿。比如相比较于std::nothrow,直接new如果失败要抛出异常的,结果就是为了健壮性代码里到处都是try。所以用new(nothrow)然后再判断是否为null就可以了。

6.使用inline能够免除函数调用成本,然而inline只是对编译器的一个申请,不是强制命令。inline函数一般位于头文件内,因为大多数编译器都是在编译器来做inline。

7.将文件间的编译依存关系降至最低,否则连串编译会对许多项目造成难以形容的灾难。使用声明的依存性替代定义的依存性。这正是编译依存最小化的本质,现实中让头文件尽可能自我满足,万一做不到就与其他文件中的声明式(而非定义式)相依存:

如果能使用一个reference/pointer就可以完成任务,就不要使用object,因为一旦用到object,就需要用到它的定义式了;如果能使用一个class的声明式,就不要使用定义式;为声明式和定义式提供不同的头文件。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值