条款3:决不要把多态应用于数组
条款4:避免不必要的默认构造函数
- 一个类没有缺省构造函数:
.无法建立数组;
可利用非heap数组. A array[] ={A(1),A(2)};
但无法用在heap数组. 即: A* array = new A[2];
对于heap数组,用指针数组代替对象数组.
A*[] pArray = new A*[2];
for(int i=0;i<2;i++) pArray[i] = new A(i);
或placement new
A* raw = (A*) operator new[] (2* sizeof(A));
for(int i=0;i<2;i++) new(&raw[i]) A(i);
.无法在许多基于模板的容器类中使用,例如:数组模板类.
条款5:小心用户自定义的转换函数
隐式转换
- 单参数构造函数
- 隐式类型转换符
条款9:使用析构函数防止资源泄漏
条款10:防止构造函数里的资源泄漏
使用auto_prt对象代替成员指针: Image* image ---> auto_ptr m_image
条款24:理解虚函数、多重继承、虚基类以及RTTI所带来的开销
- 虚函数
.虚表
.虚指针
.无法使用inline特性 - 多重继承
.多个vptr&&vtbl(除自身外,每个基类一个) - RTTI
.运行时找到对象和类的有关信息. 存储在type_info的对象里.
条款34: 将非未类设计为抽象类
- dynamnic_cast 失败,bad_cast异常
- 大多数纯虚函数没有实现,纯析构函数是个例外.
条款34:理解如何在同一程序中混合使用C++和C
- 名变换,函数重载
应在C++编译器下使用 extern
#infde __cplusplus
extern "c"
{
void drwaline();
}
#endif
混合链接来自于不同编译器的obj文件,得到链接错误. - 静态初始化
在main前后,有大量代码被执行.但main必须由C++编写. - 动态内存分配
delete/free: strdup不在C/C++标准库中,到底使用哪一个释放内存.依据strdup来自哪一个库 - 数据结构的兼容性
C/C++之间传递数据.不可能让C函数了解C++的特性.
.确保C++/C产生兼容的obj文件
.将两种语言都使用的函数声明为extern 'c'
.尽量用C++写main