《C++ primer(第四版)》读书笔记4-编码规范

  • 编写良好的泛型代码(534)
编写模板代码时,对实参类型的要求尽可能少是有益的

1)模板的形参是const引用(可以支持那些不支持复制构造函数类型的类;对于大类型对象,速度更快,因为不是复制整个对象传递)
2)函数体中的测试只用<比较


  • C++程序员应习惯于优先使用!=而不是<来编写循环判断条件(82,535)
C++程序员经常会遇到标准库的内容。标准库中的类及泛型算法大多定义为模板类及模板函数,它们的实例化版本是否合法取决于用作模板实参的类型是否支持模板所要求的操作。而对于用作模板实参的类型而言,支持相等操作(==和!=)的可能性比支持关系操作(如<)的可能性更大,因此使用!=而不用<这一习惯,更有利于保证所编写程序的正确性


  • 如果一个类定义了operator==,则也应该定义operator!=(535-16.18)


  • for (vector<int>::size_type ix=0;ix!=ivec.size();++ix) (82)
         ivec[ix]=0;

调用size成员函数而不保存它返回的值。在C++中,有些数据结构(如vector)可以动态增长。上例中循环仅需要读取元素,而不需要增加新的元素。但是,循环可以容易增加新元素,如果确实增加了新元素的话,那么测试已保存的size值作为循环的结束条件就会有问题,因为没有将新加入的元素计算在内,所以我们倾向于每次循环中测试size的当前值,而不是在进入循环前,存储size值的副本。
   像size这样的小库函数几乎都定义为内联函数,所以每次循环过程中调用它的运行时代价是比较小的。



  • 只有在必要时,才使用后置操作符(p140)
 有使用C语言背景的读者可能会觉得奇怪,为什么要在程序中使用前自增操作。道理很简单,因为前置操作需要做的工作更少,只需加1后返回加1后的结果即可。而后置操作符则必须先保存操作数原来的值,以便返回未加1之前的值作为操作的结果。对于int类型对象和指针,编译器可优化掉这项额外工作。但是对于更多的复杂迭代器类型,这种额外工作可能会花费更大的代价。因此,养成使用前置操作这个好习惯,就不必担心性能差异的问题。


  • 使用直接初始化而不是复制初始化来初始化对象(p42)
对于内置类型,两者是一样的。但对于类类型对象,两者有细微差别,具体要看编译器,所以建议使用直接初始化。(vs2008会优化,性能没有差别)


  • 将友元声明成组地放在类定义的开始或接尾是个好主意(p397)

  • 按照与成员声明一致的次序编写构造函数初始化列表是个好主意。此外,尽可能避免使用成员来初始化其他成员。(p390)

  • 一旦删除了指针指向的对象,立即将指针置为0,这样就非常清楚地表明指针不在指向任何对象(p152)

  • 将数组形参直接定义为指针要比使用数组语法定义更好。这样就明确表示,函数操纵的是指向数组元素的指针,而不是数组本身。由于忽略了数组长度,形参定义中如果包含了数组长度则特别容易引起误解(p207)


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值