《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组件实现品,以及其他许多程序库。
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组件实现品,以及其他许多程序库。
相关文章推荐
- 读书笔记_Effective_C++_条款六:若不想使用编译器自动生成的函数,就该明确拒绝
- 读书笔记 effective c++ Item 47 使用traits class表示类型信息
- 《Effective_C++》读书笔记3
- 读书笔记_Effective_C++_条款三十二:确定你的public继承继承塑模出is-a关系
- 读书笔记 effective c++ Item 51 实现new和delete的时候要遵守约定
- 读书笔记_Effective_C++_条款十七:以独立语句将new产生的对象置入智能指针
- 读书笔记 effective c++ Item 8 不要让异常(exceptions)离开析构函数
- 读书笔记_Effective_C++_条款十一:在operator=中处理自我赋值
- 读书笔记_Effective_C++_条款三十七:绝不重新定义继承而来的缺省参数值
- <Effective C++>读书笔记-3
- 读书笔记《More Effective C++》条款1:仔细区别pointers和references
- <<More Effective C++>>读书笔记5: 技巧(1)
- 读书笔记 effective c++ Item 30 理解内联的里里外外 (大师入场啦)
- 《Effective Modern C++》读书笔记(5) -- 尽量使用nullptr而不使用0和NULL
- <<Effective C++>>读书笔记(二)
- <<Effective C++>>读书笔记
- 读书笔记 effective c++ Item 4 确保对象被使用前进行初始化
- 读书笔记: More Effective C++ 基础议题,条款1到条款4
- <<Effective C++>>读书笔记9: 杂项讨论
- 读书笔记 effective c++ Item 17 使用单独语句将new出来的对象放入智能指针