Exceptional C++ 笔记

本文提供了C++编程中提升效率的25条实用建议,包括使用常引用减少复制、优化递增操作、遵循单入口单出口原则、正确管理内存及资源、避免全局变量的不当使用等,帮助开发者写出更高效、更安全的代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 1、 使用常引用const & 代替值传递

 2、 使用先增操作,避免使用后增操作:在进行后增操作时,对象不但需要自增,还要返回一个包含自增前值得临时对象。

 3、 遵循‘单入口/单出口’原则,绝不要在一个函数里面写有多个return语句。

 4、 绝对不要返回对局部对象的引用!!!

 5、 尽量使用标准库算法

 6、 优先采用 "a opt= b" 这样的写法, 而不是 "a = a opt b"; :原因在于opt += 这个云算法是直接对其左边的对象进行运算,并且返回的是
一个引用,而不是一个临时变量。而opt +则必须返回一个临时对象。

 7、 如果定义了谋运算符,那么通常还应该同时定义与这个云算法相对应的赋值运算符,并用后者来实现前者。而且,还应该维护opt 与 opt= 之
间的自然关系。

 8、 在C++标准中规定: 运算符 =、()、[]、->必须被定义为成员函数,而在类中定义的new、new[]、delete、delete[]等运算符函数则必须是静
态成员函数。
   如果运算符函数是用于流I/O的 >>或者<<;或者如果运算符函数需要对其做操作数进行类型转换;或者运算符函数可以通过类的共有接口来实现
:那么将这个函数定义为非成员函数。

9、 在函数operator<< 和 operator>>中应始终返回对流对象的引用

10、 为了保值代码的一致性,应该通过前置递增来实现后置递增。

11、 如果派生类中定义的函数与基类中的函数同名,并且你不想隐藏基类中的函数,那么应该通过using声明语句将基类的这个函数引入到派生类的
作用域中 eg: using Base::f;

12、 永远不要改变被覆盖的基类函数的默认参数值

13、* 除了对真正的 is-a 和 works-like-a 关系进行建模外,永远不要使用公有继承。。所有被覆盖的成员函数不能超过实际需求的范围,同时也
不能小于这个范围。
   使用公有继承的目的是重用代码(编写以多态的方式使用基类对象的代码),而重用代码并不一定要使用公有继承。

14、* 对"is implemented in terms of"这种关系建模时,应该优先选择成员关系/包含的方式,而不是私有继承的方式。只有非用继承不可时,才
应该使用私有继承---也就是说,当需要访   问保护成员或者需要覆盖虚函数时,才使用私有继承。永远都不要只是为了代码重用而使用公有继承。

15、 尽量避免使用共有的虚函数,优先选择模板方法这种设计模式:通过这种方法构造出完成某项工作的通用方式,并且在完成这项工作是总是遵
循着相同的步骤。

16、* 对于广泛使用的类,应该优先采用编译器防火墙这种惯用法(Pimpl惯用法)来隐藏实现细节,通过一个不透明的指针(指向一个进行了前置
声明但有没有定义的类)来保存私有成员,
   声明这个指针时可采用struct XxxImpl* pimpl_;这种方式:
    Class Map {
        private: struct MapImpl;
        MapImpl* pimpl_;
        }

17、 包含,也可以叫做“聚合”、“分层”,“Has-a”或者“委托(delegation)”。优先使用包含而不是继承。对 Is-Implemented-terms-of这种
关系建模时,应优先使用包含而不是继承。

18、 如果类中定义了new(new[])或delete(delete[])中的任意一个运算符,那么也要同时定义另一个运算符。

19、 应该显式地将函数operator new() 和 Operator delete()声明为静态函数。他们永远都不能成为非静态成员函数。

20、 永远不要通过多态的方式处理数组, 优先选择使用vector<> 或 deque<> 而不是数组。

21、 使用构造函数来实现拷贝赋值运算符函数时,绝不要使用如下技术:首先一个显示地析构函数,紧随其后是placement new 语句。

22、 如果可能的话,优先使用 T t(u);这种形式,而不是 T t = u; 这种形式。

23、 在函数声明中,如果参数是以值方式传递的,则不要使用const,而如果在这个函数定义中,参数是不能被修改的,那么应该使用const。

24、 对于不是内置类型的返回值来说,当使用返回值的方式而不是返回引用的方式时,应该优先选择返回const值。

25、 避免使用全局变量或静态变量。如果必须使用,那么一定要特别注意这些变量的初始化顺序。

exceptional c++:47个c++工程难题、编程问题和解决方案(中文版)》讲述如何用标准c++进行企业级的软件开发,通过“问题/解答”的方式,启发读者思考,帮助了解隐藏在问题背后的设计思想,以及各种编程指导原则适用的场合。本书列出的条款涵盖了许多方面的主题,尤其对异常安全性、类和模块的合理设计,正确的代码优化,以及编写符合c++标准的可移植代码进行了深入的讨论。   《exceptional c++:47个c++工程难题、编程问题和解决方案(中文版)》适于有一定c++编程基础的读者阅读。 目录 《exceptional c++:47个c++工程难题、编程问题和解决方案(中文版)》 1 泛型程序设计与c++标准库 1 条款1:迭代器难度系数 1 条款2:大小写不敏感的字符串——之一 5 条款3:大小写不敏感的字符串——之二 9 条款4:可重用性最高的泛型容器——之一 12 条款5:可重用性最高的泛型容器——之二 13 条款6:临时对象 22 条款7:标准库的使用(或者,再论临时对象) 28 2 异常安全性相关的问题与技术 31 条款8:编写异常安全的代码——之一 32 条款9:编写异常安全的代码——之二 37 条款10:编写异常安全的代码——之三 40 条款11:编写异常安全的代码——之四 47 条款12:编写异常安全的代码——之五 50 条款13:编写异常安全的代码——之六 56 条款14:编写异常安全的代码——之七 62 条款15:编写异常安全的代码——之八 65 条款16:编写异常安全的代码——之九 68 条款17:编写异常安全的代码——之十 73 条款18:代码的复杂性——之一 75 条款19:代码的复杂性——之二 79 3 类的设计与继承 85 条款20:类的编写技巧 85 条款21:虚函数的重载 93 条款22:类之间的关系——之一 99 条款23:类之间的关系——之二 103 条款24:继承的使用和滥用 110 条款25:面向对象程序设计 121 4 编译器防火墙和pimpl惯用法 123 条款26:将编译期依赖性降到最低——之一 123 条款27:将编译期依赖性降到最低——之二 127 条款28:将编译期依赖性降到最低——之三 132 条款29:编译防火墙 135 条款30:fast pimpl惯用法 138 5 名字查找、名字空间和接口规则 148 条款31:名字查找与接口规则——之一 148 条款32:名字查找与接口规则——之二 152 条款33:名字查找和接口规则——之三 162 条款34:名字查找与接口规则——之四 167 6 内存管理 176 条款35:内存管理——之一 176 条款36:内存管理——之二 179 条款37:auto_ptr 186 7 误区、陷阱以及错误的惯用法 201 条款38:对象标识 201 条款39:自动转换 204 条款40:对象的生存期——之一 206 条款41:对象的生存期——之二 209 8 其他主题 219 条款42:变量的初始化 219 条款43:正确使用const 222 条款44:类型转换 231 条款45:bool 238 条款46:转调函数 242 条款47:控制流程 244 后记 254 参考书目 256
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值