您的位置:首页 > 编程语言 > C语言/C++

《Effective_C++》读书笔记6

2012-01-13 15:51 162 查看
条款41、了解隐式接口和编译期多态

1)classes和templates都支持接口(interface)和多态(polymorphism)。

2)对classes而言接口是显式(implicit),奠基于有效表达式。多态则是通过template具现化和函数重载解析(function overloading resolution)发生于编译期。

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

1)声明template参数时,前缀关键字class和typename互换

2)请使用关键字typename标识嵌套从属类型名称;但不得在base class lists(基类列)或member initialzation list(成员初值列)内以它作为base class修饰符。

条款43、学习处理模版化基类内的名称

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

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

1)Templates生成多个class和多个函数,所以任何template代码都不该与某个造成膨胀的template参数产生相依关系

2)因非类型模版参数(non-type tempate parameters)而造成的代码膨胀,往往可消除,做法是以函数参数或class成员变量替换template参数。

3)因类型参数(type parameters)而造成的代码膨胀,往往可降低,做法是让带有完全相同二进制表述(binary representations)的具体类型(instantiation types)共享实现码。

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

1)请使用member function templates(成员函数模版)生成“可接受所有兼容类型”的函数。

2)如果你声明member templates 用于“泛化assignment操作”你还好需要声明正常的copy构造函数和copy assignment操作符。

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

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

条款47、请使用traits class 表现类型信息

1)Traits classes 使得“类型相关信息”在编译期可用。他们以templates和“templates特化”完成实现。

2)整合重载技术(overloading)后,traits classes 有可能在编译期对类型执行if..else测试。

条款48、认识template元编程

1)Template metaprogramming(TMP肯能可将工作运行移往编译期,因而得以实现早期错误侦测和更高的执行效率。

2)TMP可被用来生成“基于政策选择组合”(base on combinations of policy choices)的客户制定代码,也可用来避免生成对某些特殊类型并不合适的代码。

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

1)set_new_handler允许客户指定一个函数,在内存分配无法获得满足时被调用。

2)nothrow new 是一个颇为局限的工具,因为它只适用于内存分配;后继的构造函数调用还是可能抛出异常。

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

1)有许多理由需要写个自定的new和delete,包括改善效能、对heap运用错误进行调试、收集heap使用信息。

条款51、定制new和delete

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

条款52、写了placement new也要写placement delete

1)当你写一个placement opertor new,请确定也写出了对应的placement operator delete。如果没有这样做,你的程序可能会发生隐微而时断时续的内存泄漏。

2)当你声明placement new 和placement delete,请确定不要无意识的遮掩了他们的正常版本。

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

1)严肃对待编译器发出的警告信息,努力在你的编译器的最高警告级别下争取“无任何警告”的荣誉。

2)不要过度依靠编译器的报警能力,因为不同的编译器对待事情的态度并不相同。一旦移植到另一个编译器上,你原本依靠警告信息有肯能消失。

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

1)C++标准程序库的重要机能由STL、iostream、locales组成。并包含C99标准程序库。

2)TR1添加了智能指针(tr1::shared_ptr)、一般化函数指针(tr1::function)、hash-baseed容器、正则表达式以及另外10个组件的支持。

3)TR1自身只是一份规范。为获得TR1提供的好处,你需要一份实物。一个好的实物来源是boost。

条款55、让自己熟悉Boost

1)Boost是个社群,也是个网站。致力于免费、源码开放、同僚复审的C++程序库开放。Boost在C++标准化过程扮演具影响力的角色。

2)Boost提供许多TR1组件实现品,以及其他许多程序库。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: