Effective C++笔记 5
来源:互联网 发布:sql数据库置疑 编辑:程序博客网 时间:2024/05/30 22:48
本文内容基本来自于《Effective C++》一书,为学习后的笔记,以便温故。
《Effective C++ 》第 5 节 实现
(1)条款26:尽可能延后变量定义式的出现时间
(2)条款27:尽量少做转型动作
C++提供了四种新式的转型
A:const_cast通常被用来将对象的常量性转除。它也是唯一有此能力的C++ style转型操作符。
B:dynamic_cast主要用来执行“安全向下转型”,也就是用来决定某些对象是否归属于集成体系中的某个类型。它是唯一无法由旧式语法执行的动作,也是唯一可能耗费重大运行成本的转型动作。
C:reinterpret_cast意图执行低级转型,实际动作可能取决于编译器,这也就表示它并不可移植。
D:static_cast用来强迫隐式转换,例如将non-const对象转换成cosnt对象,或者将int转换成double等等。
请记住:
如果可以,尽量避免转型,特别是在注重效率的代码中避免dynamic_casts,如果有个设计需要转型,试着发展无需转型的替代设计。
如果转型是必要的,试着将它隐藏于某个函数背后。客户随后可以调用该函数,而不需要将转型放入自己的代码中。
宁以C++ style转型,不要使用旧式转型,前者很容易辨识出来,而且也比较有着分别门类的职掌。
(3)条款28:避免返回handles指向对象内部成分
不论这所谓的handle是个指针或者迭代器或者reference,也不论这个handle是否为const,也不论那个返回handle的成员函数是否为const。这里唯一关键的是,有个handle被传出去了,一旦如此你就是暴露在“handle比其所指对象更长寿”的风险下。
(4)条款29:为“异常安全”而努力是值得的
异常安全函数提供以下三个保证之一:
基本承诺:如果异常被抛出,程序内的任何事物仍然保持在有效状态下。没有任何对象或数据结构会因此而败坏,所有对象都处于一种内部前后一致的状态。
强烈保证:如果异常被抛出,程序状态不改变。调用这样的函数需要有这样的认知:如果函数成功,就是完全成功,如果函数失败,程序会恢复到“调用函数之前”的状态。
不抛掷保证:承诺绝不抛出异常,因为他们总能够完成他们原先承诺的功能。作用于内置类型身上的所有操作都提供nothrow保证。
"强烈保证"往往能够以copy-and-swap实现出来,但是“强烈保证”并非对所有函数都可以实现或者具备现实意义。
函数提供的“异常安全保证”通常最高只等于其所调用之各个函数的“异常安全保证”中的最弱者。
(5)条款30:透彻的了街inlining的里里外外
将大多数inlining限制在小型,被频繁调用的函数身上。这可使日后的调式过程和二进制升级更容易,也可使潜在的代码膨胀问题最小化,使程序的速度提升机会最大化。
不要因为funciton templates出现在头文件,就将他们声明为inline
(6)条款31:将文件间的编译依存关系降至最低
Interface classes类似java和.net的interfaces,但是C++的interface classes并不需要负担java和.net的interface所要负担的责任。举个例子:java和.net都不允许在interface内实现成员变量和成员函数,但是C++不禁止这两样东西。C++这种更为巨大的弹性有其用途。
支持“编译依存性最小化”的一般构想是:相依于声明式,不要相依于定义式。基于此构想的两个手段是Handle classes和interface classes
程序库文件应该以“完全且仅有声明式”的形式存在。这种做法不论是否涉及templates都适用。
- <<Effective C++>>笔记5
- 《Effective C++》 笔记
- 《Effective C++》阅读笔记
- Effective C++--笔记
- <Effective C++: 资源管理> 笔记
- <<Effective C++>>笔记1
- <<Effective C++>>笔记3
- <<Effective C++>>笔记4
- 《Effective C++》学习笔记
- 《Effective C++》阅读笔记
- 《Effective C++》学习笔记
- 《Effective C++》 笔记
- 《Effective C++》笔记
- Effective C++_Item3笔记
- Effective C++_Item4笔记
- Effective C++_Item5笔记
- Effective C++_Item6笔记
- Effective C++_Item7笔记
- OpenCV2.3.1学习笔记(1):用vec类型变量构造Mat
- C#-Mysql读写乱码问题(稍修改,日记)
- C++如何在set中插入struct
- (原创)狂战士奥拉夫攻略-详细打法分析
- 彩色成像原理和vonK iies 色适应理论
- Effective C++笔记 5
- 《Windows程序设计》之BITMAP
- ora-19550无法在使用调度程序时使用备份/恢复功能
- 排序算法(1)---插入排序
- 看看牛人们是怎么评价编程语言的
- 利用Jersey和Google ProtoBuf 集成Spring搭建REST服务
- 直接编译hello模块进linux内核
- 外观模式c++实现
- js把空格尖括号等字符转换成转意符