编辑推荐

这是一本轻薄短小高密度的“专家经验累积”。

如果你声称自己是个C++程序员之前,那你一定得读过这《Effective C++:改善程序与设计的55个具体做法(第3版 中文版)》。

认真地读完这《Effective C++:改善程序与设计的55个具体做法(第3版 中文版)》,普通的C++程序员也可以摇身一变成为专家级C++程序员。

这是作者智慧的再一次提炼和升华,你没理由还在原地踏步,赶紧阅读这《Effective C++:改善程序与设计的55个具体做法(第3版 中文版)》,迎头赶上吧。

内容简介

  有人说C++程序员可以分为两类,读过EffectiveC++的和没读过的。世界C++大师ScottMeyers成名之作的第三版的确当得起这样的评价。当您读过《EffectiveC++:改善程序与设计的55个具体做法(第3版)(中文版)(双色)》之后,就获得了迅速提升自己C++功力的一个契机。
  在国际上,《Effective C++:改善程序与设计的55个具体做法(第3版 中文版)》所引起的反响,波及整个计算机技术的出版领域,余音至今未绝。几乎在所有C++书籍的推荐名单上,《EffectiveC++:改善程序与设计的55个具体做法(第3版)(中文版)(双色)》都会位于前三名。作者高超的技术把握力、独特的视角、诙谐轻松的写作风格、独具匠心的内容组织,都受到极大的推崇和仿效。这种奇特的现象,只能解释为人们对这《Effective C++:改善程序与设计的55个具体做法(第3版 中文版)》衷心的赞美和推崇。
  《EffectiveC++:改善程序与设计的55个具体做法(第3版)(中文版)(双色)》不是读完一遍就可以束之高阁的快餐读物,也不是用以解决手边问题的参考手册,而是需要您去反复阅读体会的,C++是真正程序员的语言,背后后精神的思想与无以伦比的表达能力,这使得它具有类似宗教般的魅力。希望这《Effective C++:改善程序与设计的55个具体做法(第3版 中文版)》能够帮您跨越C++的重重险阻,领略高处才有的壮美风光,做一个成功而快乐的C++程序员。

作者简介

  ScottMeyers,是全世界知名的C++软件开发专家之一。他是畅销书《EffectiveC++》系列(EffectiveC++,MoreEffectiveC++,EffectiveSTL)的作者,又是创新产品《EffectiveC++CD》的设计者和作者,也是Addison-Wesley的“EffectiveSoftwareDevelopmentSeries”顾问编辑,以及《SoftwareDevelopment》杂志咨询板成员。他也为若干新公司的技术咨询板提供服务。Meyers于1993年自Brown大学获得计算机博士学位。

目录

译序vii

中英简繁术语对照ix

目录xvii

序言xxi

致谢xxiii

导读1

1.让自己习惯C++11

AccustomingYourselftoC++11

条款01:视C++为一个语言联邦11

ViewC++asafeduerationoflanguages11

条款02:尽量以const,enum,inline替换#define13

Preferconsts,enums,andinlinesto#defines.13

条款03:尽可能使用const17

Useconstwheneverpossible.17

条款04:确定对象被使用前已先被初始化26

Makesurethatobjectsareinitializedbeforethey'reused.26

2.构造/析构/赋值运算34

Constructors,Destructors,andAssignmentOperators34

条款05:了解C++默默编写并调用哪些函数34

KnowwhatfunctionsC++silentlywritesandcalls.34

条款06:若不想使用编译器自动生成的函数,就该明确拒绝37

Explicitlydisallowtheuseofcompiler-generatedfunctionsyoudonotwant.37

条款07:为多态基类声明virtual析构函数40

Declaredestructorsvirtualinpolymorphicbaseclasses.40

条款08:别让异常逃离析构函数44

Preventexceptionsfromleavingdestructors.44

条款09:绝不在构造和析构过程中调用virtual函数48

Nevercallvirtualfunctionsduringconstructionordestruction.48

条款10:令operator=返回一个referenceto*this52

Haveassignmentoperatorsreturnareferenceto*this.52

条款11:在operator=中处理「“自我赋值」”53

Handleassignmenttoselfinoperator=.53

条款12:复制对象时勿忘其每一个成分57

Copyallpartsofanobject.57

3.资源管理61

ResourceManagement61

条款13:以对象管理资源61

Useobjectstomanageresources.61

条款14:在资源管理类中小心coping行为66

Thinkcarefullyaboutcopyingbehaviorinresource-managingclasses.66

条款15:在资源管理类中提供对原始资源的访问69

Provideaccesstorawresourcesinresource-managingclasses.69

条款16:成对使用new和delete时要采取相同形式73

Usethesameformincorrespondingusesofnewanddelete.73

条款17:以独立语句将newed对象置入智能指针75

Storenewedobjectsinsmartpointersinstandalonestatements.75

4.设计与声明78

DesignsandDeclarations78

条款18:让接口容易被正确使用,不易被误用78

Makeinterfaceseasytousecorrectlyandhardtouseincorrectly.78

条款19:设计class犹如设计type84

Treatclassdesignastypedesign.84

条款20:宁以pass-by-reference-to-const替换pass-by-value86

Preferpass-by-reference-to-consttopass-by-value.86

条款21:必须返回对象时,别妄想返回其reference90

Don'ttrytoreturnareferencewhenyoumustreturnanobject.90

条款22:将成员变量声明为private94

Declaredatamembersprivate.94

条款23:宁以non-member、non-friend替换member函数98

Prefernon-membernon-friendfunctionstomemberfunctions.98

条款24:若所有参数皆需类型转换,请为此采用non-member函数102

Declarenon-memberfunctionswhentypeconversionsshouldapplytoallparameters.102

条款25:考虑写出一个不抛异常的swap函数106

Considersupportforanon-throwingswap.106

5.实现113

Implementations113

条款26:尽可能延后变量定义式的出现时间113

Postponevariabledefinitionsaslongaspossible.113

条款27:尽量少做转型动作116

Minimizecasting.116

条款28:避免返回handles指向对象内部成分123

Avoidreturning"handles"toobjectinternals.123

条款29:为“「异常安全」”而努力是值得的127

Striveforexception-safecode.127

条款30:透彻了解inlining的里里外外134

Understandtheinsandoutsofinlining.134

条款31:将文件间的编译依存关系降至最低140

Minimizecompilationdependenciesbetweenfiles.140

6.继承与面向对象设计149

InheritanceandObject-OrientedDesign149

条款32:确定你的public继承塑模出is-a关系150

Makesurepublicinheritancemodels"is-a."150

条款33:避免遮掩继承而来的名称156

Avoidhidinginheritednames.156

条款34:区分接口继承和实现继承161

Differentiatebetweeninheritanceofinterfaceandinheritanceofimplementation.161

条款35:考虑virtual函数以外的其它其他选择169

Consideralternativestovirtualfunctions.169

条款36:绝不重新定义继承而来的non-virtual函数178

Neverredefineaninheritednon-virtualfunction.178

条款37:绝不重新定义继承而来的缺省参数值180

Neverredefineafunction'sinheriteddefaultparametervalue.180

条款38:通过复合塑模出has-a或"根据某物实现出"184

Model"has-a"or"is-implemented-in-terms-of"throughcomposition.184

条款39:明智而审慎地使用private继承187

Useprivateinheritancejudiciously.187

条款40:明智而审慎地使用多重继承192

Usemultipleinheritancejudiciously.192

7.模板与泛型编程199

TemplatesandGenericProgramming199

条款41:了解隐式接口和编译期多态199

Understandimplicitinterfacesandcompile-timepolymorphism.199

条款42:了解typename的双重意义203

Understandthetwomeaningsoftypename.203

条款43:学习处理模板化基类内的名称207

Knowhowtoaccessnamesintemplatizedbaseclasses.207

条款44:将与参数无关的代码抽离templates212

Factorparameter-independentcodeoutoftemplates.212

条款45:运用成员函数模板接受所有兼容类型218

Usememberfunctiontemplatestoaccept"allcompatibletypes."218

条款46:需要类型转换时请为模板定义非成员函数222

Definenon-memberfunctionsinsidetemplateswhentypeconversionsaredesired.222

条款47:请使用traitsclasses表现类型信息226

Usetraitsclassesforinformationabouttypes.226

条款48:认识template元编程233

Beawareoftemplatemetaprogramming.233

8.定制new和delete239

Customizingnewanddelete239

条款49:了解new-handler的行为240

Understandthebehaviorofthenew-handler.240

条款50:了解new和delete的合理替换时机247

Understandwhenitmakessensetoreplacenewanddelete.247

条款51:编写new和delete时需固守常规252

Adheretoconventionwhenwritingnewanddelete.252

条款52:写了placementnew也要写placementdelete256

Writeplacementdeleteifyouwriteplacementnew.256

9.杂项讨论262

Miscellany262

条款53:不要轻忽编译器的警告262

Payattentiontocompilerwarnings.262

条款54:让自己熟悉包括TR1在内的标准程序库263

Familiarizeyourselfwiththestandardlibrary,includingTR1.263

条款55:让自己熟悉Boost269

FamiliarizeyourselfwithBoost.269

A《Effective C++:改善程序与设计的55个具体做法(第3版 中文版)》之外273

B新旧版条款对映277

索引280

前言/序言

序言

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

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

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

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

即使《Effective C++:改善程序与设计的55个具体做法(第3版 中文版)》条款个数扩充为55,这一整组编程准则还谈不上完备。然而毕竟整理出优良准则——几乎任何时间适用于任何应用程序的准则——比想象中困难得多。如果你有其它其他编程准则的想法或建议,我将乐以与闻。

我手上维护《Effective C++:改善程序与设计的55个具体做法(第3版 中文版)》第一刷以来的变化清单,其中包括错误修订、进一步说明和技术更新。这份清单放在网址为http://aristeia.com/BookErrata/ec++3e-errata.html的"EffectiveC++Errata"网页上。如果你希望在这份清单更新时获得通知,请加入我的电邮名录邮件列表。这份列表名录用来发布消息给可能对我的专业工作感兴趣的人士,详情请见http://aristeia.com/MailingList/。

致谢

Acknowledge

《EffectiveC++》已经面世15年了,我开始学习C++则是在书写此书的前5年。也就是说"EffectiveC++项目"已经发展两个年代了。此期间我得益于数百(数千?)人的深刻知识、对我的建议与修正,以及偶发的一些目瞪口呆的事绩。这些人帮助我更加完善《EffectiveC++》,我要对他们全体表示感谢。

我已经放弃追踪「“在哪儿学到什么」”的历史,但永远记得有个公众信息来源不断带给我帮助:UsenetC++newsgroups,特别是comp.lang.c++.moderated和comp.std.c++。《Effective C++:改善程序与设计的55个具体做法(第3版 中文版)》许多——也许是大多数——条款得益于这些讨论群所突出的若干技术想法和后续调查与诊疗。

关于第三版新内容,SteveDewhurst和我一起讨论了最初的条款名单。条款11中关于「“藉由copy-and-swap实现operator=」”的构想来自HerbSutter在此主题的作品,像是《ExceptionalC++》(Addison-Wesley,2000)条款13。RAII(见条款13)源自BjarneStroustrup的《TheC++ProgrammingLanguage》(Addison-Wesley,2000)。条款17背后的想法来自Boostshared_ptr网页上的"“BestPractices”"节区(http://boost.org/libs/smart_ptr/shared_ptr.htm#BestPractices),又得到HerbSutter的《MoreExceptionalC++》(Addison-Wesley,2002)条款21的琢磨。条款29强烈受到HerbSutter在此主题上的广泛作品的影响,像是《ExceptionalC++》条款8~19,《MoreExceptionalC++》条款17~23,以及《ExceptionalC++Style》(Addison-Wesley,2005)条款11~13;DavidAbrahams帮助我更好地了解三个异常安全性保证。条款35的NVI手法来自HerbSutter写于《C/C++UsersJournal》2001年9月份的"Virtuality"专栏。同一条款中的TemplateMethod和Strategy设计模式来自《DesignPatterns》(Addison-Wesley,1995),作者是ErichGamma,RichardHelm,RalphJohnson和JohnVlissides。条款37所说的NVI使用手法,概念来自HendrikSchober。DavidSmallberg给了我动机在条款38写出一个定制型set实现品。条款39提到EBO通常只在多重继承中才可用,这个构想源自DavidVandevoorde和NicolaiM.Josuttis合着著的《C++Templates》(Addison-Wesley,2003)。条款42中我对typename的最初理解来自GregComeau主持的"C++andCFAQ"(http://www.comeaucomputing.com/techtalk/#typename),LeorZolman则帮助我认知我的最初了解并不正确(是我的错,和Greg无关)。条款46的本质源自于DanSak的谈话,"MakingNewFriends"。条款52末尾的那个想法「“如果你声明一版operatornew,你也应该声明其对应的delete伙伴”」源自HerbSutter的《ExceptionalC++Style》条款22。我从DavidAbrahams身上更多了解了Boost的检评过程(条款55有一份摘要)。

上面所说关于我向谁或从某处学习某一技术,并不必然表示谁或某处就是该技术的发明人或发表处。

我的笔记还告诉我,我也使用了来自SteveClamage,AntoineTrux,TimothyKnox和MikeKaelbling的信息,可惜这份笔记没有提到如何以及在哪儿学到什么。

第一版草稿由TomCargill,GlennCarroll,TonyDavis,BrianKernighan,JakKirman,DougLea,MoisesLejter,EugeneSantos,Jr.,JohnShewchuk,JohnStasko,BjarneStroustrup,BarbaraTilly和NancyL.Urbano共同检阅。我收到了一些改善建议并纳入后来刷次,这些建议来自NancyL.Urbano,ChrisTreichel,DavidCorbin,PaulGibson,SteveVinoski,TomCargill,NeilRhodes,DavidBern,RussWilliams,RobertBrazile,DougMorgan,UweSteinmüller,MarkSomer,DougMoore,DavidSmallberg,SethMeltzer,OlegShteynbuk,DavidPapurt,TonyHansen,PeterMcCluskey,StefanKuhlins,DavidBraunegg,PaulChisholm,AdamZell,ClovisTondo,MikeKaelbling,NatrajKini,LarsNyman,GregLutz,TimJohnson,JohnLakos,RogerScott,ScottFrohman,AlanRooks,RobertPoor,EricNagler,AntoineTrux,CadeRoux,ChandrikaGokul,RandyMangoba和GlennTeitelbaum。

第二版草稿由以下人士共同检阅:DerekBosch,TimJohnson,BrianKernighan,JunichiKimura,ScottLewandowski,LauraMichaels,DavidSmallberg,ClovisTondo,ChrisVanWyk和OlegZabluda。我收到来自以下人士的意见并因此对新刷有所帮助:DanielSteinberg,ArunprasadMarathe,DougStapp,RobertHall,CherylFerguson,GaryBartlett,MichaelTamm,KendallBeaman,EricNagler,MaxHailperin,JoeGottman,RichardWeeks,ValentinBonnard,JunHe,TimKing,DonMaier,TedHill,MarkHarrison,MichaelRubenstein,MarkRodgers,DavidGoh,BrentonCooper,AndyThomas-Cramer,AntoineTrux,JohnWait,BrianSharon,LiamFitzpatrick,BerndMohr,GaryYee,JohnO'Hanley,BradyPatterson,ChristopherPeterson,FeliksKluzniak,IsiDunietz,ChristopherCreutzi,IanCooper,CarlHarris,MarkStickel,ClayBudin,PanayotisMatsinopoulos,DavidSmallberg,HerbSutter,PajoMisljencevic,GiulioAgostini,FredrikBlomqvist,JimmySnyder,ByrialJensen,WitoldKuzminski,KazunobuKuriyama,MichaelChristensen,JorgeYáñezTeruel,MarkDavis,MartyRabinowitz,AresLagae和AlexanderMedvedev.

第三版早期部分草稿由以下人士共同检阅:BrianKernighan,AngelikaLanger,JesseLaeuchli,RogerE.Pedersen,ChrisVanWyk,NicholasStroustrup和HendrikSchober。完整草稿由以下人士共同检阅:LeorZolman,MikeTsao,EricNagler,GeneGutnik,DavidAbrahams,GerhardKreuzer,DrososKourounis,BrianKernighan,AndrewKirmse,BalogPal,EmilyJagdhar,EugeneKalenkovich,MikeRoze,EnricoCarrara,BenjaminBerck,JackReeves,SteveSchirripa,MartinFallenstedt,TimothyKnox,YunBai,MichaelLanzetta,PhilippJanert,GuidoBartolucci,MichaelTopic,JeffScherpelz,ChrisNauroth,NishantMittal,JeffSomers,HalMoroff,VincentManis,BrandonChang,GregLi,JimMeehan,AlanGeller,SiddharthaSingh,SamLee,SasanDashtinezhad,AlexMarin,SteveCai,ThomasFruchterman,CoryHicks,DavidSmallberg,GunavardhanKakulapati,DannyRabbani,JakeCohen,HendrikSchober,PacoViciana,GlennKennedy,JeffreyD.Oldham,NicholasStroustrup,MatthewWilson,AndreiAlexandrescu,TimJohnson,LeonMatthews,PeterDulimov和KevlinHenney。某些个别条款的草稿由HerbSutter和AttilaF.Feher检阅。

检阅一份不够洗炼(而且可能尚未完成)的手稿是件吃力的工作,在时间压力之下进行只会使得它更困难。我要感谢这么多人愿意为我做这件事。

如果对讨论素材缺乏背景,而又期望捕捉手稿中的每一个问题,检阅工作将更加困难。令人惊讶的是还是有人选择成为文字编辑。ChrystaMeadowbrooke是《Effective C++:改善程序与设计的55个具体做法(第3版 中文版)》的文字编辑,她的周密工作揭露出许多逃过其它其他每一双眼睛的问题。

LeorZolman在正式检阅前先以多种编译器检验所有代码,在我校订手稿之后又做一次。如果书中仍然存在任何错误,全是我的责任。KarlWiegers和(特别是)TimJohnson提供我快速而有帮助的反馈。

JohnWait是我的前两版编辑,有点傻傻地又签下这一份责任约。他的助理DeniseMickelsen熟练地处理我频繁的纠缠,带着愉快的微笑(至少我认为她是。呃,我从未见过她)。JulieNahil向来扮演救火队角色吸着截短的吸管并因此成为我的产品经理。她以非凡的镇定指挥产品计划内的六周通宵工作。JohnFuller(她的老板)和MartyRabinowitz(他的老板)也协助解决了产品发行量问题。VanessaMoore的正式工作是提供FrameMaker和PDF支持,但她也协助制作附录B的条目并格式化打印于封底里。SolveigHaugland协助将索引格式化。SandraSchroeder和ChutiPrasertsith负责封面设计,Chuti总是在每次我说『“如果把这张相片加上那个颜色的线条会怎样?』”时修订封面。ChandaLeary-Coutu对市场营销举重若轻。

在我忙于手稿的数月之中,电视影剧集BuffytheVampireSlayer常常帮助我在每天工作结束后解压。带着极大的克制我才能够不让Buffyspeak的身影进入《Effective C++:改善程序与设计的55个具体做法(第3版 中文版)》。KathyReed于1971年教我写程序,我很高兴我们保持友谊至今。DonaldFrench雇用我和MoisesLejter于1989年建立起C++培训教材(这项计划诱使我真正了解C++),1991年他又聘我在StratusComputer体现它们。该班学生鼓励我写下最终成为《Effective C++:改善程序与设计的55个具体做法(第3版 中文版)》第一版的东西。Don也将我介绍给JohnWait,他同意出版它们。

我的妻子NancyL.Urbano持续鼓励我写作,即使在我完成了七《Effective C++:改善程序与设计的55个具体做法(第3版 中文版)》、一张CD改写版、一篇论文之后。她有令人难以置信难以致信的忍耐、自制与宽容。没有她我无法完成我所完成的任何事情。

自始至终,我们的狗儿Persephone是我们无可取代的同伴。令人悲伤的是,在这个项目的大部分时间里,她和我们之间的交往关系已经改为办公室内的一坛骨灰瓮。我们十分怀念她。

导读

Introduction

学习程序语言根本大法是一回事;学习如何以某种语言设计并实现高效程序则是另一回事。这种说法对C++尤其适用,因为C++以拥有罕见的威力和丰富的表达能力为傲。只要适当使用,C++可以成为工作上的欢愉伙伴。巨大而变化多端的设计可以被直接表现出来,并且被有效实现出来。一组明智选择并精心设计的classes,functions和templates可使程序编写容易、直观、高效、并且远离错误。如果你知道怎么做,写出有效的C++程序并不太困难。然而如果没有良好培训,C++可能会导致你的代码难以理解、不易维护、不易扩充、效率低下又错误连连。

Effective C++:改善程序与设计的55个具体做法(第3版 中文版)》的目的是告诉你如何有效运用C++。我假设你已经知道C++是个语言并且已经对它有某些使用经验。这里提供的是这个语言的使用导引,使你的软件易理解、易维护、可移植、可扩充、高效、并且有着你所预期的行为。

我所提出的忠告大致分为两类:一般性的设计策略,以及带有具体细节的特定语言特性。设计上的讨论集中于「“如何在两个不同作法做法中择一完成某项任务」”。你该选择inheritance(继承)还是templates(模板)?该选择public继承还是private继承?该选择private继承还是composition(复合)?该选择member函数还是non-member函数?该选择pass-by-value还是pass-by-reference?在这些选择点上做出正确决定很重要,因为一个不良的决定有可能不至于很快带来影响,却在发展后期才显现恶果,那时候再来矫正往往既困难又耗时间,而且代价昂贵。

即使你完全知道该做什么,完全进入正轨还是可能有点棘手。什么是assignment操作符的适当返回类型(returntype)?何时该令析构函数为virtual?当operatornew无法找到足够内存时该如何行事?榨出这些细节很是重要,因为如果疏忽而不那么做,几乎总是导致未可预期的、也许神秘难解的程序行为。《Effective C++:改善程序与设计的55个具体做法(第3版 中文版)》将帮助你趋吉避凶。

这并不是一本范围广泛的C++参考书。这是一份55个特定建议(我称之为条款)的集合,谈论如何强化你的程序和设计。每个条款有相当程度的独立性,但大多数也参考其它其他条款。因此阅读《Effective C++:改善程序与设计的55个具体做法(第3版 中文版)》的一个方式是,从你感兴趣的条款开始,然后看它逐步把你带往何方。

Effective C++:改善程序与设计的55个具体做法(第3版 中文版)》也不是一本C++入门书籍。例如在第2章中我热切告诉你实现构造函数(constructors)、析构函数(destructors)和赋值操作符(assignmentoperators)的一切种种,但我假设你已经知道或有能力在其它其他地方学得这些函数的功能以及它们如何声明。市面上有许多C++书籍内含这类信息。

Effective C++:改善程序与设计的55个具体做法(第3版 中文版)》目的是要强调那些常常被漠视的C++编程方向与观点。其它其他书籍描述C++语言的各个成分,《Effective C++:改善程序与设计的55个具体做法(第3版 中文版)》告诉你如何结合那些成分以便最终获得有效程序。其它其他书籍告诉你如何让程序通过编译,《Effective C++:改善程序与设计的55个具体做法(第3版 中文版)》告诉你如何回避编译器难以显露的问题。

在此同时,《Effective C++:改善程序与设计的55个具体做法(第3版 中文版)》将范围限制在标准C++上头。书内只会出现官方规格书规范上所列的特性。《Effective C++:改善程序与设计的55个具体做法(第3版 中文版)》十分重视移植性,所以如果你想找一些与平台相依的秘诀和窍门,这里没有。

另一个你不会在《Effective C++:改善程序与设计的55个具体做法(第3版 中文版)》发现的是C++福音书——走向完美C++软件的唯一真理之路。《Effective C++:改善程序与设计的55个具体做法(第3版 中文版)》每个条款都提供引导,告诉我们如何发展出更好的设计,如何避免常见的问题,或是如何达到更高的效率,但没有任何一个条款放之四海皆准、一体适用。软件设计和实现是复杂的差使,被硬件、操作系统、应用程序的约束条件涂上五颜六色,所以我能做的最好的就是提供指南,让你得以创造出更棒的程序。

如果任何时间你都遵循每一条准则,不太可能掉入C++最常见的陷阱中。但是所谓准则天生就带有例外。这就是为什么每个条款都有解释与说明。这些解释与说明是《Effective C++:改善程序与设计的55个具体做法(第3版 中文版)》最重要的一部分。惟惟有了解条款背后的基本原理,你才能够决定是否将它套用于你所开发的软件,并奉行其所昭示的独特约束。

Effective C++:改善程序与设计的55个具体做法(第3版 中文版)》的最佳用途就是彻底了解C++如何行为、为什么那样行为,以及如何运用其行为形成优势。盲目应用书中条款是非常不适合的。但如果没有好理由,你或许也不该违反任何一个条款。


其他推荐