具体描述
本书是C++程序员进阶修炼的必读之作,包含的全部都是C++编码的最佳实践,从语法、编码规范和编程习惯、程序架构和设计思想等三大方面对C++程序和设计中的疑难问题给出了经验性的解决方案,为C++程序员编写更高质量的C++代码提供了150条极为宝贵的建议。每个问题都来自于实践,都极具代表性,本书不仅以建议的方式正面为每个问题给出了被实践证明为十分优秀的解决方案,而且还从反面给出了被实践证明为不好的解决方案,从正反两个方面进行了分析和对比。
全书在逻辑上一共分为三个部分:语法部分涵盖C++从C语言继承而来的一些极为重要但又极容易被误解和误用的一些语法特性,从C语言到C++的改变,以及内存管理、类、模板、异常处理、STL等方面的内容;编码习惯和编程规范部分则主要讨论了如何提高程序的正确性、可读性、程序性能和编码效率方面的问题;程序架构和思想部分则从更高的高度对C++程序设计思维和方法进行了审视,给出了一些颇具价值的观点和最佳实践。
这是一本关于如何提高C++程序设计效率与质量的工具书,希望书中的每条建议都能引起你的思考,对于有难度的内容,建议大家消化理解,切勿死记硬背,同时也希望大家能悟出更好的解决方案。希望本书中的每条建议所传递的思想和理念能够渗透到大家的编码实践中,进而帮助大家真正具备编写高质量C++代码的能力。
作者简介
李健,资深软件开发工程师,毕业于中科院计算所,有多年C/C++开发经验,积累了丰富的实践经验。曾经参与了国家“十一五”863项目、北京市文化创意项目、上海世博会项目等多个项目的大型软件的架构、设计与开发。此外,对MPICH并行编程与高性能计算、脚本语言Lua、Android和iPhone等移动开发平台也有一定的研究。活跃于CSDN和博客园等技术社区,发表和分享了大量技术文章,深受网友欢迎。
目录信息
第一部分 语法篇
第1章 从C继承而来的/2
建议0:不要让main函数返回void/2
建议1:区分0的4种面孔/5
建议2:避免那些由运算符引发的混乱/8
建议3:对表达式计算顺序不要想当然/9
建议4:小心宏#define使用中的陷阱/12
建议5:不要忘记指针变量的初始化/14
建议6:明晰逗号分隔表达式的奇怪之处/15
建议7:时刻提防内存溢出/16
建议8:拒绝晦涩难懂的函数指针/19
建议9:防止重复包含头文件/19
建议10:优化结构体中元素的布局/21
建议11:将强制转型减到最少/23
建议12:优先使用前缀操作符/26
建议13:掌握变量定义的位置与时机/28
建议14:小心typedef使用中的陷阱/30
建议15:尽量不要使用可变参数/32
建议16:慎用goto/36
建议17:提防隐式转换带来的麻烦/38
建议18:正确区分void与void*/42
第2章 从C到C++,需要做出一些改变/45
建议19:明白在C++中如何使用C /45
建议20:使用memcpy()系列函数时要足够小心/48
建议21:尽量用new/delete代替malloc/free/49
建议22:灵活地使用不同风格的注释/52
建议23:尽量使用C++标准的iostream/55
建议24:尽量采用C++风格的强制转型/58
建议25:尽量用const、enum、inline替换#define/59
建议26:用引用代替指针/62
第3章 说一说“内存管理”的那点事儿/66
建议27:区分内存分配的方式/67
建议28:new/delete与new[]/delete[]必须配对使用/69
建议29:区分new的三种形态/71
建议30:new内存失败后的正确处理/75
建议31:了解new_handler的所作所为/78
建议32:借助工具监测内存泄漏问题/81
建议33:小心翼翼地重载operator new/ operator delete /84
建议34:用智能指针管理通过new创建的对象/88
建议35:使用内存池技术提高内存申请效率与性能/91
第4章 重中之重的类/95
建议36:明晰class与struct之间的区别/95
建议37:了解C++悄悄做的那些事/99
建议38:首选初始化列表实现类成员的初始化/101
建议39:明智地拒绝对象的复制操作/105
建议40:小心,自定义拷贝函数/107
建议41:谨防因构造函数抛出异常而引发的问题/110
建议42:多态基类的析构函数应该为虚/113
建议43:绝不让构造函数为虚/116
建议44:避免在构造/析构函数中调用虚函数/117
建议45:默认参数在构造函数中给你带来的喜与悲/120
建议46:区分Overloading、Overriding及Hiding之间的差异/122
建议47:重载operator=的标准三步走/126
建议48:运算符重载,是成员函数还是友元函数/131
建议49:有些运算符应该成对实现/134
建议50:特殊的自增自减运算符重载/136
建议51:不要重载operator&&、operator||以及operator,/137
建议52:合理地使用inline函数来提高效率/139
建议53:慎用私有继承/141
建议54:抵制MI的糖衣炮弹/144
建议55:提防对象切片/147
建议56:在正确的场合使用恰当的特性/150
建议57:将数据成员声明为private/154
建议58:明晰对象构造与析构的顺序/156
建议59:明了如何在主调函数启动前调用函数/158
第5章 用好模板,向着GP开进/161
建议60:审慎地在动、静多态之间选择/161
建议61:将模板的声明和定义放置在同一个头文件里/164
建议62:用模板替代参数化的宏函数/168
建议63:区分函数模板与模板函数、类模板与模板类/169
建议64:区分继承与模板/171
第6章 让神秘的异常处理不再神秘/176
建议65:使用exception来处理错误/176
建议66:传值throw异常,传引用catch异常/179
建议67:用“throw;”来重新抛出异常/183
建议68:了解异常捕获与函数参数传递之间的差异/185
建议69:熟悉异常处理的代价/189
建议70:尽量保证异常安全/192
第7章 用好STL这个大轮子/198
建议71:尽量熟悉C++标准库/198
建议72:熟悉STL中的有关术语/201
建议73:删除指针的容器时避免资源泄漏/204
建议74:选择合适的STL容器/206
建议75:不要在STL容器中存储auto_ptr对象/209
建议76:熟悉删除STL容器中元素的惯用法/210
建议77:小心迭代器的失效/213
建议78:尽量使用vector和string代替动态分配数组/214
建议79:掌握vector和string与C语言API的通信方式/216
建议80:多用算法调用,少用手写循环/217
第二部分 编码习惯和规范篇
第8章 让程序正确执行/222
建议81:避免无意中的内部数据裸露/222
建议82:积极使用const为函数保驾护航/224
建议83:不要返回局部变量的引用/228
建议84:切忌过度使用传引用代替传对象/230
建议85:了解指针参数传递内存中的玄机/231
建议86:不要将函数参数作为工作变量 /233
建议87:躲过0值比较的层层陷阱/234
建议88:不要用reinterpret_cast去迷惑编译器/236
建议89:避免对动态对象指针使用static_cast/237
建议90:尽量少应用多态性数组/238
建议91:不要强制去除变量的const属性/240
第9章 提高代码的可读性/242
建议92:尽量使代码版面整洁优雅/243
建议93:给函数和变量起一个“能说话”的名字/246
建议94:合理地添加注释/248
建议95:为源代码设置一定的目录结构/251
建议96:用有意义的标识代替Magic Numbers/252
建议97:避免使用“聪明的技巧”/253
建议98:运算符重载时坚持其通用的含义/254
建议99:避免嵌套过深与函数过长/255
建议100:养成好习惯,从现在做起/256
第10章 让代码运行得再快些/258
建议101:用移位实现乘除法运算/258
建议102:优化循环,提高效率/259
建议103:改造switch语句/260
建议104:精简函数参数 /261
建议105:谨慎使用内嵌汇编/262
建议106:努力减少内存碎片/263
建议107:正确地使用内联函数/263
建议108:用初始化取代赋值/264
建议109:尽可能地减少临时对象/266
建议110:最后再去优化代码/267
第11章 零碎但重要的其他建议/269
建议111:采用相对路径包含头文件/269
建议112:让条件编译为开发出力/270
建议113:使用.inl文件让代码整洁可读/272
建议114:使用断言来发现软件问题/274
建议115:优先选择编译和链接错误/275
建议116:不放过任何一条编译器警告/277
建议117:尽量减少文件之间的编译依赖 /278
建议118:不要在头文件中使用using/280
建议119:划分全局名空间避免名污染/282
第三部分 程序架构和思想篇
第12章 面向对象的类设计/286
建议120:坚持“以行为为中心”的类设计/286
建议121:用心做好类设计/287
建议122:以指针代替嵌入对象或引用/289
建议123:努力将接口最小化且功能完善/291
建议124:让类的数据隐藏起来/292
建议125:不要让成员函数破坏类的封装性/294
建议126:理解“virtual + 访问限定符”的深层含义/295
建议127:谨慎恰当地使用友元机制/297
建议128:控制对象的创建方式/299
建议129:控制实例化对象的个数/301
建议130:区分继承与组合/303
建议131:不要将对象的继承关系扩展至对象容器/307
建议132:杜绝不良继承/308
建议133:将RAII作为一种习惯/310
建议134:学习使用设计模式/311
建议135:在接口继承和实现继承中做谨慎选择/314
建议136:遵循类设计的五项基本原则/315
第13章 返璞归真的程序设计/318
建议137:用表驱动取代冗长的逻辑选择/318
建议138:为应用设定特性集/324
建议139:编码之前需三思/324
建议140:重构代码/326
建议141:透过表面的语法挖掘背后的语义/328
建议142:在未来时态下开发C++程序/330
建议143:根据你的目的决定造不造轮子/331
建议144:谨慎在OO与GP之间选择/331
建议145:让内存管理理念与时俱进/332
建议146:从大师的代码中学习编程思想与技艺/334
建议147:遵循自然而然的C++风格/335
建议148:了解C++语言的设计目标与原则/335
建议149:明确选择C++的理由/338
· · · · · · (收起)
读后感
在我感觉c++水平到达一定的程度之后,但是又觉得好像没有融汇贯通之前,读了这本书。真的感觉很不错,有融汇贯通的感觉。这本书不适合c++入门级的学员。建议看完c++ primer plus(注意不是c++ primer)之后,再看这本书。 这本书之所以我觉得不错,是因为绝大多数建议我都知道,...
在我感觉c++水平到达一定的程度之后,但是又觉得好像没有融汇贯通之前,读了这本书。真的感觉很不错,有融汇贯通的感觉。这本书不适合c++入门级的学员。建议看完c++ primer plus(注意不是c++ primer)之后,再看这本书。 这本书之所以我觉得不错,是因为绝大多数建议我都知道,...
在我感觉c++水平到达一定的程度之后,但是又觉得好像没有融汇贯通之前,读了这本书。真的感觉很不错,有融汇贯通的感觉。这本书不适合c++入门级的学员。建议看完c++ primer plus(注意不是c++ primer)之后,再看这本书。 这本书之所以我觉得不错,是因为绝大多数建议我都知道,...
在我感觉c++水平到达一定的程度之后,但是又觉得好像没有融汇贯通之前,读了这本书。真的感觉很不错,有融汇贯通的感觉。这本书不适合c++入门级的学员。建议看完c++ primer plus(注意不是c++ primer)之后,再看这本书。 这本书之所以我觉得不错,是因为绝大多数建议我都知道,...
在我感觉c++水平到达一定的程度之后,但是又觉得好像没有融汇贯通之前,读了这本书。真的感觉很不错,有融汇贯通的感觉。这本书不适合c++入门级的学员。建议看完c++ primer plus(注意不是c++ primer)之后,再看这本书。 这本书之所以我觉得不错,是因为绝大多数建议我都知道,...
用户评价
这本书绝对是程序员的“案头必备”!我之前一直有一个困扰,就是我的代码虽然能跑,但每次被别人接手或者过一段时间自己再来看,都感觉像是天书一样,完全看不懂。读了《编写高质量代码》之后,我才明白“可读性”的重要性远超我的想象。作者用非常接地气的语言,讲解了如何通过合理的命名、清晰的逻辑结构、恰当的注释来让代码“说话”。书中关于“设计模式”的讲解,更是让我眼前一亮。我一直觉得设计模式是高深莫测的东西,只有大牛才能掌握。但作者通过图文并茂的方式,将常见的几种设计模式,如单例模式、工厂模式、观察者模式等,解释得清晰易懂,并且展示了它们在实际项目中的应用场景。这让我茅塞顿开,原来这些模式并不是虚无缥缈的理论,而是解决实际工程问题的利器。这本书让我看到了代码的“艺术性”,也让我明白,编写高质量代码,绝非一日之功,而是一个持续学习和实践的过程。
这本书简直是为我量身定做的!作为一名刚刚步入技术领域的开发者,我常常在写代码时感到力不从心,总觉得自己的代码写得很“丑”,效率不高,而且bug频出。偶然的机会,我看到了《编写高质量代码》这本书,抱着试一试的心态入手。打开目录,我便被深深吸引,里面涉及到的主题,例如“代码的可读性”、“性能优化”、“错误处理的最佳实践”、“安全编码的原则”等等,都是我工作中经常遇到的痛点。我尤其对其中关于“模块化设计”的讲解印象深刻。作者用非常生动形象的比喻,将复杂的概念拆解开来,让我这个初学者也能轻松理解,并且能立刻将所学应用到我的项目实践中。书中列举的大量实际案例,更是让我茅塞顿开,原来那些我曾经觉得难以解决的问题,都有如此优雅且高效的解决方案。我以前总是在一遍遍地重复造轮子,或者陷入低效的调试循环,现在我明白了,高质量的代码不仅仅是能运行,更是要具备可维护性、可扩展性和可读性。这本书让我看到了代码的另一种可能性,也极大地提升了我编写代码的信心和效率。
我一直认为,技术文档和教程往往枯燥乏味,充斥着晦涩难懂的术语,但《编写高质量代码》这本书彻底颠覆了我的认知。作者的文笔非常流畅,而且充满智慧,读起来就像是在和一位经验丰富的技术前辈在聊天。他不仅仅是介绍“是什么”,更重要的是“为什么”和“怎么做”。比如,在讲解“代码复用”时,他深入剖析了不当的复用可能带来的“技术债务”,并提出了几种更具前瞻性的设计模式,让我深刻理解了“ DRY”(Don't Repeat Yourself)原则背后的哲学。书中关于“代码测试”的部分,更是让我大开眼界。我以前对单元测试、集成测试这些概念了解不深,甚至觉得是浪费时间。但作者通过大量的案例,展示了高质量测试如何能有效地预防bug,减少后期维护成本,甚至还能在重构代码时提供安全保障。读完这一章,我立刻着手为我负责的模块编写单元测试,发现效果远超我的预期。这本书不仅仅是一本技术书籍,更像是一种思维方式的启蒙,让我从一个“能写出代码”的程序员,逐渐成长为一个“写出好代码”的工程师。
说实话,刚拿到《编写高质量代码》这本书的时候,我并没有抱太高的期望,毕竟市面上关于编程的书籍实在太多了,良莠不齐。但是,当我翻开第一页,就被作者那种严谨而又生动的笔触所征服。这本书的内容深度和广度都令我惊叹。作者并没有泛泛而谈,而是深入到代码的每一个细节,从命名规范、注释的艺术,到算法的选择、数据结构的优化,都进行了详尽的阐述。我特别欣赏书中关于“代码评审”的章节,它不仅仅是讲述了评审的重要性,还详细介绍了如何进行有效的评审,以及如何从评审中学习和成长。我以前参加代码评审时,总觉得只是走个形式,很少能从中获得实质性的帮助。但通过阅读这本书,我学会了如何更细致地审视他人的代码,也更能清晰地表达自己的意见。这本书的内容不仅仅适用于初学者,对于我这样有一定经验的开发者来说,也具有极高的参考价值。它让我重新审视了自己的编程习惯,并从中发现了许多可以改进的地方。
《编写高质量代码》这本书,绝对是我近年来阅读过的最有价值的技术书籍之一。作为一名项目负责人,我深切体会到,一个团队的开发效率和代码质量,直接关系到项目的成败。这本书的内容,为我提供了一个非常系统化的框架,来指导我的团队成员编写更高质量的代码。我尤其喜欢书中关于“重构”的部分,它详细阐述了如何安全、有效地对现有代码进行改进,以及如何避免在重构过程中引入新的问题。这对于我们团队来说,简直是雪中送炭。我之前也尝试过一些关于代码质量的培训,但往往效果不佳,因为理论过于抽象,难以落地。而这本书中的每一个观点,都配有详细的案例和实践建议,让我们可以立刻将其应用到日常工作中。读完这本书,我感觉整个团队的代码风格和开发习惯都有了显著的提升,bug率也明显下降。这本书不仅仅是一本技术书籍,更是一本关于“工程能力”的宝典,强烈推荐给所有有志于提升自身技术水平的开发者!
大体上过于浅显。书中提到了部分高级的主题,例如内存管理,不过只是蜻蜓点水了一下。可以安排得过来的话,还是看Thinking In C++。
还好吧
基本属于入门级,偏工程实践,对刚从C语言转到C++开发的同学很有借鉴意义。
C++程序员必读
都是些基本内容