More Effective C++ ——基础议题

条款1: 仔细区别Pointers和References

       均用于间接指向其他对象,pointer存储对象所在的地址(4个字节),reference实质上是对象的别名:

      1   显式区别:pointer定义时使用符号 ‘*’ ,reference定义时使用符号 ‘&’ (&用于指针表示取某个变量的地址,将其赋值给指针变量);Pointer访问指向的对象时使用 ‘->',reference 使用符号 ‘.’;

      2   NULL: pointer可以为NULL(C++11 为nullptr);reference不能为NULL值,因此reference必须有初值;

      3  效率:reference比pointer更富效率,因为在使用之前不需要测试其有效性(pointer使用前通常需要测试其是否为null);

      可重写: pointer可以被重新赋值,reference只能表示它初始化时的对象;

      实现某些操作符时(例如operator[]),一般使用reference作为返回值;

     结论:当需要指向某个变量且绝对不会指向其他变量时,或者当一个操作符其语法需求无法用pointer完成时,选用reference,其他时候选用pointer;

条款2: 最好使用C++转型操作符

    C旧式转型(语法格式:(type)expression )的缺点:

        1 转型不能明确地指明意图(几乎允许任何类型之间的相互转换);

        2 难以辨识(小括号和对象名称在C++任何地方都有可能被使用);

   四个新的转型操作符:

      static_cast(static_cast<type> expression):  基本上和旧式转型相同,有同样的意义和限制;   

                        (与旧式转换的区别,旧式转换还可以模拟const_cast,reinterpret_cast,但是static_cast不行)

      const_cast: 用于改变表达式的常量性或变易性

      dymanic_cast: 用于执行继承体系中“安全的向下转型或跨系转型动作”,并得知转型是否成功,若失败,会以一个null指针(当转型对                           象为指针)或exception(当转型对象为reference)表现出来;

                          只能用于集成体系中,无法应用在缺乏虚函数的类型上,也不能改变类型的常量性;

                          不涉及继承机制的类型执行转换动作,可使用static_cast;

                          (第二个用途:找出被某对象占用内存的起始点)

      reinterpret_cast: 与编译平台息息相关,因此不具移植性

                          最常用用途是转换“函数指针”类型

     使用新式转型的优点: 1 严谨,易辨识;   2 较容易解析,编译器也因此得以诊断

条款3:最好不要使用多态(polymorphically)方式处理数组

     多态和指针算术不能混用,数组对象几乎总会涉及到所有的指针算术运算,所以数组和多态不能混用!

     继承最重要的特性就是通过指向“base class objects”的pointers或references,来操作“derived class objects”,当进行指针算术运算或删除对象数组操作时,指针的偏移大小是根据base class大小进行操作,会造成意想不到的结果。

条款4:非必要不提供default constructor

     ?????(书没看懂)

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值