七、模板与泛型编程

41.了解隐式接口和编译器多态

1.类和模板都支持接口和多态。

2.类的接口是显式定义的——函数签名。多态是通过虚函数在运行期体现的。

3.模板的接口是隐式的(由模板函数的实现代码所决定其模板对象需要支持哪些接口),多态通过模板具现化和函数重载解析在编译期体现,也就是编译期就可以赋予不同的对象于模板函数。

42.了解typename的双重意义

1.声明模板参数时,前缀关键字class和typename可以互换。

2.请使用关键字typename标识嵌套从属类型名称;1(表明后面的那个东西是一个类型名称)但不得在base class lists(基类列)或成员初值列内以它作为base class修饰符。

43.学习处理模块化基类的名称

1.编译器往往会拒绝在模板化基类中寻找继承而来的名称,因为基类的模板化可能被特化而那个特化版本也许并不会提供某一接口。所以我们可以使用 “this->” 指定,或使用 “using” 告诉编译器假设它存在

44.将与参数无关的代码抽离 templates

templates 会生成多个 classes 和函数,所以任何 template 代码都不该与某个造成膨胀的 template 参数产生相依关系。

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

1.请使用成员函数模板生成 “可接受所有兼容类型” 的函数。即完成一些类型的指针向上转型(例如 Derive* -> Base*)。

2.如果声明的成员模板是用于 “泛化 copy 构造” 或 “泛化 assignment 操作” ,你还需要声明正常的 copy 构造和 assignment 操作符。

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

1.为了让类型转换可能发生于所有实参上,我们需要一个非成员函数(条款 24)。在模板中,为了令这个函数被自动具现化,我们需要将它声明在类内部。为了在类内部声明非成员函数,唯一的办法是令它成为一个 friend。

47.请使用 traits classes(特性类)表现类型信息

Traits 不是 C++ 关键字或一个预先定义好的构件,而是一种技术,也是 C++ 程序员共同遵守的协议。它要求对于内置类型和用户自定义类型的表现必须一样好。Traits classes 使得 “类型相关信息” 在编译期可用,它们以 templates 和 “templates 特化” 完成实现。

使用重载函数的形式,可以使 Traits classes 在编译期完成对类型的检测。

具体可看STL中关于traits的用法。

48 . 认识 template 元编程

1.模板元编程(template metaprogramming TMP)可将工作由运行期移往编译期(编译器时间变长了,可执行文件变小了),因而得以实现早期错误侦测和更高的执行效率。上述 traits 就是 TMP 的应用。

2.TMP 可被用来生成 “基于政策选择组合” 的客户定制代码,而可用来避免生成对某些特殊类型不适合的代码。

八、定制new和delete

49.了解new-handler的行为

当operator new抛出异常以反映一个未获得满足的内存需求之前,它会先调用一个客户指定的错误处理函数,一个所谓的new-handler。,为了指定这个 处理内存不足的函数,客户必须调用sett_new_handler,这是声明与<new>的一个标准库函数

Set_new_handler的参数指向operatornew无法分配足够内存时该被调用的函数。,返回值指向被调用前正在执行(但马上就要被替换掉的)那个new-handler函数。

设计一个良好的new-handler必须:

  1. 让更多内存可被使用:程序一开始就分配一大块内存,然后当new-handler第一次被调用时,将他们还给程序使用。
  2. 安装另一个new-handler。
  3. 卸除new-handler。
  4. 抛出bad_alloc。
  5. 不返回,通常调用abort或exit。

如果需要让不同的class调用各自的专属new-handler,只需令每一个class提供自己的set_new_handler和operator new即可。

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

为什么要替换编译器提供的operator new和delete:

  1. 用来检测运用上的错误。编程错误可能导致数据over/under runs(写入点在分配区块尾端之后或之前)。如果我们自定义operator new可以额外空间放置特定byte patterns(签名),delete时检查签名是否原封不动,就可以志记错误。
  2. 为了强化效能
  3. 收集使用上的统计数据
  4. 增加分配和归还速度
  5. 降低缺省内存管理器带来的空间额外开销
  6. 弥补缺省分配器的非最佳齐位(内存对齐)
  7. 将对象成簇集中
  8. 获得非传统的行为

51.编写new和delete需固守常规

1.Opeartor new应该有一个无穷循环,并在其中尝试分配内存,如果无法满足内存需求就该调用new-handler

2.Operator delete应该在收到null指针时不做任何事。

52.写了placement new也要写placement delete

如果operatornew接受的参数除了一定会有的size_t之外还有其他,这便是所谓的placement new.

  1. 如果一个带额外参数的operator new没有带相同额外参数的对应版operator delete,当new的内存分配动作需要取消并恢复旧观时就没有任何operator delete被调用,所以需要有对应的placement operator delete
  2. 当你声明placement new 和placement delete时请不要无意识的遮掩了他们正常版本。

九、杂项讨论

53.不要轻忽编译器的警告

54.让自己熟悉包括TR1在内的标准程序库

55.让自己熟悉Boost

Effective C++ 总结笔记(六)的更多相关文章

  1. 《MFC游戏开发》笔记六 图像双缓冲技术:实现一个流畅的动画

    本系列文章由七十一雾央编写,转载请注明出处.  http://blog.csdn.net/u011371356/article/details/9334121 作者:七十一雾央 新浪微博:http:/ ...

  2. java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)

    java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...

  3. Learning ROS for Robotics Programming Second Edition学习笔记(六) indigo xtion pro live

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...

  4. Effective STL 读书笔记

    Effective STL 读书笔记 标签(空格分隔): 未分类 慎重选择容器类型 标准STL序列容器: vector.string.deque和list(双向列表). 标准STL管理容器: set. ...

  5. Python学习笔记六

    Python课堂笔记六 常用模块已经可以在单位实际项目中使用,可以实现运维自动化.无需手工备份文件,数据库,拷贝,压缩. 常用模块 time模块 time.time time.localtime ti ...

  6. Typescript 学习笔记六:接口

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  7. Django开发笔记六

    Django开发笔记一 Django开发笔记二 Django开发笔记三 Django开发笔记四 Django开发笔记五 Django开发笔记六 1.登录功能完善 登录成功应该是重定向到首页,而不是转发 ...

  8. Effective STL读书笔记

    Effective STL 读书笔记 本篇文字用于总结在阅读<Effective STL>时的笔记心得,只记录书上描写的,但自己尚未熟练掌握的知识点,不记录通用.常识类的知识点. STL按 ...

  9. python3.4学习笔记(六) 常用快捷键使用技巧,持续更新

    python3.4学习笔记(六) 常用快捷键使用技巧,持续更新 安装IDLE后鼠标右键点击*.py 文件,可以看到Edit with IDLE 选择这个可以直接打开编辑器.IDLE默认不能显示行号,使 ...

  10. Go语言学习笔记六: 循环语句

    Go语言学习笔记六: 循环语句 今天学了一个格式化代码的命令:gofmt -w chapter6.go for循环 for循环有3种形式: for init; condition; increment ...

随机推荐

  1. Dapr + .NET Core实战(六)绑定

    什么是绑定 处理外部事件或调用外部接口的功能就是绑定,绑定可以提供以下好处: 避免连接到消息系统 ( 如队列和消息总线 ) 并进行轮询的复杂性 聚焦于业务逻辑,而不是如何与系统交互 使代码不受 SDK ...

  2. 阿里:MySQL数据库规范

    阿里:MySQL数据库规范 简介:基于阿里数据库设计规范扩展而来 设计规范 1.[推荐]字段允许适当冗余,以提高查询性能,但必须考虑数据一致.冗余字段应遵循: 不是频繁修改的字段. 不是 varcha ...

  3. 【C++ Primer Plus】编程练习答案——第7章

    1 double ch7_1_harmonicaverage(double a, double b) { 2 return 2 / (1 / a + 1 / b); 3 } 4 5 void ch7_ ...

  4. HTML常用的css属性(及其简写)

    这篇文章主要介绍几个常用css属性和简写 本文目录: 1.背景属性 2.边框属性 3.字体属性 4.外边距 5.填充 6.颜色 1.background[背景属性] background-color ...

  5. Feed 流系统杂谈

    什么是 Feed 流 Feed 流是社交和资讯类应用中常见的一种形态, 比如微博知乎的关注页.微信的订阅号和朋友圈等.Feed 流源于 RSS 订阅, 用户将自己感兴趣的网站的 RSS 地址登记到 R ...

  6. The Data Way Vol.2 | 做个『单纯』的程序员还真不简单

    关于「The Data Way」 「The Data Way」是由 SphereEx 公司出品的一档播客节目.这里有开源.数据.技术的故事,同时我们关注开发者的工作日常,也讨论开发者的生活日常:我们聚 ...

  7. 活动回顾|ShardingSphere X openGauss,将会产生怎样的化学反应?

    "ShardingSphere 作为 openGauss 生态的开源分布式数据库解决方案,将持续助力于 openGauss,满足千行百业广大客户分布式场景需求." 5月29日,由  ...

  8. C# datagridview、datagrid、GridControl增加行号

    01 - WinForm中datagridview增加行号 在界面上拖一个控件dataGridView1,在datagridview添加行事件中添加如下代码: private void dataGri ...

  9. websocket方案调研及实践

    目录 webscoket方案调研及实践 一.使用场景 二.方案调研 1.Ajax短轮询 2.long-polling长轮询 3.iframe长连接 4.XHR-streaming 5.Websocke ...

  10. wget命令8种实用用法

    大家好,我是良许. wget 是一个可以从网络上下载文件的免费实用程序,它的工作原理是从 Internet 上获取数据,并将其保存到本地文件中或显示在你的终端上. 这实际上也是大家所使用的浏览器所做的 ...