继 Effective C++ 之後,Scott Meyers 於 1996 推出这本「续集」。条款变得比较少,页数倒是多了一些,原因是这次选材比「第一集」更高阶,尤其是第五章。Meyers 将此章命名为技术(Techniques),并明白告诉你,其中都是一些 patterns,例如 virtual ctors、smart pointers、reference counting、proxy classes,double dispatching┅等等。这一章的每个条款篇幅都在 15~30 页之谱,实在让人有「山穷水尽疑无路,柳暗花明又一村」之叹。
虽然出版年代稍嫌久远,本书并没有第二版,原因是当其出版之时(1996),C++ Standard 已经几乎定案,本书即依当时的标准草案而写。其间与现今之 C++ 标准规格几乎相同。可能变化的几个弹性之处,Meyers 也都有所说明与提示。
译序(侯捷) \r\n目录(Contents) \r\n致谢(Acknowledgments. 中文版略) \r\n导读(Introduction) 001\r\n基础议题(Basics) 009\r\n条款1:仔细区别 pointers 和 references 009\r\nDistinguish between pointers and references\r\n条款2:最好使用 C++ 转型操作符 012\r\nPrefer C++-style casts\r\n条款3:绝对不要以polymorphically(多态)方式来处理数组 016\r\nNever treat arrays polymorphically\r\n条款4:非必要不提供 default constructor 019\r\nAvoid gratuitous default constructors\r\n操作符(Operators) 024\r\n条款5:对定制的型别转换函数保持警觉 024\r\nBe wary of user-defined conversion functions\r\n条款6:区别 increment/decrement 操作符的\r\n 前置(prefix)和后置(postfix)型式 031\r\nDistinguish between prefix and postfix forms of increment \r\n and decrement operators\r\n条款7:千万不要重载 &&, ||, 和 , 操作符 035\r\nNever overload &&, ||, or ,\r\n条款8:了解各种不同意义的 new 和 delete 038\r\nUnderstand the different meanings of new and delete\r\n\r\n异常(Exceptions) 044\r\n条款9:利用 destructors 避免泄漏资源 045\r\nUse destructors to prevent resource leaks\r\n条款10:在 constructors 内阻止资源泄漏(resource leaks) 050\r\nPrevent resource leaks in constructors\r\n条款11:禁止异常(exceptions)流出 destructors 之外 058\r\nPrevent exceptions from leaving destructors\r\n条款12:了解「掷出一个 exception」与「传递一个参数」\r\n 或「调用一个虚函数」之间的差异 061\r\nUnderstand how throwing an exception differs from \r\n passing a parameter or calling a virtual function\r\n条款13:以 by reference 方式捕捉 exceptions 068\r\nCatch exceptions by reference\r\n条款14:明智运用 exception specifications 072\r\nUse exception specifications judiciously\r\n条款15:了解异常处理(exception handling)的成本 078\r\nUnderstand the costs of exception handling\r\n\r\n效率(Efficiency) 081\r\n条款16:谨记 80-20 法则 082\r\nRemember the 80-20 rule\r\n条款17:考虑使用 lazy evaluation 085\r\nConsider using lazy evaluation\r\n条款18:分期摊还预期的计算成本 093\r\nAmortize the cost of expected computations\r\n条款19:了解暂时对象的来源 098\r\nUnderstand the origin of temporary objects\r\n条款20:协助完成「返回值优化(RVO)」 101\r\nFacilitate the return value optimization\r\n条款21:利用重载技术(overload)避免隐式型别转换 105\r\nOverload to avoid implicit type conversions\r\n条款22:考虑以操作符复合型式(op=)取代其独身型式(op)107\r\nConsider using op= instead of stand-alone op\r\n条款23:考虑使用其它程序库 110\r\nConsider alternative libraries\r\n条款24:了解 virtual functions、multiple inheritance、virtual base classes、\r\n runtime type identification 所需的成本 113\r\nUnderstand the costs of virtual functions, multiple inheritance, \r\n virtual base classes, and RTTI\r\n\r\n技术(Techniques, Idioms, Pattern) 123\r\n条款25:将 constructor 和 non-member functions 虚化 123\r\nVirtualizing constructors and non-member functions\r\n条款26:限制某个 class 所能产生的对象数量 130\r\nLimiting the number of objects of a class\r\n条款27:要求(或禁止)对象产生于 heap 之中 145\r\nRequiring or prohibiting heap-based objects\r\n条款28:Smart Pointers(智能指针) 159\r\n条款29:Reference counting(引用计数) 183\r\n条款30:Proxy classes(替身类、代理类) 213\r\n条款31:让函数根据一个以上的对象型别来决定如何虚化 228\r\nMaking functions virtual with respect to more than one object\r\n杂项讨论(Miscellany) 252\r\n条款32:在未来时态下发展程序 252\r\nProgram in the future tense\r\n条款33:将非尾端类(non-leaf classes)设计为\r\n 抽象类(abstract classes) 258\r\nMake non-leaf classes abstract\r\n条款34:如何在同一个程序中结合 C++ 和 C 270\r\nUnderstand how to combine C++ and C in the same program\r\n条款35:让自己习惯于标准 C++ 语言 277\r\nFamiliarize yourself with the language standard\r\n推荐书目 285\r\nauto_ptr 实现代码 291\r\n索引1(General Index) 295\r\n索引2(Index of Example Classes, Functions, and Templtes) 313
C++是一个难学易用的语言!
C++的难学,不仅在其广博的语法、语法背后的语义、语义背后的深层思维、深层思维背后的对象模型:C++的难学,还在于它提供了四种不同(相辅相成)的编程思维模型: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
本书不但与英文版页页对译,保留索引,并加上译注、交叉索引、读者服务。这套书将对于您的程序设计生涯带来重大帮助。翻译这套书籍的过程中,我感觉来自技术体会上的极大快乐。我祈盼(并相信)您在阅读此书时拥有同样的心情。