Effective C++ 总结笔记(四)
五、实现
26.尽可能延后变量定义式的出现时间
尽可能延后变量定义式的出现,甚至应该尝试延后这份定义直到能够给他初值实参为止,这样不仅能避免构造和析构非必要对象,避免无意义的default行为,也可增加程序的清晰度并改善程序效率。
27.*尽量少做转型动作
const_cast通常被用来将对象的常量性移除,也是唯一有此能力的C++style转型操作符。
dynamic_cast主要用来执行“安全向下转型”,之所以需要dynamic_castc,是因为你想在一个你认定的派生类对象身上执行派生类操作函数,但你只有一个指向base class 的指针或引用,需要用这个来进行由上而下的转换(基类向下转换成子类)。
reinterpre_cast意图执行低级转型,实际动作取决于编译器。它可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针,不能将非32bit的实例转成指针。最普通的用途就是在函数指针类型之间进行转换,不可移植
static_cast用来强迫隐式转换,基本什么都可以转。但无法转const->non-const,这个只有const_cast才办到。适用范围最广的,适用于很多隐式转换,基本数据类型的转换,基类指针与子类指针的相互转换,或者添加const属性,任何类型转换为void类型,static_cast在下行转换时不安全,是因为即使转换失败,它也不返回NULL ,而dynamic_cast转换失败会返回NULL;对于上行转换,dynamic_cast和static_cast是一样的
1. 如果可以,尽量避免转型,特别是在注重效率的代码中避免dynamic_cast;试着发展无需转型的替代设计
2. 如果转型是必要的,试着将它隐藏于某个函数后。客户可以调用该函数而不需要将转型放进他们的代码中。
3. 宁可使用C++-style转型,不要使用旧式转型(新式转型很容易辨识出来,而分门别类)
28.避免返回handles指向对象内部成分
避免返回handles(包括references、指针、迭代器)指向对象内部(包括成员变量和不被公开的成员函数),否则会破坏封装性,使const成员函数的行为矛盾,以及发生“空悬虚吊号牌码”。
29.为“异常安全”努力是值得的
当异常被抛出时,带有异常安全性的函数会:
- 不泄露任何资源
- 不允许数据败坏
异常安全函数提供一下三个保证之一:
- 基本承诺:如果异常被抛出,程序内的任何事物仍然保持在有效状态下。
- 强烈保证:如果异常被抛出,程序状态不改变。(如果调用失败程序会回到“调用函数之前的状态”)
- 不抛掷保证:承诺绝不抛出异常。
可能的话提供“nothrow保证”,当“强烈保证”不切实际时,就必须提供“基本保证”。
函数提供的“异常安全保证”通常最高只等于其所调用之各个函数的“异常安全保证”中的最弱者
30.透彻了解inlining的里里外外
1. Public内的成员函数默认是inline,inline函数在大多数C++程序中是编译器行为。
2. 大部分编译器拒绝太过复杂的(例如带有循环或者递归)的函数inline,而对所有的virtual函数的调用都会是inlie落空。
3. Inline意味着执行前会将调用动作替换为被调用函数的主体,需要额外空间,会使代码膨胀。
- 一个表明inline函数实际是否inline取决于编译器。inline只是给编译器的建议,大部分的
编译器拒绝将太过复杂的函数inlining,隐喻方式是将函数定义于class定义式内
随着程序库的升级,inline函数需要重新编译,而non-inline函数只需重新连接
将大多数inlining限制在小型、被频繁调用的函数身上。
Template的具现化与inlining无关(Template放在头文件只是因为一般在编译器完成具现化动作)
31.将文件间的编译依存关系降至最低
正确做法:
编译依存最小化的设计策略:
1、如果使用object references或object pointers可以完成任务,就不要用objects
2、如果能够,以class声明式替换class定义式
3、为声明式和定义式提供不同的头文件
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现