本篇笔记包含 Term 30~35。
Term 30:Proxy classes(替身类、代理类)
Proxy classes 的作用:
- 多维数组,
operator []
返回次级数组 - 左值/右值的区分
- 压抑隐式转换
Term 31:让函数根据一个以上的对象类型来决定如何虚化
假设我们的一个函数,接收两个对象参数,需要根据具体两个对象来确定实施什么操作,几种思路:
- 虚函数 + RTTI(运行时期类型辨识):编写多个 if-else 的判断,判断对象类型再操作(可以遇见,这是个糟糕的做法,除非类别有限且固定)
- 只使用虚函数:重载不同的传入参数,函数体内调用
this
,则只需要维护单个参数的不同类型即可 - 仿照虚函数表,创建多个成员函数,效果类似上一条
- 使用“非成员(Non-Member)函数”,接收两个参数。初始化一个 map 存储不同类型对的函数指针,再非成员函数体中间接获取并调用这个函数指针
Term 32:在未来时态下发展程序
- 提供完整的 classes ——即使某些部分目前用不到。当新的需求进来,你不太需要回头去修改那些 classes
- 设计你的接口,使有利于共同的操作行为,阻止共同的错误
- 尽量使你的代码一般化(泛化),除非有不良的巨大后果
Term 33:将非尾端类(non~leaf classes)设计为抽象类(abstract classes)
这样可以阻止一些不可靠的行为,限制基类指针的行为。
Term 34:如何在同一个程序中结合 C++ 和 C
- 将双方都使用的函数声明为
extern "C"
- 如果可能,尽量在 C++中撰写 main
- new/delete 和 malloc/free 分开配对使用
- 将两个语言间的“数据结构传递”限制于 C 所能了解的形式;C++structs 如果内含非虚函数,倒是不受此限
Term 35:让自己习惯于标准 C++ 语言
尽量使用 C++ 风格和标准的库函数,语法等等