《Exceptional C++》笔记(2)

来源:互联网 发布:ubuntu改变系统语言 编辑:程序博客网 时间:2024/04/30 00:02

 

  • 1 内存管理
  • 2 对象标识
  • 3 控制流程
1 内存管理
  1. operator new和operator delete永远都是静态成员函数!,因此最好显示第将这两个函数声明为静态函数,虽然C++并不会强制要求显式第使用static
  2. operator new和operator delete因为是一个静态函数,因此不能成为虚函数,但从行为上来看它们却像是虚函数,子类会调用正确的operator new和operator delete函数
  3. C++规定:传递给operator delete[]的指针的静态类型与动态类型必须是相同的.因此
        
    1. B* pb = new D[ 100 ]; 
    2. delete[] pb 
    3. //这段代码的行为是未定义的 

    而对operator delete和operator new,operator new[ ]则并无此限制. 因此,永远都不要通过多态的方式处理数组

  4. const autoptr意味着永远不会失去所有权,因此对一个const autoptr进行拷贝是非法的(autoptr的拷贝函数参数为非const引用).
2 对象标识
  1. 在编写拷贝赋值运算函数时,永远都不要指望能够通过对自我赋值进行检测来保证函数的正确性(当类operator&可以被重载);应该在拷贝赋值运算符函数中使用"创建临时对象并进行交换"的惯用法,折中方法不仅是异常安全的,而且在处理自我赋值时也是安全的.
  2. 可以将自我赋值检测作为一种优化手段,以避免不必要的工作,这也是正确的做法
  3. 在构造函数中进行自我赋值的检测是无意义的,因为我们的对象还在构造过程中,因此对象other与我们的对象不可能相等
  4. 在有些情况下,指针的比较运算与大多数人想象的不一样
    • 对字符串常量进行比较运算的行为未定义.因为C++标准明确指出,编译器可以在重叠的内存中存储字符串
    • 有时候,在通过内部的运算符<,<=,>,>=来比较裸指针时,不能得到明确定义的结果.
3 控制流程
  1. 在编译单元之间,全局变量(包括类的静态成员)的初始化顺序是未定义的 避免使用全局变量或静态变量.如果必须使用,那么一定要特别注意这些变量的初始化顺序
  2. 在多重继承中,子类按照从左到右顺序对非虚基类进行初始化,为了防止一个基类初始化时用到了另一个基类,另一个基类还未初始化的情况出现: 在构造函数的初始值列表中,应该把基类按照它们在类定义中出现的先后顺序进行排序
  3. 成员变量是按照它们在类定义中出现的先后顺序来进行初始化的: 在构造函数的初始值列表中,应该把成员变量按照它们在类定义中出现的先后顺序进行排序
  4. 对函数参数进行求值的顺序是未定义的: 在编写代码时,永远都不应该依赖函数参数的求值顺序
  5. assert()函数会在release版本中被去掉: 永远不要使代码的执行依赖于函数assert()的调用
Date: 2013-04-16 07:08:00 中国标准时间
Author:
Org version 7.8.11 with Emacs version 24

本文出自 “暗日” 博客,请务必保留此出处http://darksun.blog.51cto.com/3874064/1178917

0 0
原创粉丝点击