解隐式接口和编译器多态
classes 和templates 都支持接口(interface )接多态(polymorphism )。
- 对
classes 而言接口时显式的(explicit ),以函数签名为中心,多态则是通过virtual 函数发生于运行期。
- 对于
templates 参数而言,接口是隐式的(implicit ),奠基于有效表达式。多态则时通过template 具现化和函数重载 解析(function overloading resolution )发生于编译期。
条款42 了解typename的双重意义
- 声明
template 参数时,前缀关键字class 和typename 可互换。
- 请使用关键字
typename 标识嵌套从属类型名称;但不得在base class lists (基类列)或member initialization list (成员初始值列)内以它最为base class 修饰符。
条款43 学习处理模板化基类内的名称
- 可在
derived class templates 内通过this-> 指涉base class templates 内的成员名称,或由一个明白写出的“base class 资格修饰符”完成。
条款44 将与参数无关的代码抽离templates
Templates 生成多个classes 和多个函数,所有任何template 代码都不该与某个造成膨胀的template 参数产生相依关系。
- 因非类型模板参数(
non-type template parameters )而造成的代码膨胀往往可以消除,做法是以函数参数或class 成员变量替换template 参数。
条款45 运用成员函数末班接受所有兼容类型
- 请使用
member functions templates (成员函数模板)生成“可接受所有兼容类型”的函数。
- 如果你声明
member templates 用于“泛化copy 构造”或“泛化assignment 操作”,你还是需要声明正常的copy 构造函数和copy assignment 操作符。
条款46 需要类型转换时请为模板定义非成员函数
- 当编写一个
class template ,而它所提供的“与此template 相关的”函数支持“所有参数之隐式类型转换”时,请将那些函数定义为“class template 内部的friend 函数”。
条款47 请使用traits classes表现类型信息
Traits classes 使得“类型相关信息”在编译期可用。它们以template 和"template 特化"完成实现。
- 整合重载技术(
overloading )后,traits calsses 有可能在编译器对类型执行if...else 测试。
条款48 认识template元编程
Template metaprogramming (TPM ,模板元编程)可将工作由运行期移到编译期,因而得以实现早期错误侦测和更高的执行效率。
TMP 可被用来生成“基于政策选择组合”(based on combinations of policy choices )的客户定制代码,也可用来避免生成对某些特殊类型并不适合的代码。
8. 定制new和delete
条款49 了解new-handler的行为
set_new_handler 允许客户指定一个函数,在内存分配无法获得满足时被调用。
Nothrow new 是一个颇为局限的工具,因为它只适用于内存分配,后继的构造函数调用还是可能抛出异常。
条款50 了解new和delete的合理替换时机
- 有许多理由需要写个自定义的
new 和delete ,包括改善效能、对heap 运用错误进行调试、收集heap 使用信息。
条款51 编写new和delete时需固守常规
operator new 应该内含一个无穷循环,并在其中尝试分配内存,如果它无法满足内存需求,就该调用new-handler 。它也应该有能力处理0 byte 申请。class 专属版本则还应该处理“比正确大小更大的(错误)申请”。
operator delete 应该在收到null 指针时不做任何事。class 专属版本则还应该处理“比正确大小更大的(错误)申请”。
条款52 写了placement new也要写placement delete
- 当你写一个
placement operator new ,请确定也写出对应的placement operator delete 。如果没有这样做,你的程序可能会发生隐微而时断时续的内存泄露。
- 当你声明
placement new 和placement delete时,确定不要无意识(非故意)的掩盖了它们的正常版本。
9. 杂项讨论
条款53 不要轻忽编译器的警告
- 请严肃对待编译器发出的警告信息。努力在你的编译器的最高(最严苛)警告级别下争取“无任何警告”的荣誉。
- 不要过度依赖编译器的报警能力,因为不同的编译器对待事情的态度并不相同。一旦移植到另一个编译器上,你原本依赖的警告信息有可能消失。
条款54 让自己熟悉包括TR1在内的标准程序库
C++ 标准库的主要机能由STL 、iostreams 、locales 组成。并包含C99 标准程序库。
TR1 添加了智能指针(例如tr1::shared_ptr )、一般化函数指针(tr1::function )、hash-based 容器(unorderd_map,unordered_set )、正则表达式(regular expressions )以及另外10个组件的支持。
TR1 自身只是一份规范。为了获得TR1 提供的好处,你需要一份实物。一个好的实物来源时Boost 。
条款55 让自己熟悉Boost
Boost 是一个社群,也是一个网站。致力于免费、源码开放、同僚复审的C++ 程序库开发。Boost 在C++ 标准化过程中扮演深具影响力的角色。
Boost 提供许多TR1 组件的实现品,以及其他许多程序库
关注我,带你21天“精通”C++!(狗头)
|