基本信息
- 原书名:More Effective C++: 35 New Ways to Improve Your Programs and Designs
- 原出版社: Addison-Wesley Professional
编辑推荐
C++ 是一门难学易用的语言!
C++
的难学,不仅在其广博的语法、语法背后的语义、语义背后的深层思维、深层思维背后的对象模型;C++
的难学,还在于它提供了4种不同(相辅相成)的编程思维模型:procedural-based,object-based,object-oriented,generic
paradigm。
世上没有白吃的午餐。又要有效率,又要有弹性,又要前瞻望远,又要回溯相容,又要能治大国,又要能烹小鲜,学习起来当然就不可能太简单。
在如此庞大复杂的机制下,万千使用者前赴后继的动力是:一旦学成,妙用无穷。
C++ 相关书籍之多,车载斗量,如天上繁星,如过江之鲫。广博如四库全书者有之(The C++ Programming
Language、C++ Primer),深奥如重山复水者有之(The Annotated C++ Reference Manual,
Inside the C++ Object Model),细说历史者有之(The Design and Evolution of
C++, Ruminations on C++),独沽一味者有之(Polymorphism in C++, Genericity in
C++),独树一帜者有之(Design Patterns, Large Scale C++ Software Design, C++
FAQs),程序库大全有之(The C++ Standard Library),另辟蹊径者有之(Generic Programming
and the STL),工程经验之累积亦有之(Effective C++, More Effective C++,
Exceptional C++)。
这其中,“工程经验之累积”对已具 C++ 相当基础的程序员而言,有着致命的吸引力与立竿见影的帮助。Scott Meyers
的Effective C++ 和 More Effective C++ 是此类佼佼,Herb Sutter 的 Exceptional
C++ 则是后起之秀。
这类书籍的一个共同特色是轻薄短小,并且高密度地纳入作者浸淫于 C++/OOP
领域多年而广泛的经验。它们不但开扩读者的视野,也为读者提供各种 C++/OOP
常见问题或易犯错误的解决模型。某些小范围主题诸如“在base classes 中使用 virtual
destructor”、“令operator= 传回 *this 的 reference”,可能在百科型 C++
语言书籍中亦曾概略提过,但此类书籍以深度探索的方式,让我们了解问题背后的成因、最佳的解法,以及其他可能的牵扯。至于大范围主题,例如smart
pointers,reference counting,proxy classes,double
dispatching,基本上已属design patterns的层级!
这些都是经验的累积和心血的结晶!
我很高兴将以下两本优秀书籍,规划为一个系列,以郑重的形式呈现给您:
1.Effective C++ 2/e, by Scott Meyers, AW 1998
2.More Effective C++, by Scott Meyers, AW 1996
本书不但与英文版页页对译,保留索引,并加上译注、交叉索引 、读者服务 。
这套书将对于您的程序设计生涯带来重大帮助。翻译这套书籍的过程中,我感觉来自技术体会上的极大快乐。我祈盼(并相信)您在阅读此书时拥有同样的心情。
内容简介
计算机书籍
继Effective C++之后,Scott Meyers 于1996 推出这本“续集”。条款变得比较少,页数倒是多了一些,原因是这次选材比“第一集”更高阶,尤其是第5 章。Meyers 将此章命名为技术(techniques),并明白告诉你,其中都是一些patterns,例如virtual constructors,smart pointers,reference counting,proxy classes,double dispatching……这一章的每个条款篇幅都达15~30 页之多,实在让人有“山重水复疑无路,柳暗花明又一村”之叹。
虽然出版年代稍嫌久远,但本书并没有第2 版,原因是当其出版之时(1996),C++ Standard已经几乎定案,本书即依当时的标准草案而写,其与现今的C++标准规范几乎相同。而且可能变化的几个弹性之处,Meyers也都有所说明与提示。读者可以登录作者提供的网址,看看上下两集的勘误与讨论(数量之多,令人惊恐。幸好多是技术讨论或文字斟酌,并没有什么重大误失)。
作译者
作者:(美国)梅耶(Scott Meyers) 译者:侯捷
Scott Meyers,世界顶级的C++软件开发技术权威之一。他是两本畅销书Effective
C++和More Effective C++的作者,以前曾经是C++ Report的专栏作家。他经常为C/C++ Users
Journal和Dr. Dobb's Journal撰稿,也为全球范围内的客户做咨询活动。他也是Advisory Boards for
NumeriX LLC和InfoCruiser公司的成员。他拥有Brown University的计算机科学博士学位。
侯捷,集计算机技术读物之著、泽、评于一身,足《多态与虚拟》和《STL源码剖析》的作者,《Run!Pc》杂志、《程序员》杂志的知名专栏作家,也是极其号召力的大学教师与研讨会讲师。他于1989年获得中国台湾清华大学动机系硕士学位。
目录
导读(Introduction)
基础议题(Basics)
条款1:仔细区别 pointers 和 references
Distinguish between pointers and references.
条款2:最好使用 C++ 转型操作符
Prefer C++-style casts.
条款3:绝对不要以多态(polymorphically)方式处理数组
Never treat arrays polymorphically.
条款4:非必要不提供 default constructor
Avoid gratuitous default constructors.
操作符(Operators)
条款5:对定制的“类型转换函数”保持警觉
Be wary of user-defined conversion functions.
条款6:区别 increment/decrement 操作符的
前置(prefix)和后置(postfix)形式
Distinguish between prefix and postfix forms of increment
and decrement operators.
条款7:千万不要重载&&,和, 操作符
Never overload &&, , or ,.
译者序
C++ 的难学,不仅在其广博的语法、语法背后的语义、语义背后的深层思维、深层思维背后的对象模型;C++ 的难学,还在于它提供了4种不同(相辅相成)的编程思维模型:procedural-based,object-based,object-oriented,generic paradigm。
世上没有白吃的午餐。又要有效率,又要有弹性,又要前瞻望远,又要回溯相容,又要能治大国,又要能烹小鲜,学习起来当然就不可能太简单。
在如此庞大复杂的机制下,万千使用者前赴后继的动力是:一旦学成,妙用无穷。
C++ 相关书籍之多,车载斗量,如天上繁星,如过江之鲫。广博如四库全书者有之(The C++ Programming Language、C++ Primer),深奥如重山复水者有之(The Annotated C++ Reference Manual, Inside the C++ Object Model),细说历史者有之(The Design and Evolution of C++, Ruminations on C++),独沽一味者有之(Polymorphism in C++, Genericity in C++),独树一帜者有之(Design Patterns, Large Scale C++ Software Design, C++ FAQs),程序库大全有之(The C++ Standard Library),另辟蹊径者有之(Generic Programming and the STL),工程经验之累积亦有之(Effective C++, More Effective C++, Exceptional C++)。
这其中,“工程经验之累积”对已具 C++ 相当基础的程序员而言,有着致命的吸引力与立竿见影的帮助。Scott Meyers 的Effective C++ 和 More Effective C++ 是此类佼佼,Herb Sutter 的 Exceptional C++ 则是后起之秀。
这类书籍的一个共同特色是轻薄短小,并且高密度地纳入作者浸淫于 C++/OOP 领域多年而广泛的经验。它们不但开扩读者的视野,也为读者提供各种 C++/OOP 常见问题或易犯错误的解决模型。某些小范围主题诸如“在base classes 中使用 virtual destructor”、“令operator= 传回 *this 的 reference”,可能在百科型 C++ 语言书籍中亦曾概略提过,但此类书籍以深度探索的方式,让我们了解问题背后的成因、最佳的解法,以及其他可能的牵扯。至于大范围主题,例如smart pointers,reference counting,proxy classes,double dispatching,基本上已属design patterns的层级!
这些都是经验的累积和心血的结晶!
我很高兴将以下两本优秀书籍,规划为一个系列,以郑重的形式呈现给您:
1. Effective C++ 2/e, by Scott Meyers, AW 1998
2. More Effective C++, by Scott Meyers, AW 1996
本书不但与英文版页页对译,保留索引,并加上译注、交叉索引 、读者服务 。
这套书将对于您的程序设计生涯带来重大帮助。翻译这套书籍的过程中,我感觉来自技术体会上的极大快乐。我祈盼(并相信)您在阅读此书时拥有同样的心情。
侯捷 2003/03/07 于台湾新竹
jjhou@jjhou.com
http://www.jjhou.com
本书保留大量简短易读之英文术语,时而中英并陈。以下用语请读者特别注意:
英文术语 本书译词 英文术语 本书译词
argument 自变量 (i.e. 实参) instantiated 实例化、具现化
by reference 传址 library 程序库
前言
一旦语言进入成熟期,我们对它的使用经验也就愈来愈多,我们所需要的信息也就随之改变了。1990 年人们想知道 C++ 是什么东西。到了 1992 年,他们想知道如何运用它。如今 C++ 程序员问的问题更高级:我如何能够设计出适应未来需求的软件?我如何能够改善代码的效率而不折损正确性和易用性?我如何能够实现语言不能直接支持的精巧功能?
这本书中我要回答这些问题,以及其他许多类似问题。
本书将告诉你如何更具实效地设计并实现 C++ 软件:让它行为更正确,面对异常时更健壮、更有效率、更具移植性,将语言特性发挥得更好,更优雅地调整适应,在“混合语言”开发环境中运作得更好,更容易被正确运用,更不容易被误用。简单地说就是如何让软件更好。
本书内容分为 35 个条款。每个条款都在特定主题上精简摘要出 C++ 程序设计社区所积累的智能。大部分条款以准则的形式呈现,随附的说明则阐述这条准则为什么存在,如果不遵循会发生什么后果,以及什么情况下可以合理违反该准则。
所有条款被我分为数大类。某些条款关心特定的语言性质,特别是你可能少有使用经验的一些新性质。例如条款9~15专注于exceptions(就像Tom Cargill,JackReeves,Herb Sutter 所发表的那些杂志文章一样)。其他条款解释如何结合语言的不同特性以达成更高阶目标。例如条款25~31描述如何限制对象的个数或诞生地点,如何根据一个以上的对象类型产生出类似虚函数的东西,如何产生smart pointers等。其他条款解决更广泛的题目。条款16~24 专注于效率上的议题。不论哪一个条款,提供的都是与其主题相关且意义重大的做法。在 More Effective C++ 一书中你将学习到如何更实效、更精锐地使用C++。大部分C++ 教科书中对语言性质的大量描述,只能算是本书的一个背景信息而已。
这种处理方式意味着,你应该在阅读本书之前便熟悉 C++。我假设你已了解classes(类)、保护层级(protection levels)、虚函数、非虚函数,我也假设你已通晓 templates 和 exceptions 背后的概念。我并不期望你是一位语言专家,所以涉及较罕见的 C++ 特性时,我会进一步解释。
本书所谈的C++
我在本书所谈、所用的C++,是 ISO/ANSI 标准委员会于1997年11月完成的C++ 国际标准最后草案(Final Draft International Standard)。这暗示了我所使用的某些语言特性可能并不在你的编译器(s)支持能力之列。别担心,我认为对你而言唯一所谓的“新”特性,应该只有 templates,而 templates 如今几乎已是各家编译器的必备功能。我也运用 exceptions,并大量集中于条款9~15。如果你的编译器(s)未能支持 exceptions,没什么大不了,这并不影响本书其他部分带给你的好处。但是,听我说,即使你不需要用到 exceptions,亦应阅读条款9~15,因为那些条款(及其相关篇幅)检验了某些不论什么场合下你都应该了解的主题。
我承认,就算标准委员会授意某一语言特性或是赞同某一实务做法,并非就保证该语言特性已出现在目前的编译器上,或该实务做法已可应用于既有的开发环境上。一旦面对“标准委员会所议之理论”和“真正能够有效运作之实务”间的矛盾,我便将两者都加以讨论,虽然我其实更重视实务。由于两者我都讨论,所以当你的编译器(s)和C++ 标准不一致时,本书可以协助你,告诉你如何使用目前既有的架构来模拟编译器(s)尚未支持的语言特性。而当你决定将一些原本绕道而行的解决办法以新支持的语言特性取代时,本书亦可引导你。
注意当我说到编译器(s)时,我使用复数。不同的编译器对C++ 标准的满足程度各不相同,所以我鼓励你在至少两种编译器(s)平台上发展代码。这么做可以帮助你避免不经意地依赖某个编译器专属的语言延伸性质,或是误用某个编译器对标准规格的错误阐释。这也可以帮助你避免使用过度先进的编译器技术,例如,独家厂商才做得出的某种语言新特性。如此特性往往实现得不够精良(臭虫多,要不就表现得迟缓,或是两者兼具),而且C++ 社区往往对这些特性缺乏使用经验,无法给你应用上的忠告。雷霆万钧之势固然令人兴奋,但当你的目标是要产生可靠的代码,恐怕还是步步为营(并且能够与人合作)的好。
本书用了两个你可能不太熟悉的C++ 性质,它们都是晚些才加入C++ 标准之中的。某些编译器支持它们,但如果你的编译器不支持,你可以轻易地用你所熟悉的其他性质来模拟它们。
第一个性质是bool类型,其值必为关键词true 或false。如果你的编译器尚未支持 bool,有两个方法可以模拟它。第一个方法是使用一个 global enum:
enum bool { false, true };
这允许你将参数为 bool 或 int 的不同函数加以重载(overloading)。缺点是,内建的“比较操作符(comparison operators)”如 ==,<,>=,等仍旧返回 ints。所以以下代码的行为不如我们所预期:
void f(int);
void f(bool);
int x, y;
...
f( x < y ); // 调用 f(int),但其实它应该调用 f(bool)。
媒体评论
——Fred Wild, Vice President of Technology,
Advantage Software Technologies
本书内含大量重要的技术,这些技术是撰写优良 C++ 程序所不可或缺的。本书解释如何设计和实现这些观念,以及潜伏在其他某些替代方案中的陷阱。本书亦含晚些加入的C++特性的详细说明。任何人如果想要好好地运用这些新特性,最好买一本并且放在随手可得之处,以备查阅。
——Christopher J. Van Wyk, Professor
Mathematics and Computer Science, Drew University
这是一本具备工业强度的最佳书籍。对于已经阅读过 Effective C++ 的人,这是完美的续集。
——Eric Nagler, C++ Instructor and Author,
University of California Santa Cruz Extension
More Effective C++ 是一本无微不至且很有价值的书籍,是Scott 第一本书Effective C++ 的续集。我相信每一位专业的C++ 软件开发人员都应该读过并记忆Effective C++ 和 More Effective C++ 两本书内的各种招式,以及其中重要(而且有时候不可思议)的语言的方方面面。我强烈推荐这两本书给软件开发人员、测试人员、管理人员……,每个人都可以从Scott 专家级的知识与卓越的表达能力中获益。
——Steve Burkett, Software Consultant