2010年秋,电子社编辑侠少寄给我一本EffectiveC++(第三版)英文原版书,并托我为这本书写一些评注,希望做成评注版在国内出版。经慎重考虑后我受领了这一任务。

与Effective C++的渊源

回想起来,通过更深入地理解C++而获得一种喜悦感,已是十多年前的事情了。2000年前后我刚刚从C语言迁移到C++来做实际的项目,同一时期国内涌现出一大批C++语言相关著作。我读了一本便一发不可收拾,几乎阅遍当时可以找到的相关书籍。从纯粹学习语言的角度来讲,EffectiveC++是相当重要的一本书,也是作为过来人的我最想推荐给大家的。阅读其时(当时是第二版),我已经用C++编写过一个开源的游戏引擎,有了数万行代码的经验,书中总结的条款读来心有戚戚焉。犹记得当年是在书店驻足读完大半本书,才想起来买下来带回去读。

时光堆积的反思

之后的几年里,我用C++编写了数十万行代码。写得越多,对之前的作品越不满意,代码风格也随之变化,而且慢慢产生怀疑,到底是否存在一种普遍合理、高效的C++使用方法——它可以让其他程序员,或是将来的自己审阅代码后,表示一致赞赏,而不需要用无休止的重构来满足自己的完美主义倾向。其实也就是本书作者ScottMeyers这些年来探讨的主题。C++伴随软件工业发展这些年,修修补补。由于工程需要,它必须保持向前兼容,并尽量满足每个时期的工程需求。这注定它不可能是一门完美的语言,也注定它是一门备受争议的语言。

尽管对C++的批评和质疑从未间断,但毋庸置疑,它绝不会销声匿迹。而且,C++到底是不是一门高效语言,并不是本书探讨的重点。本书的着眼点在于,如果你选择了C++,如何使它变得更高效,也即如何有效使用C++。其实,一开始我是有些好奇,大牛Scott Meyers这个主题写了十多年,就没有什么可抱怨的?当这次为点评而重新读到Item 25——由std::swap的扩展问题(本书第117页)引申到特例化std名字空间里的方法时,一  句“Alas, the form of the prohibition maydismay you”惹我会心一笑,从此释然。

再读经典的别样感触

再读这本书的新版,速度很慢,有时还会和第二版对照一下,体会作者思想的变迁。作为参考,还重温了《C++语言的设计和演化》的几个章节。毕竟文字最终要印成铅字,不由得慎重起来,似乎从来没有如此耐心地逐字读英文句子。读到细节处,发现作者把每个问题讲得都很透,表达流畅,前后反复呼应,即使无太多英文阅读经验的人,也可以轻松读懂,不愧是写了十年的精品。十分钦佩之余,却也为无从下笔而犯难,似乎能任意发挥之处,只剩对C++的争议。初稿发给出版社后,经编辑提醒又增加一些“帮助初学者解惑和提速”的内容,希望不致误导C++初学者放弃学习这门有趣的语言。

不安的评注者

评注这个工作比翻译难做,尤其是评EffectiveC++这样的经典。写得太多有狗尾续貂之嫌,太少又愧对读者的期望。而且,无论怎样写,都会带有特定时期个人观点的局限性。要特别提醒的是,不要把某些评注看作是对C++的批评。作为用了多年C++并一度沉迷其中的程序员,那只是爱之深后的责之切。

本书除了少部分评注是针对个别代码段或关键词外,尚有不少篇幅为对原书篇章、段落主题的拓展思考,可抛开原文独立阅读。限于水平,有很多地方,想表达的东西没能讲透,是一种遗憾。相对于ScottMeyers积累了十数年的精华章句,我这个后学晚辈仓促成文忝列其间,实在诚惶诚恐。评注中错误之处,望方家或不吝赐教,或一笑了之。

祝各位读者拥有和我一样愉快的阅读体验。

云风2011 年春 于 杭州

序  言

1991年我写下Effective C++第一版。1997年撰写第二版时我更新了许多重要内容,但为了不让熟悉第一版的读者感到困惑,我竭尽所能保留原始结构:原先50个条款中的48个标题基本没变。如果把书籍视为一栋房屋,第二版只是更换地毯、灯饰,重新粉刷一遍而已。

到了第三版,修缮工作进一步深入壁骨墙筋(好几次我甚至希望能够翻新地基)。1991年起C++世界经历了巨大变革,而本书目标——在一本小而有趣的书中确认最重要的一些C++编程准则——却已不再能够由15年前建立的那些条款体现出来。“C++程序员拥有C背景”这句话在1991年是个合理假设,如今C++程序员却很可能来自Java或C#阵营。继承(inheritance)和面向对象编程(object-orientedprogramming)在1991年对大多数程序员都很新鲜,如今程序员已经建立良好概念,异常(exceptions)、模板(templates)和泛型编程(genericprogramming)才是需要更多引导的领域。1991年没人听过所谓设计模式(designpatterns),如今少了它很难讨论软件系统。1991年C++正式标准才刚要上路,如今C++标准规范已经8岁,新版规范蓄势待发†。

为了对付这些改变,我把所有条款抹得一干二净,然后问自己“2005年什么是对C++程序员最重要的忠告?”答案便是第三版中的这些条款。本书有两个新章,一个是资源管理(resourcemanagement),一个是模板编程(programmingwith templates)。实际上template这东西遍布全书,因为它们几乎影响了C++的每个角落。本书新素材还包括在exceptions概念下编程、套用设计模式,以及运用新的TR1程序库设施(TR1于条款54描述)。本书也告诉大家在单线程系统(single-threadedsystems)中运行良好但可能不适用于多线程系统(multithreaded systems)的某些技术和做法。本书半数以上内容是新的。在此同时第二版大部分基础信息仍然很重要,所以我找出一个保留它们的办法:你可以在附录B找到第二、第三两版的条款对应表。

我努力让本书达到我所能够达到的最佳状态,但这并不表示它已臻完美。如果你认为某些条款不适合作为一般性忠告,或你有更好的办法完成本书所谈的某件工作,或书中某些技术讨论不够清楚不够完全,甚或有所误导,请告诉我。如果你找出任何错误——技术上的、文法上的、排版印刷上的,不论哪一种——也请告诉我。我很乐意将第一位提出问题并吸引我注意的朋友加入下次印刷的致谢名单中。

即使本书条款个数扩充为55,这一整组编程准则还谈不上完备。然而毕竟整理出优良准则——几乎任何时间适用于任何应用程序的准则——比想象中困难得多。如果你有其他编程准则的想法或建议,我将乐以与闻。

我手上维护本书第一印以来的变化清单,其中包括错误修订、进一步说明和技术更新。这份清单放在网址为http://aristeia.com/BookErrata/ec++3e-errata.html的"Effective C++ Errata"网页上。如果你希望在这份清单更新时获得通知,请加入我的邮件列表。这份列表用来发布消息给可能对我的专业工作感兴趣的人士,详情请见http://aristeia.com/MailingList/。

ScottDouglas Meyers                                        Stafford.Oregon

http://aristeia.com/                                             2005年4月

侯捷  译


† C++标准在1998年做过修订,后来在2003年做了一次。之后,新的标准一直难产。在很长时间,C++社区都没能确定新标准会在什么时间制订出来,只能将其暂时称为C++ 0x,以期可以在新世纪的第一个十年内确定下来。可惜最后到了2010年还争论不休,以至于大家笑谈0x指的是16进制。

值得庆幸的是,争议终于在2011年得到终结,我们应该能在2011年的夏天看到正式的C++ 2011标准文本。这个冗长的规范制订过程已经让C++社区等了太久。

C++ 2011增加了许多新东西,或许会让C++程序员们感觉到它更像是一门新的语言。如果需要了解新标准,可以在C++之父Stroustrup的个人主页上找到他维护的C++0x FAQ一读。我想,大部分C++程序员都能从中找到令人兴奋的东西。

我们也期待本书可以再有一个新版本。

Effective C++:改善程序与设计的55个具体做法:第3版 评注者序相关推荐

  1. Effective C++改善程序与设计的55个具体做法笔记

    Scott Meyers大师Effective三部曲:Effective C++.More Effective C++.Effective STL,这三本书出版已很多年,后来又出版了Effective ...

  2. (6)继承与面向对象设计- Effective C++改善程序与设计的55个具体做法(Effective C++: 55 Specific Ways to Improve Your Programs)

    文章目录 32. 确定你的public继承塑模出is-a关系(Make sure public inheritance models "is-a") 33. 避免遮挡继承而来的名称 ...

  3. 读 S. Meyers 之《Effective C++:改善程序与设计的55个具体做法:第3版》

    S. Meyers, 侯捷. Effective C++:改善程序与设计的55个具体做法:第3版. ISBN: 978-7-121-12332-0. 如果说 C 的缺陷能写一本书,那么 C++ 的缺陷 ...

  4. Effective C++:改善程序与设计的55个具体做法

    Effective C++:改善程序与设计的55个具体做法 二.构造/析构/赋值运算 05 Know what functions C++ silently writes and calls. 06 ...

  5. 中文版《Effective C++:改善程序与设计的55个具体做法

    第一章 从C转向C++ 对每个人来说,习惯C++需要一些时间,对于已经熟悉C的程序员来说,这个过程尤其令人苦恼.因为C是C++的子集,所有的C的技术都可以继续使用,但很多用起来又不太合适.例如,C++ ...

  6. 不为人知的 35 个 More Effective C++ 改善编程与设计的最佳方法 | 原力计划

    作者 | fengbingchun 责编 | 屠敏 出品 | CSDN 博客 Scott Meyers大师Effective三部曲:Effective C++.More Effective C++.E ...

  7. 优秀网站设计:打造有吸引力的网站(原书第3版)

    <优秀网站设计:打造有吸引力的网站(原书第3版)> 基本信息 原书名:Web Style Guide, 3rd Edition 作者: (美)Patrick J. Lynch Sarah ...

  8. 架构,改善程序复用性的设计~第五讲 复用离不开反射和IOC

    从本文标题中可以看出,主要说的是反射技术和控制反转(IOC)技术,本文主要先介绍一下我对这两种技术的理解及它们的优缺点,最后再用实例来说一下使用方法. 反射:可以使用反射动态创建类型的实例,将类型绑定 ...

  9. 《More Effective C++:35个改善编程与设计的有效方法》(中文版)

    <More Effective C++:35个改善编程与设计的有效方法>(中文版)china-pub计算机新书推荐 基本信息原书名: More Effective C++: 35 New ...

  10. [转]使用设计模式改善程序结构(二)

    使用设计模式改善程序结构(二) 在本系列的 第一篇文章中,描述了如何通过设计模式来指导我们的程序重构过程,并且着重介绍了设计模式意图.动机的重要性.在本文中我们将继续上篇文章进行讨论,这次主要着重于设 ...

最新文章

  1. Xamarin Anroid开发教程之验证环境配置是否正确
  2. 微信系小程序 StorageSync
  3. Spring Boot配置多数据源
  4. EPSON 机器人多任务下的互锁处理
  5. 计算机活动宣传稿,畅想科技,创造梦想 ——东华大学计算机科学与技术学院第十一届图灵科技文化节通讯稿...
  6. 如何使用 Pylint 来规范 Python 代码风格
  7. 水抗攻击(APT攻击手段)
  8. ASP.NET的权限问题
  9. ASP.NET伪静态的方法及相关资料
  10. Emacs Lisp程序单步调试
  11. V4L2视频应用程序编程架构
  12. c++整理程序 dev_【C++】用Dev-C++写的C++程序老是报错,请问为什么?如何解决?...
  13. [2018.10.11 T1] 锻造
  14. java测试vss_VSS项目分支
  15. with ties 的用法
  16. iOS 渲染原理解析
  17. 书香小说APP界面设计
  18. 二叉树【按层打印、序列化、反序列化】
  19. php 文章页面阅读全文,纯代码为WordPress文章内容页增加阅读全文展开功能
  20. 由旋转矩阵到Rodrigues

热门文章

  1. jQuery选择器整理+知识总结
  2. vue组件化学习第一天
  3. 数据库语句数据库学习(3)——数据库的创建与删除
  4. 网页校验器:含有Flash的网页如何通过校验 ?
  5. (OCR公式)Mathpix Snipping Tool
  6. STL中vector介绍
  7. IIS7下访问ashx页面,显示404
  8. [Matlab]切比雪夫Ⅱ型滤波器设计:低通、高通、带通和带阻
  9. 《我们不一样团队》项目需求分析改进
  10. Android自定义开机和关机动画