Effective C++:改善程序与设计的55个具体做法
学习一种编程语言的基础是一回事;学习如何用那种语言设计和实现高效率的程序完全是另外一回事。对于C++——一种以拥有非同寻常的能力范围和表现力而自豪的语言——更是尤其如此。如果能正确使用,与C++ 共事是一件令人快乐的事情。极多样的设计样式被直接表达并有效实现。对于classes(类),functions(函数),以及 templates(模板)的明智选择和小心精巧的安排能使应用程序的编程更加简单,直观,高效,并基本无错。如果你知道如何去做,写出高效的C++程序并不特别难。然而,如果不经训练就贸然使用,C++也会导致不可理解的,难以维护的,无法扩展的,低效率的,错误百出的代码。
本书的目的在于引导你如何高效使用C++。我假设你已经熟悉了作为语言的C++并有使用它的一些经验。我在此提供的是使用这种语言的指南,以使你的程序易于理解,可维护,易移植,可扩展,效率高,而且行为符合你的预期。
我提供的建议落在两个主要的范围中:普通的设计策略,以及特殊语言特性的具体细节。设计的讨论集中于如何在C++做某件事情的多种不同方法之间进行选择。如何在 inheritance(继承)和templates(模板)之间选择?如何在 public(公有)和 private inheritance(私有继承)之间选择?如何在private inheritance(私有继承)和composition(复合)之间选择?如何在member(成员)和non-member functions(非成员函数)之间选择?如何在 pass-by-value(传值)和pass-by-reference(传引用)之间选择?在一开始就做出正确的决定是很重要的,因为一个不好的选择可能会直到开发过程很晚的阶段才显现出来,在这时候再调整它常常是困难重重,极为耗时而且代价不菲的。
即使在你正确地知道你要做什么的时候,仅仅把事情做对也是需要技巧的。assignment operators(赋值运算符)的合适的返回类型是什么?destructor(析构函数)什么时候应该是 virtual(虚拟)的?当 operator new(运算符 new)找不到足够的内存时它应该怎么办?类似这些的令人费神的细节是至关重要的,因为错误的做法几乎总是导致无法预料的,很可能令人迷惑的程序行为。这本书正是来帮助你避免这些问题的。
这不是一本全面的C++手册。它收集了55个详细的提议(我将它们称为 Items)告诉你怎样才能改善你的程序和设计。每一个Item都能stands more or less on its own(独立成章),但大部分也包含对其它Items的参考。因而,读这本书的一个方法就是从你感兴趣的一个Item开始,然后顺着它的参考条目继续看下去。
这本书也不是一本C++入门书。例如,在Chapter 2(第二章),我希望能告诉你关于constructors(构造函数),destructors(析构函数),以及assignment operators(赋值运算符)正确实现的全部内容,但是我假设你已经知道或者能在别处找到这些函数做些什么以及它们该怎样声明的资料。大量 C++ 书籍包含类似这样的信息。
这本书的目的是为了突出C++编程中那些常常被忽略的方面。其它书描述了语言的各个部分。这本书则告诉你如何将这些部分结合起来以达到高效编程的最终目的。其它书告诉你如何使你的程序能够编译。这本书则告诉你如何避免那些编译器不能告诉你的问题。
与此同时,本书将自己限制在standard C++(标准 C++)之内。在此仅仅使用官方的语言标准中的特性。可移植性是本书一个关键的关注点,所以如果你要寻找平台依赖的特性和部件,在这里不会找到。
另一个在本书中找不到的东西是C++ Gospel(C++ 福音书)——通向完美的C++软件的一条One True Path(真理之路)。本书中的每一个Item都在如何生成更好的设计,如何避免一般的问题,以及如何得到更高的效率等方面提供指导,但没有一个Item是普遍适用的。软件设计和实现是一项复杂的任务,被hardware(硬件),operating system(操作系统),和application(应用程序)的限制所影响,所以我能做的最好的事情就是为创建更好的程序提供 guidelines(指导方针)。
如果你在所有的时候都遵守这些guidelines(指导方针),你将不太可能落入环绕在C++周围的大量陷阱中,但是作为 guidelines(指导方针)的固有限制,它总有例外。这就是为什么每一个Item都有一个详细的解释。这些解释是本书中最重要的部分。只有理解了一个Item背后的基本原理,你才能决定它是否适合你开发的软件以及你被困其下的特有的限制。
本书最好用来增加关于C++如何运转,为什么它会这样运转,以及如何让它的行为为你服务等方面的知识。盲目运用本书的Items无疑是不适当的,但是与此同时,如果你没有更好的理由,或许也不应该违反这些guidelines(指导方针)中的任何一条。
-
爆发 大数据时代预见未来的新思维
人类的日常行为模式不是随机的,而是具有“爆发性”的。预测人类行为是一个经久不衰的梦想。科学家乃至伪科学家们为了解开人类行为之谜,已... 1210 0 24-05-28 -
php调用微信公众平台接口
php开发微信公众平台包括获取access_token,access_token换取ticket,根据ticket获取二维码,微信公众号上传文件,公众号创建菜单,菜单点... 1207 0 24-05-24 -
JS正则判断校验姓名、手机号及身份证号码
JS校验判断姓名const reg = /^[\u4e00-\u9fa5]{2,8}$/; const name = "呜哈哈1"; console.log(`姓名校验 ${reg.test(name) ? "正确" : "错... 786 0 25-04-07 -
实用人体解剖图谱 躯干内脏分册
《实用人体解剖图谱》结合临床的实际需要,按照人体的部位进行分册,即头颈分册、躯干内脏分册和四肢分册。为了让读者对人体的结构建立一个... 1481 0 24-06-18 -
人工智能及其应用(第3版) | 高等教育出版社二维码服务平台在线视频
人工智能是解决复杂工程问题的重要工具,是当前许多高新技术产品中的核心技术。读者通过学习本书,能够掌握人工智能的基本内容,了解人工智... 2592 0 24-08-06 -
码力全开资源站 - 汇集产品、设计、独立开发者的高质量资源站
码力全开是由国内开发者 Larry 创建的设计类导航网站,目前共有接近30种标签分类网站,其中的图库网站,图标网站,样机工具,设计灵感都... 905 0 25-01-14 -
手撸call apply bind
如果自己去实现call apply bind,看上去挺复杂,写起来其实就几行代码 因为call和apply一样,只是传参不一样,所以我就只写一个call实现... 691 0 25-04-07 -
photoshop cc 2018 中文破解版
photoshop cc 2018破解版是Adobe公司最新版专业CC图像处理软件,新功能超乎你的想象!photoshop cc 2018破解版新功能给力来袭,访问Lig... 626 0 21-07-07
发表我的评论
- 这篇文章还没有收到评论,赶紧来抢沙发吧~