《Effective C++》笔记 条款41-条款55

条款41,了解隐式接口和编译期多态

以不同的template参数具现化会导致调用不同的函数,这便是所谓的编译器多态。
classer和templates都支持接口interfaces和多态polymorphism。
对classes而言接口是显示的explicit,以函数签名为中心。多态则是通过virtual函数发生于运行期。
对template参数而言,接口是隐式的implicit,奠基于有效表达式。多态则是通过template具现化和函数重载解析发生于编译期。

条款42,了解typename的双重意义

声明template参数时,前缀关键字class和typename可互换。
请使用关键字typename标识嵌套从属类型名称;但不得在base class lists(基类列)或member initialzation list(成员初值列)内以它作为base class修饰符。

条款43,学习处理模板化基类内的名称

可在derived class templates内通过“this->”指涉base class templates内的成员名称,或藉由一个明白写出的“base class 资格修饰符”完成。

条款44,将与参数无关的代码抽离templates

Templates生成多个classes和多个函数,所以任何template代码都不该与某个造成膨胀的template参数产生相依关系。
因非类型模板参数而造成的代码膨胀,往往可以消除,做法是以函数参数或class成员变量代替template参数。
因类型参数而造成的代码膨胀,往往可以降低,做法是让带有完全相同二进制表述的表现类型共享实现码。

条款45,运用成员函数模板接受所有兼容类型

请使用member function templates成员函数模板生成“可接受所有兼容类型”的函数。
如果你声明member templates用于“泛化copy构造”或“泛化assignment操作”,你还是需要声明正常的copy构造函数和copy assignment操作符。

条款46,需要类型转换时请为模板定义非成员函数

当我们编写一个class template,而它所提供之“于此template相关的”函数支持“所有参数之隐式类型转换”时,请为那些函数定义为“class template内部的friend函数”。

条款47,请使用traits classes表现类型信息

traits classes使得“类型相关信息”在编译期可用。它们以templates和“templates特化”完成实现。
整合重载技术(overloading)后,traits classes有可能在编译期对类型执行if…else测试。

条款48,认识template元编程

template metaprogramming可将工作由运行期移往编译期,因而得以实现早期错误侦测和更高的执行效率。
TMP可被用来生成“基于政策选择组合”的客户定制代码,也可用来避免生成对某些特殊类型并不适合的代码。

条款49,了解new-handler的行为

STL容器所使用的heap内存是由容器所拥有的分配器对象allocator objects管理,不是被new和delete直接管理。
set_new_handler允许客户指定一个函数,在内存分配无法满足时被调用。
Nothrow new是一个颇为局限的工具,因为它只适用于内存分配;后续的构造函数调用还是可能抛出异常。

条款50,了解new和delete的合理替换时机

可以替换缺省的new和delete原因有(1)为了检测运用错误(2)为了收集动态分配内存之使用统计信息(3)为了增加分配和归还的速度(4)为了降低缺省内存管理器带来的空间额外开销(5)为了弥补缺省分配器中的非最佳齐位(6)等等.

条款51,编写new和delete时需要固守常规

operator new应该内含一个无穷循环,并在其中尝试分配内存,如果它无法满足内存需求,就该调用new-handler。它也应该有能力处理0bytes申请。class专属版本则还应该处理“比正确大小更大的错误申请”。
operator delete应该在收到null指针时不做任何事。class专属版本则还应该处理“比正确大小更大的(错误申请)”。

条款52,写了placement new也要写place delete

当你写了一个placement operator new,请确定也写出了对应的placement operator delete。如果没有这样做,你的程序可能会发生内存泄漏。
当你声明placement new和placement delete,请确定不要无意识(非故意)地遮掩了它们的正常版本。

条款53,不要轻忽编译器的警告

条款54,熟悉标准程序库

条款55,熟悉boost

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值