词条 | EffectiveC++:改善程序与设计的55个具体做法:第3版 |
释义 | 图书信息书名:Effective C++ : 改善程序与设计的55个具体做法:第3版作者:[美]Scott Meyers(斯考特.梅耶)著 侯捷 译 ISBN:978-7-121-12332-0 出版日期:2011年1月 定价:定 价:65.00元 宣传语传承大师智慧 领悟技术本真 经典名著 翻译良品 典藏不二之选 高效的classes、functions、templates和inheritance hierarchies(继承体系)方面的专家级指导。 崭新的“TR1”标准程序库功能应用,以及与既有标准程序库组件的比较。 洞察C++和其他语言(例如Java、C#、C)之间的不同。此举有助于那些来自其他语言阵营的开发人员消化吸收C++式的各种解法。 作 者 简 介Scott Meyers是全世界最知名的C++软件开发专家之一。他是畅销书《Effective C++》系列(Effective C++,More Effective C++,Effective STL)的作者,又是创新产品《Effective C++ CD》的设计者和作者,也是Addison-Wesley的“Effective Software Development Series”顾问编辑,以及《Software Development》杂志咨询板成员。他也为若干新公司的技术咨询板提供服务。Meyers于1993年自Brown大学获得计算机博士学位。 译 者 简 介侯捷是计算机技术书籍的作家、译者、书评人。著有《深入浅出MFC》、《多型与虚拟》、《STL源码剖析》、《无责任书评》三卷,译有众多脍炙人口的高阶技术书籍,包括Meyers所著的“Effective C++”系列。侯捷兼任教职于元智大学、同济大学、南京大学。 内 容 简 介 有人说C++程序员可以分为两类,读过Effective C++的和没读过的。世界顶级C++大师Scott Meyers成名之作的第三版的确当得起这样的评价。当您读过这本书之后,就获得了迅速提升自己C++功力的一个契机。 在国际上,本书所引起的反响,波及整个计算机技术的出版领域,余音至今未绝。几乎在所有C++书籍的推荐名单上,本书都会位于前三名。作者高超的技术把握力、独特的视角、诙谐轻松的写作风格、独具匠心的内容组织,都受到极大的推崇和仿效。这种奇特的现象,只能解释为人们对这本书衷心的赞美和推崇。 这本书不是读完一遍就可以束之高阁的快餐读物,也不是用以解决手边问题的参考手册,而是需要您去反复阅读体会的,C++是真正程序员的语言,背后有着精深的思想与无以伦比的表达能力,这使得它具有类似宗教般的魅力。希望这本书能够帮您跨越C++的重重险阻,领略高处才有的壮美风光,做一个成功而快乐的C++程序员。 译 序按孙中山先生的说法,这个世界依聪明才智的先天高下得三种人:先知先觉得发明家,后知后觉得宣传家,不知不觉得实践家。三者之中发明家最少最稀珍,最具创造力。正是匠心独具的发明家创造了这个花花绿绿的计算机世界。 以文字、图书、授课形式来讲解、宣扬、引导技术的人,一般被视为宣传家而非发明家。然而,有一类最高等级的技术作家,不但能将精辟独到的见解诉诸文字,又能创造新的教学形式,引领风骚,对技术的影响和对产业的贡献不亚于技术或开发工具的创造者。这种人当之发明家亦无愧矣。 Scott Meyers就是这一等级的技术作家! 自从1991年出版《Effective C++》之后,Meyers声名大噪。1996年的《More Effective C++》和1997年的《Effective C++》2/e以及2001年的《Effective STL》让他更上高楼。Meyers擅长探索编程语言的极限,穷尽其理,再以一支生花妙笔将复杂的探索过程和前因后果写成环环相扣故事性甚强的文字。他的幽默文风也让读者在高张力的技术学习过程中犹能享受“阅读的乐趣”——这是我对技术作家的最高礼赞。 以条款(items)传递专家经验,这种写作形式是否为Meyers首创我不确定,但的确是他造成了这种形式的计算机书籍写作风潮。影响所及,《Exceptional C++》、《More Exceptional C++》、《C++ Gotchas》、《C++ Coding Standards》、《Effective COM》、《Effective Java》、《Practical Java》纷纷在书名或形式上“向大师致敬”。 睽违8年之后《Effective C++》第三版面世了。我很开心继第二版再次受邀翻译。Meyers在自序中对新版已有介绍,此处不待赘言。在此我适度修改第二版部分译序,援引于下,协助读者迅速认识本书定位。 C++ 是一个难学易用的语言! C++ 的难学,不仅在其广博的语法,以及语法背后的语义,以及语义背后的深层思维,以及深层思维背后的对象模型;C++ 的难学还在于它提供了四种不同而又相辅相成的编程范型(programming paradigms):procedural-based, object-based, object-oriented, generics。 世上没有白吃的午餐!又要有效率,又要有弹性,又要前瞻望远,又要回溯相容,又要治大国,又要烹小鲜,学习起来当然就不可能太简单。在庞大复杂的机制下,万千使用者前仆后继的动力是:一旦学成,妙用无穷。 C++ 相关书籍车载斗量,如天上繁星,如过江之鲫。广博如四库全书者有之(The C++ Programming Language、C++ Primer、Thinking in C++),深奥如重山复水者有之(The Annotated C++ Reference Manual, Inside the C++ Object Model),细说历史者有之(The Design and Evolution of C++, Ruminations on C++),独沽一味者有之(Polymorphism in C++),独树一帜者有之(Design Patterns, Large Scale C++ Software Design, C++ FAQs),另辟蹊径者有之(Generic Programming and the STL),程序库大全有之(The C++ Standard Library),专家经验之累积亦有之(Effective C++, More Effective C++)。这其中“专家经验之累积”对已具 C++ 相当基础的程序员有着立竿见影的帮助,其特色是轻薄短小,高密度纳入作者浸淫C++/OOP多年的广泛经验。它们不但开展读者的视野,也为读者提供各种C++/OOP常见问题的解决模型。某些主题虽然在百科型C++ 语言书中也可能提过,但此类书籍以深度探索的方式让我们了解问题背后的成因、最佳解法,以及其他可能的牵扯。这些都是经验的累积和心血的结晶,十分珍贵。 《Effective C++》就是这样一本轻薄短小高密度的“专家经验累积”。 本中译版与英文版页页对译,保留索引,偶尔加上小量译注;愿能提供您一个愉快的学习。千里之行始于足下,祝愿您从声名崇隆的本书展开一段新里程。同时,我也向您推荐本书之兄弟《More Effective C++》,那是Meyers的另一本同样盛名远播的书籍。 侯捷 2006/02/15于台湾新竹 英中简繁术语对照 这里列出本书出现之编程术语的英中对照。本中文版在海峡两岸同步发行,因此我也列出本书简繁两版的术语对照,方便某些读者从中一窥两岸计算机用语。 表中带有 * 者表示本书对该词条大多直接采用英文术语。中英术语的选择系由以下众多考虑中取其平衡: 业界和学界习惯。即便是学生读者,终也要离开学校进入职场;熟悉业界和学界的习惯用语(许多为英文),避免二次转换,很有必要。 这是一本中文版,需顾及中文阅读的感觉和顺畅性。过多保留英文术语会造成版面的破碎与杂乱!然若适度保留英文术语,可避免某些望之不似术语的中文出现于字里行间造成阅读的困扰和停顿,有助于流畅的思考和留下深刻印象。 凡涉及C++ 语言关键字之相关术语皆保留。例如class, struct, template, public, private, protected, static, inline, const, namespace …… 以上术语可能衍生复合术语,例如与class相关的复合术语有base class, derived class, super class, subclass, class template …… 此类复合术语如果不长,尽皆保留原文;若太长则视情况另作处理(也许中英并陈,也许赋予特殊字体)。 凡计算机科学所称之数据结构名称,尽皆保留。例如stack, queue, tree, hashtable, map, set, deque, list, vector, array …… 偶尔将array译为数组。 某些流通但不被我认为足够理想之中译词,保留原文不译。例如reference。 某些英文术语被我刻意以特殊字体表现并保留,例如pass by reference、pass by value、copy构造函数、assignment操作符、placement new。 少量术语为顾及词性平衡,时而采用中文(如指针、类型)时而采用英文(如pointer、type)。 索引之于科技书籍非常重要。本书与英文版页页对译,因此原封不动保留所有英文索引。 过去以来我一直不甚满意object和type两个术语的中译词:“对象”和“类型”,认为它们缺乏术语突出性(前者正确性甚至有待商榷),却又频繁出现影响阅读,因此常在我的著作或译作中保留其英文词或偶尔采用繁体版术语:“物件”和“型别”。但现在我想,既然大家已经很习惯这两个中文术语,也许我只是杞人忧天。因此本书采用大陆读者普遍习惯的译法。不过我仍要提醒您,"object" 在Object Oriented技术中的真正意义是“物体、物件”而非“对象、目标”。 以下带有 * 者表示本书对该词条采英文词,不译为中文 英文术语 简体版译词 繁体版译词 abstract 抽象的 抽象的 abstraction 抽象性、抽象件 抽象性、抽象件 access 访问 存取、取用 access level 访问级别 存取级别 access function 访问函数 存取函式 adapter 适配器 配接器 address 地址 地址 address-of operator 取地址操作符 取址运算子 aggregation 聚合 聚合 algorithm 算法 演算法 allocate 分配 配置 allocator 分配器 配置器 application 应用程序 应用程式 architecture 体系结构 体系结构 argument 实参 引数 *array 数组 阵列 arrow operator 箭头操作符 箭头运算子 assembly language 汇编语言 组合语言 *assert(-ion) 断言 断言 assign(-ment) 赋值 赋值 assignment operator 赋值操作符 赋值运算子 *base class 基类 基础类别 *base type 基类型 基础型别 binary search 二分查找 二分搜寻 *binary tree 二叉树 二元树 binary operator 二元操作符 二元运算子 binding 绑定 绑定、系结 *bit 位 位元 *bitwise (以bit为单元逐一 ……) block 区块 区块 boolean 布尔值 布林值 breakpoint 断点 中断点 build 建置 建置 build-in 内置 内建 bus 总线 汇流排 *byte 字节 位元组 cache 高速缓存(区) 快取(区) call 调用 呼叫 callback 回调 回呼 call operator call操作符 call运算子 character 字符 字元 *child class 子类 子类别 *class 类 类别 *class template 类模板 类别模板 client 客户 客户 code 代码 程式码 compatible 兼容 相容 compile time 编译期 编译期 compiler 编译器 编译器 component 组件 组件 composition 复合 复合 concrete 具象的 具象的 concurrent 并发 并行 configuration 配置 组态 connection 连接 连接,连线 constraint 约束(条件) 约束(条件) construct 构件 构件 container 容器 容器 *const (C++ 关键字,代表constant) constant 常量 常数 constructor 构造函数 建构式 *copy(动词) 拷贝 拷贝、复制 copy(名词) 复件、副本 复件、副本 create 创建 产生、建立、生成 custom 定制 订制、自定 data 数据 资料 database 数据库 资料库 data member 成员变量 成员变数 data structure 数据结构 资料结构 debug 调试 除错 debugger 调试器 除错器 declaration 声明式 宣告式 default 缺省 预设 definition 定义式 定义式 delegate 委托 委托 dereference 提领(解参考) 提领 *derived class 派生类 衍生类别 design pattern 设计模式 设计范式 destroy 销毁 销毁 destructor 析构函数 解构式 directive 指示符 指令 document 文档 文件 dynamic binding 动态绑定 动态绑定 entity 物体 物体 encapsulation 封装 封装 *enum(-eration) 枚举 列举 equality 相等 相等 equivalence 等价 等价 evaluate 核定、核算 核定、核算 exception 异常 异常 explicit 显式 显式、明白的 expression 表达式 算式 file 文件 档案 framework 框架 框架 full specialization 全特化 全特化 function 函数 函式 function object 函数对象 函式物件 *function template 函数模板 函式模板 generic 泛型、泛化、一般化 泛型、泛化、一般化 *getter(相对于setter) 取值函数 取值函式 *global 全局的 全域的 *handle 句柄 识别号、权柄 *handler 处理函数 处理函式 *hash table 哈希表、散列表 杂凑表 header (file) 头文件 表头档 *heap 堆 堆积 hierarchy 继承体系(层次结构) 继承体系(阶层体系) identifier 标识符 识别字、识别符号 implement(-ation) 实现 实作 implicit 隐喻的、暗自的、隐式 隐喻的、暗自的、隐式 information 信息 资讯 inheritance 继承 继承 *inline 内联 行内 initialization list 初值列 初值列 initialize 初始化 初始化 instance 实体 实体 instantiate 具现化、实体化 具现化、实体化 interface 接口 介面 Internet 互联网 网际网路 interpreter 解释器 直译器 invariants 恒常性 恒常性 invoke 调用 唤起 iterator 迭代器 迭代器 library 程序库 程式库 linker 连接器 连结器 literal 字面常量 字面常数 *list 链表 串列 load 装载 载入 *local 局部的 区域的 lock 机锁 机锁 loop 循环 回圈 lvalue 左值 左值 macro 宏 巨集 member 成员 成员 member function 成员函数 成员函式 memory 内存 记忆体 memory leak 内存泄漏 记忆体洩漏 meta- 元- 超- *meta-programming 元编程 超编程 modeling 塑模 模塑 module 模块 模组 modifier 修饰符 饰词 multi-tasking 多任务 多工 *namespace 命名空间 命名空间 native 固有的 原生的 nested 嵌套 嵌套、巢状 object 对象 物件 object based 基于对象的 植基於物件、以物件为基础 object model 对象模型 物件模型 object oriented 面向对象 物件导向 operand 操作数 运算元 operating system 操作系统 作业系统 operator 操作符 运算子 overflow 溢出 上限溢位 overhead 额外开销 额外开销 overload 重载 重载 override 覆写 覆写 package 包 套件 parallel 并行 平行 parameter 参数、形参 参数 *parent class 父类 父类别 parse 解析 解析 partial specialization 偏特化 偏特化 *pass by reference 按址传递 传址 *pass by value 按值传递 传值 pattern 模式 范式 *placement delete (某种特殊形式的delete operator) *placement new (某种特殊形式的new operator) pointer 指针 指标 polymorphism 多态 多型 preprocessor 预处理器 前处理器 print 打印 列印 printer 打印机 印表机 process 进程 行程 program 程序 程式 programmer 程序员 程式员 programming 编程 编程 project 项目 专案 pseudo code 伪码 伪码 quality 质量 品质 *queue 队列 伫列 raw 原始的、未经处理的 原始的、未经处理的 recursive 递归 递回 refer to 指涉、指称、指向 指涉、指称、指向 *reference 引用 参考、引用 regular expression 正则表达式 正则算式 resolve 解析 决议 return 返回 回返、传回 return type 返回类型 回返型别 return value 返回值 回返值 runtime 运行期 执行期 rvalue 右值 右值 save 存储 储存 schedule 调度 排程 scheduler 调度器 排程器 scope 作用域 作用域 search 查找 搜寻 semantics 语义 语意 *setter(相对于getter) 设值函数 设值函式 signature 签名(式) 签名(式) smart pointer 智能指针 智慧型指标 specialization 特化 特化 source 源码 源码 *stack 栈 堆叠 standard library 标准程序库 标准程式库 statement 语句 述句 *static 静态的 静态的 string 字符串 字串 *subtype 子类型 子型别 support 支持 支援 *template 模板 范本 temporary object 临时对象 暂时物件 text 文本 文字 thread 线程 绪程 thread safe 多线程安全 多绪安全 throw 抛、掷 抛、掷 token 语汇单元 语汇单元 type 类型 型别 unary function 单参函数 一元函式 underflow 下溢 下限溢位 unqualified 未经资格修饰 未经资格修饰 user 用户 用户 user interface 用户界面 用户介面 *value 值、数值 值、数值 variable 变量 变数 *vector 矢量 向量 virtual function virtual函数 virtual函式 virtual machine 虚拟机 虚拟机器 序 言1991年我写下《Effective C++》第一版。1997年撰写第二版时我更新了许多重要内容,但为了不让熟悉第一版的读者感到困惑,我竭尽所能保留原始结构:原先50个条款中的48个标题基本没变。如果把书籍视为一栋房屋,第二版只是更换地毯灯饰,重新粉刷一遍而已。 到了第三版,修缮工作进一步深入壁骨墙筋(好几次我甚至希望能够翻新地基)。1991年起C++ 世界经历了巨大变革,而本书目标——在一本小而有趣的书中确认最重要的一些C++ 编程准则——却已不再能够由15年前建立的那些条款体现出来。“C++ 程序员拥有C背景”这句话在1991年是个合理假设,如今C++ 程序员却很可能来自Java或C# 阵营。继承(inheritance)和面向对象编程(object-oriented programming)在1991年对大多数程序员都很新鲜,如今程序员已经建立良好概念,异常(exceptions)、模板(templates)和泛型编程(generic programming)才是需要更多引导的领域。1991年没人听过所谓设计模式(design patterns),如今少了它很难讨论软件系统。1991年C++ 正式标准才刚要上路,如今C++ 标准规范已经8岁,新版规范蓄势待发。 为了对付这些改变,我把所有条款抹得一干二净,然后问自己“2005年什么是对C++ 程序员最重要的忠告?”答案便是第三版中的这些条款。本书有两个新章,一个是资源管理(resource management),一个是模板编程(programming with templates)。实际上template(模板)这东西遍布全书,因为它们几乎影响了C++ 的每个角落。本书新素材还包括在exceptions(异常)概念下编程、套用设计模式、 以及运用新的TR1程序库设施(TR1于条款54描述)。本书也告诉大家在单线程系统(single-threaded systems)中运作良好但可能不适用于多线程系统(multithreaded systems)的某些技术和做法。本书半数以上内容是新的。在此同时第二版大部分基础信息仍然很重要,所以我找出一个保留它们的办法:你可以在附录B找到第二、第三两版的条款对应表。 我努力让本书达到我所能够达到的最佳状态,但这并不表示它已臻完美。如果你认为某些条款不适合作为一般性忠告,或你有更好的办法完成本书所谈的某件工作,或书中某些技术讨论不够清楚不够完全,甚或有所误导,请告诉我。如果你找出任何错误——技术上的、文法上的、排版印刷上的,不论哪一种——也请告诉我。我很乐意将第一位提出问题并吸引我注意的朋友加入下次印刷的致谢名单中。 即使本书条款个数扩充为55,这一整组编程准则还谈不上完备。然而毕竟整理出优良准则——几乎任何时间适用于任何应用程序的准则——比想象中困难得多。如果你有其他编程准则的想法或建议,我将乐以与闻。 我手上维护本书第一刷以来的变化清单,其中包括错误修订、进一步说明和技术更新。这份清单放在网址为的"Effective C++ Errata" 网页上。如果你希望在这份清单更新时获得通知,请加入我的邮件列表。这份列表用来发布消息给可能对我的专业工作感兴趣的人士,详情请见。 Scott Douglas Meyers Stafford.Oregon April 2005 致 谢 《Effective C++》已经面世15年了,我开始学习C++ 则是在书写此书的前5年。也就是说 "Effective C++项目" 已经发展两个年代了。此期间我得益于数百(数千?)人的深刻知识、对我的建议与修正,以及偶发的一些目瞪口呆的事绩。这些人帮助我更加完善《Effective C++》,我要对他们全体表示感谢。 我已经放弃追踪“在哪儿学到什么”的历史,但永远记得有个公众信息来源不断带给我帮助:Usenet C++ newsgroups,特别是comp.lang.c++.moderated和comp.std.c++。本书许多——也许是大多数——条款得益于这些讨论群所突出的若干技术想法和后续调查与诊疗。 关于第三版新内容,Steve Dewhurst和我一起讨论了最初的条款名单。条款11中关于“藉由copy-and-swap实现operator=”的构想来自Herb Sutter在此主题的作品,像是《Exceptional C++》(Addison-Wesley, 2000)条款13。RAII(见条款13)源自Bjarne Stroustrup的《The C++ Programming Language》(Addison-Wesley, 2000)。条款17背后的想法来自Boost shared_ptr网页上的“Best Practices”节区又得到Herb Sutter的《More Exceptional C++》(Addison-Wesley, 2002)条款21的琢磨。条款29强烈受到Herb Sutter在此主题上的广泛作品的影响,像是《Exceptional C++》条款8~19,《More Exceptional C++》条款17~23,以及《Exceptional C++ Style》(Addison-Wesley, 2005)条款11~13;David Abrahams帮助我更好地了解三个异常安全性保证。条款35的NVI 手法来自Herb Sutter写于《C/C++ Users Journal》2001年9月份的 "Virtuality" 专栏。同一条款中的Template Method和Strategy设计模式来自《Design Patterns》(Addison-Wesley, 1995),作者是Erich Gamma, Richard Helm, Ralph Johnson和John Vlissides。条款37所说的NVI使用手法,概念来自Hendrik Schober。David Smallberg 给了我动机在条款38写出一个定制型set 实现品。条款39提到EBO通常只在多重继承中才可用,这个构想源自David Vandevoorde和 Nicolai M. Josuttis合著的《C++ Templates》(Addison-Wesley, 2003)。条款42中我对typename的最初理解来自Greg Comeau主持的 "C++ and C FAQLeor Zolman则帮助我认知我的最初了解并不正确(是我的错,和Greg无关)。条款46的本质源自于Dan Sak的谈话,"Making New Friends"。条款52末尾的那个想法“如果你声明一版operator new,你也应该声明其对应的delete伙伴”源自Herb Sutter的《Exceptional C++ Style》条款22。我从David Abrahams身上更多了解了Boost的检评过程(条款55有一份摘要)。 上面所说关于我向谁或从某处学习某一技术,并不必然表示谁或某处就是该技术的发明人或发表处。 我的笔记还告诉我,我也使用了来自Steve Clamage, Antoine Trux, Timothy Knox和Mike Kaelbling的信息,可惜这份笔记没有提到如何以及在哪儿学到什么。 第一版草稿由Tom Cargill, Glenn Carroll, Tony Davis, Brian Kernighan, Jak Kirman, Doug Lea, Moises Lejter, Eugene Santos, Jr., John Shewchuk, John Stasko, Bjarne Stroustrup, Barbara Tilly和Nancy L. Urbano共同检阅。我收到了一些改善建议并纳入后来刷次,这些建议来自Nancy L. Urbano, Chris Treichel, David Corbin, Paul Gibson, Steve Vinoski, Tom Cargill, Neil Rhodes, David Bern, Russ Williams, Robert Brazile, Doug Morgan, Uwe Steinmüller, Mark Somer, Doug Moore, David Smallberg, Seth Meltzer, Oleg Shteynbuk, David Papurt, Tony Hansen, Peter McCluskey, Stefan Kuhlins, David Braunegg, Paul Chisholm, Adam Zell, Clovis Tondo, Mike Kaelbling, Natraj Kini, Lars Nyman, Greg Lutz, Tim Johnson, John Lakos, Roger Scott, Scott Frohman, Alan Rooks, Robert Poor, Eric Nagler, Antoine Trux, Cade Roux, Chandrika Gokul, Randy Mangoba和Glenn Teitelbaum。 第二版草稿由以下人士共同检阅:Derek Bosch, Tim Johnson, Brian Kernighan, Junichi Kimura, Scott Lewandowski, Laura Michaels, David Smallberg, Clovis Tondo, Chris Van Wyk和Oleg Zabluda。我收到来自以下人士的意见并因此对新刷有所帮助:Daniel Steinberg, Arunprasad Marathe, Doug Stapp, Robert Hall, Cheryl Ferguson, Gary Bartlett, Michael Tamm, Kendall Beaman, Eric Nagler, Max Hailperin, Joe Gottman, Richard Weeks, Valentin Bonnard, Jun He, Tim King, Don Maier, Ted Hill, Mark Harrison, Michael Rubenstein, Mark Rodgers, David Goh, Brenton Cooper, Andy Thomas-Cramer, Antoine Trux, John Wait, Brian Sharon, Liam Fitzpatrick, Bernd Mohr, Gary Yee, John O'Hanley, Brady Patterson, Christopher Peterson, Feliks Kluzniak, Isi Dunietz, Christopher Creutzi, Ian Cooper, Carl Harris, Mark Stickel, Clay Budin, Panayotis Matsinopoulos, David Smallberg, Herb Sutter, Pajo Misljencevic, Giulio Agostini, Fredrik Blomqvist, Jimmy Snyder, Byrial Jensen, Witold Kuzminski, Kazunobu Kuriyama, Michael Christensen, Jorge Yáñez Teruel, Mark Davis, Marty Rabinowitz, Ares Lagae和Alexander Medvedev. 第三版早期部分草稿由以下人士共同检阅:Brian Kernighan, Angelika Langer, Jesse Laeuchli, Roger E. Pedersen, Chris Van Wyk, Nicholas Stroustrup和Hendrik Schober。完整草稿由以下人士共同检阅:Leor Zolman, Mike Tsao, Eric Nagler, Gene Gutnik, David Abrahams, Gerhard Kreuzer, Drosos Kourounis, Brian Kernighan, Andrew Kirmse, Balog Pal, Emily Jagdhar, Eugene Kalenkovich, Mike Roze, Enrico Carrara, Benjamin Berck, Jack Reeves, Steve Schirripa, Martin Fallenstedt, Timothy Knox, Yun Bai, Michael Lanzetta, Philipp Janert, Guido Bartolucci, Michael Topic, Jeff Scherpelz, Chris Nauroth, Nishant Mittal, Jeff Somers, Hal Moroff, Vincent Manis, Brandon Chang, Greg Li, Jim Meehan, Alan Geller, Siddhartha Singh, Sam Lee, Sasan Dashtinezhad, Alex Marin, Steve Cai, Thomas Fruchterman, Cory Hicks, David Smallberg, Gunavardhan Kakulapati, Danny Rabbani, Jake Cohen, Hendrik Schober, Paco Viciana, Glenn Kennedy, Jeffrey D. Oldham, Nicholas Stroustrup, Matthew Wilson, Andrei Alexandrescu, Tim Johnson, Leon Matthews, Peter Dulimov和Kevlin Henney。某些个别条款的草稿由Herb Sutter和Attila F. Feher检阅。 检阅一份不够洗炼(而且可能尚未完成)的手稿是件吃力的工作,在时间压力之下进行只会使得它更困难。我要感谢这么多人愿意为我做这件事。 如果对讨论素材缺乏背景,而又期望捕捉手稿中的每一个问题,检阅工作将更加困难。令人惊讶的是还是有人选择成为文字编辑。Chrysta Meadowbrooke是本书的文字编辑,她的周密工作揭露出许多逃过其他每一双眼睛的问题。 Leor Zolman在正式检阅前先以多种编译器检验所有代码,在我校订手稿之后又做一次。如果书中仍然存在任何错误,全是我的责任。Karl Wiegers和(特别是)Tim Johnson提供我快速而有帮助的反馈。 John Wait是我的前两版编辑,有点傻傻地又签下这一份责任约。他的助理Denise Mickelsen熟练地处理我频繁的纠缠,带着愉快的微笑(至少我认为她是。呃,我从未见过她)。Julie Nahil 向来扮演救火队角色并因此成为我的产品经理。她以非凡的镇定指挥产品计划内的六周通宵工作。John Fuller(她的老板)和Marty Rabinowitz(他的老板)也协助解决了产品发行量问题。Vanessa Moore的正式工作是提供FrameMaker和PDF支持,但她也协助制作附录B的条目并格式化打印于封底里。Solveig Haugland协助将索引格式化。Sandra Schroeder和Chuti Prasertsith负责封面设计,Chuti总是在每次我说“如果把这张相片加上那个颜色的线条会怎样?”时修订封面。Chanda Leary-Coutu对市场营销举重若轻。 在我忙于手稿的数月之中,电视剧集Buffy the Vampire Slayer常常帮助我在每天工作结束后解压。带着极大的克制我才能够不让Buffyspeak的身影进入本书。Kathy Reed于1971年教我写程序,我很高兴我们保持友谊至今。Donald French雇用我和Moises Lejter于1989年建立起C++ 培训教材(这项计划诱使我真正了解C++),1991年他又聘我在Stratus Computer体现它们。该班学生鼓励我写下最终成为本书第一版的东西。Don也将我介绍给John Wait,他同意出版它们。 我的妻子Nancy L. Urbano持续鼓励我写作,即使在我完成了七本书、一张CD改写版、一篇论文之后。她有令人难以置信的忍耐、自制与宽容。没有她我无法完成我所完成的任何事情。 自始至终,我们的狗儿Persephone是我们无可取代的同伴。令人悲伤的是,在这个项目的大部分时间里,她和我们之间的交往关系已经改为办公室内的一坛骨灰瓮。我们十分怀念她。 目 录译序 vii 中英简繁术语对照 ix 目录 xvii 序言 xxi 致谢 xxiii 导读 1 1. 让自己习惯C++ 11 Accustoming Yourself to C++ 11 条款01:视C++ 为一个语言联邦 11 View C++ as a federation of languages 11 条款02:尽量以const, enum, inline替换 #define 13 Prefer consts,enums, and inlines to #defines. 13 条款03:尽可能使用const 17 Use const whenever possible. 17 条款04:确定对象被使用前已先被初始化 26 Make sure that objects are initialized before they're used. 26 2. 构造/析构/赋值运算 34 Constructors, Destructors, and Assignment Operators 34 条款05:了解C++ 默默编写并调用哪些函数 34 Know what functions C++ silently writes and calls. 34 条款06:若不想使用编译器自动生成的函数,就该明确拒绝 37 Explicitly disallow the use of compiler-generated functions you do not want. 37 条款07:为多态基类声明virtual析构函数 40 Declare destructors virtual in polymorphic base classes. 40 条款08:别让异常逃离析构函数 44 Prevent exceptions from leaving destructors. 44 条款09:绝不在构造和析构过程中调用virtual函数 48 Never call virtual functions during construction or destruction. 48 条款10:令operator= 返回一个reference to *this 52 Have assignment operators return a reference to *this. 52 条款11:在operator= 中处理“自我赋值” 53 Handle assignment to self in operator=. 53 条款12:复制对象时勿忘其每一个成分 57 Copy all parts of an object. 57 3. 资源管理 61 Resource Management 61 条款13:以对象管理资源 61 Use objects to manage resources. 61 条款14:在资源管理类中小心copying行为 66 Think carefully about copying behavior in resource-managing classes. 66 条款15:在资源管理类中提供对原始资源的访问 69 Provide access to raw resources in resource-managing classes. 69 条款16:成对使用new和delete时要采取相同形式 73 Use the same form in corresponding uses of new and delete. 73 条款17:以独立语句将newed对象置入智能指针 75 Store newed objects in smart pointers in standalone statements. 75 4. 设计与声明 78 Designs and Declarations 78 条款18:让接口容易被正确使用,不易被误用 78 Make interfaces easy to use correctly and hard to use incorrectly. 78 条款19:设计class犹如设计type 84 Treat class design as type design. 84 条款20:宁以pass-by-reference-to-const替换pass-by-value 86 Prefer pass-by-reference-to-const to pass-by-value. 86 条款21:必须返回对象时,别妄想返回其reference 90 Don't try to return a reference when you must return an object. 90 条款22:将成员变量声明为private 94 Declare data members private. 94 条款23:宁以non-member、non-friend替换member函数 98 Prefer non-member non-friend functions to member functions. 98 条款24:若所有参数皆需类型转换,请为此采用non-member函数 102 Declare non-member functions when type conversions should apply to all parameters. 102 条款25:考虑写出一个不抛异常的swap函数 106 Consider support for a non-throwing swap. 106 5. 实现 113 Implementations 113 条款26:尽可能延后变量定义式的出现时间 113 Postpone variable definitions as long as possible. 113 条款27:尽量少做转型动作 116 Minimize casting. 116 条款28:避免返回handles指向对象内部成分 123 Avoid returning "handles" to object internals. 123 条款29:为“异常安全”而努力是值得的 127 Strive for exception-safe code. 127 条款30:透彻了解inlining的里里外外 134 Understand the ins and outs of inlining. 134 条款31:将文件间的编译依存关系降至最低 140 Minimize compilation dependencies between files. 140 6. 继承与面向对象设计 149 Inheritance and Object-Oriented Design 149 条款32:确定你的public继承塑模出is-a关系 150 Make sure public inheritance models "is-a." 150 条款33:避免遮掩继承而来的名称 156 Avoid hiding inherited names. 156 条款34:区分接口继承和实现继承 161 Differentiate between inheritance of interface and inheritance of implementation. 161 条款35:考虑virtual函数以外的其他选择 169 Consider alternatives to virtual functions. 169 条款36:绝不重新定义继承而来的non-virtual函数 178 Never redefine an inherited non-virtual function. 178 条款37:绝不重新定义继承而来的缺省参数值 180 Never redefine a function's inherited default parameter value. 180 条款38:通过复合塑模出has-a或"根据某物实现出" 184 Model "has-a" or "is-implemented-in-terms-of" through composition. 184 条款39:明智而审慎地使用private继承 187 Use private inheritance judiciously. 187 条款40:明智而审慎地使用多重继承 192 Use multiple inheritance judiciously. 192 7. 模板与泛型编程 199 Templates and Generic Programming 199 条款41:了解隐式接口和编译期多态 199 Understand implicit interfaces and compile-time polymorphism. 199 条款42:了解typename的双重意义 203 Understand the two meanings of typename. 203 条款43:学习处理模板化基类内的名称 207 Know how to access names in templatized base classes. 207 条款44:将与参数无关的代码抽离templates 212 Factor parameter-independent code out of templates. 212 条款45:运用成员函数模板接受所有兼容类型 218 Use member function templates to accept "all compatible types." 218 条款46:需要类型转换时请为模板定义非成员函数 222 Define non-member functions inside templates when type conversions are desired. 222 条款47:请使用traits classes表现类型信息 226 Use traits classes for information about types. 226 条款48:认识template元编程 233 Be aware of template metaprogramming. 233 8. 定制new和delete 239 Customizing new and delete 239 条款49:了解new-handler的行为 240 Understand the behavior of the new-handler. 240 条款50:了解new和delete的合理替换时机 247 Understand when it makes sense to replace new and delete. 247 条款51:编写new和delete时需固守常规 252 Adhere to convention when writing new and delete. 252 条款52:写了placement new也要写placement delete 256 Write placement delete if you write placement new. 256 9. 杂项讨论 262 Miscellany 262 条款53:不要轻忽编译器的警告 262 Pay attention to compiler warnings. 262 条款54:让自己熟悉包括TR1在内的标准程序库 263 Familiarize yourself with the standard library, including TR1. 263 条款55:让自己熟悉Boost 269 Familiarize yourself with Boost. 269 A 本书之外 273 B 新旧版条款对照 277 索引 280 |
随便看 |
百科全书收录4421916条中文百科知识,基本涵盖了大多数领域的百科知识,是一部内容开放、自由的电子版百科全书。