设为首页 加入收藏

TOP

《Effective C++ 改善程序与设计的55个具体做法》读书笔记(三)
2023-07-23 13:26:27 】 浏览:77
Tags:Effective 程序与 计的
解隐式接口和编译器多态
  • classestemplates都支持接口(interface)接多态(polymorphism)。
  • classes而言接口时显式的(explicit),以函数签名为中心,多态则是通过virtual函数发生于运行期。
  • 对于templates参数而言,接口是隐式的(implicit),奠基于有效表达式。多态则时通过template具现化和函数重载 解析(function overloading resolution)发生于编译期。

条款42 了解typename的双重意义

  • 声明template参数时,前缀关键字classtypename可互换。
  • 请使用关键字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 metaprogrammingTPM,模板元编程)可将工作由运行期移到编译期,因而得以实现早期错误侦测和更高的执行效率。
  • TMP可被用来生成“基于政策选择组合”(based on combinations of policy choices)的客户定制代码,也可用来避免生成对某些特殊类型并不适合的代码。

8. 定制new和delete

条款49 了解new-handler的行为

  • set_new_handler允许客户指定一个函数,在内存分配无法获得满足时被调用。
  • Nothrow new是一个颇为局限的工具,因为它只适用于内存分配,后继的构造函数调用还是可能抛出异常。

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

  • 有许多理由需要写个自定义的newdelete,包括改善效能、对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++标准库的主要机能由STLiostreamslocales组成。并包含C99标准程序库。
  • TR1添加了智能指针(例如tr1::shared_ptr)、一般化函数指针(tr1::function)、hash-based容器(unorderd_map,unordered_set)、正则表达式(regular expressions)以及另外10个组件的支持。
  • TR1自身只是一份规范。为了获得TR1提供的好处,你需要一份实物。一个好的实物来源时Boost

条款55 让自己熟悉Boost

  • Boost是一个社群,也是一个网站。致力于免费、源码开放、同僚复审的C++程序库开发。BoostC++标准化过程中扮演深具影响力的角色。
  • Boost提供许多TR1组件的实现品,以及其他许多程序库

关注我,带你21天“精通”C++!(狗头)

首页 上一页 1 2 3 下一页 尾页 3/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇LCP 与 height 下一篇C++面试八股文:如何避免死锁?

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目