C++编程惯用法----代译者序、序、第0章 简介

代译者序

    “It is one o fthose books that every professional C++ programmer should have read as it is full of good advice based on a wealrh of experience.”——ACCU主席Francis GJass borow

    是的,上面的评价就是ACCU主席对于你现在手头上的这本书的评。现在世面上关于C++的书籍种类之多,可谓浩如繁星,但能够得到Francis Glassborow亲自介绍并且给出“Highly Recommended”这一最高推荐度的C++书籍,不过几本而巳,而这本就是其中之一。

    作为一种支持多种设计范型的通用程序设计语言,C++程序设计语言自身所特有的内涵以及外延都决非一两出色的书籍所能包含亦或一两年艰苦的学习所能掌握的。究其原因就是因为在使用C++语言的过程中,你会拥有太多的选择。无论是在用C++进行设计或者实现,做出正确的选择都决非易事。非常多的C++书籍都只是详细地介绍了语言的特性,即使是某些口碑良好的读本,也同样只是在传教语言本身却忽视了告诉读者如何在使用C++的过程中去做出正确的选择。而这本书却在这个关键方面有着出色的表现。从这一方面来说,这本书是为那些严肃的以及真正书写C++代码的程序员准备的。

    从本书中,你不会学习到什么是左值,什么是循环,什么是类。因为这本书理想的读者是那些巳经具备了一定C++基础,期望并且正在迈向C++专家之路的程序员。尽管本书的作者在一幵始就己经表明了没有人可以仅仅通过阅读此书而成为专家,但是以我对这本书的观点来看,作者Rob Murray无疑是在以自己数十年的专家经验为大家铺设一条通往专家的大道,这也正印证了那句经典——“师傅领进门,修行靠个人”。

    那么到底该如何给这本书定位呢?一位使用了C++数十年的专家写成的一本关于如何在C++中做出正确选择的专家级读本,这就是我心目中给此书的定位。在购买此书之前,你应该至少阅读过一本关于C++语言的书籍,但无需对C++有很深刻的认识,因为这正是此书想要达到的目的。如果你曾经阅读过《C++沉思录》,那么这本书的程度和那一本在某种意义上是一致的,因为它们都不是关于语言介绍的,而都是关于如何使用C++的。并且同样的在书中遍布了许多关于如何使用C++进行更好编程的真知灼见。

    在这里,我还给大家一点阅读方面的建议。本书本身是按照主题来组织的,也就是说一个章节一般都是独立地说明了C++方面的某一个主题,并且给出了详细的解释以及说明。这样,阅读本书就并不需要循序而来,你可以一上来就选择你所感兴趣的主题章节进行阅读,不过我还是建议大家在阅读之前首先好好地熟读第一章。这一章是关于抽象(Abstraction)的,关于抽象这一主题的说明并不十分常见于一般的编程书籍或者语言介绍书籍中。然而,抽象这个与编程有着本质联系的概念对于培养良好的程序观有着不可替代的作用。此书中关于抽象概念的说明虽然不是很深入,却非常直观和易于理解,我想在拥有了一个良好的抽象概念后,再去细细品味书中所提到的其他关于C++的一切是有好处的。

    最后,我还想单独地挑出书中的一章来谈谈我的看法。此书第9章标题非常醒目——重用(Reusability),软件工程中的一个核心而又敏感的词汇。在一本C++书籍中,对如此主题进行论述是否合适?这也是我拿到书稿看过目录后的第一反应。因为重用这个议题绝不是一两句话、一两个章节可以说清楚的。如此一来,如果作者没有很好的技术功底以及文字能力,这样的章节只可能沦落成“食之无味、弃之可惜”的鸡肋,在我个人阅读过的许多书籍中,这种现象常常见到,以至于现在我会把一本书是否包含了鸡肋章节作为评价一本书好坏的重要标准之一。然而,在详细地读过这一章节之后(这是我在阅读这本书的过程中看的第2章,第1章就是关于抽象的那章。是的,我个人是按照主题来阅读此书的),我想我的疑虑全部都被打消了。作者Rob Murray不愧是程序设计领域内的专家人物,可谓深谙重用之道,而其叙述手段更是精彩,首先从重用的目标以及发现说起,再一步步结合C++语言的实现方式对多个主题进行了深入浅出的论述,其对软工学中重用的概念以及C++的多个实现主题之间的结合可谓完美。在和此书译者王昕先生的私下交谈中,译者多次提到这一章也是让他本人最受益的,一个使用C++己经有八年之久的程序员尚能从中获益,我相信一般读者在深刻理解了本章内容后一定会有同样的感觉。在我眼里这一章的内容就已经对得起读者对此书的所有投资了。

    关于此书作者及译者,书底有很好的介绍,我也就不再着墨了。书没有最好的,只有最适合自己的,在我说了这么多之后,这本书是否适合你,还是需要你自己做也判断,但再一次看看Francis Glassborow对此书的另外一条评价也许能让你更快并且正确地做出买与不买的选择,就像这本书将会告诉你更多关于C++使用上的该与不该一样。

    Get a copy, read it and pass it on. Get your own copy if you want to keep ahead of your colleagues.ACCU主席Francis Glassborow

倪硕

于长沙中南大学

    在专家看来,C++可以帮助软件设计者和程序员构造出模块化、易维护以及高性能的系统。然而,对新手来说,这门语言的复杂程度是一个不小的威胁。在C++中有着许多不同的语言特性,只有具有一定经验之后,我们才会知道各种特性的适用情况。

    本书的目的就是加速读者的这种学习进程。大部分成功的C++程序员并不会简单地从语言规则中复述出某些章节或是条款,相反,他们总是习惯于自己以往工作中所获得的行之有效的那些惯用法和技巧。我们的目的就是帮助那些C++的新手学习到那些在实践中最有效的惯用法。同时,我们也会在书中指出那些我们经常接触到的C++缺陷。

    在本书中,我们的讨论并不试图覆盖整个语言,那些有关语言语义的精确定义可以查看参考手册。我们主要帮助读者构造出可以被那些不是C++语言专家的人所理解的程序。我们不但讨论了那些使程序变得优雅及高效的技巧,也展示了如何使它们更容易被理解和维护的方法。

    致谢

    本书中的想法和编程惯用法几乎都不是我发明的。我的目的就是把它们(在我8年(PS:我也用了8年的C++,但我离大师还有十万八千里,这是为什么呢,为什么呢......首先需要自我的反省,其次需要公司和社会的反省)的C++使用过程中从其他人那学到的并被我认为是最重要的策略和战术)用一种C++新手也能学会的方式展现给读者。这些收获中的部分来自于实际的开发项目中(这些项目被我们从C移植到C++上)的经验,另外一些则来自于和其他髙手的讨论。

    关于模板以及函数库设计的许多好的想法(包括那些隐藏在本书所给出的容器类后的想法)都来自于最初由Martin CarrollAndrew Koenig以及Jonathan Shopiro所设计的USL标准组件库(译注:关于USL标准组件的文章参见于19936月的《C++ Report》中Martin Carroll所写的《Design of the USL Standard Components》)中的类。对于在本书中出现的任何错误,则都由我负责。Andrew Koenig是一个C++语言专家,他对我的帮助非常大。另外,那些参与过我所举行过的几期“C++策略与战术”研讨会的人也帮助启发了我书写本书,并对书中的想法进行提炼。其他的重要的想法来自于Tom CargillJohn CarolanJim CoplienMark Linton,Gerald Schwarz,当然,还有Bjame Stroustrup。要不是他发明了C++语言,本书也就不可能出现了。

    Brian Kernighan阅读过本节的多次草稿。他极好的反馈意见起了很大的帮助作用。同时我还要感谢......

0章简介

    C++是一门规模庞大的编程语言。只了解C++规则的程序员就和只知道棋子如何移动的棋手一样(失败)。为了获得成功,还要学习一些相关的法则和策略。

    本书所面对的读者是使用C++语言的初级及中级程序员们,他们一方面期待学到更多有关使用这门语言的知识,一方面又没有时间去参加一个大学学期那么长的一门课程。我们假设读者己经了解了一些C++的基础知识如:什么是成员函数?如何使用publicprivate以及protected等等。本书的读者没有必要是一个C++专家,在每次提及一些该语言中比较高级的话题(如多继承)时,我们都会给出一个“回顾”栏目对此进行一个简短的总结。我们关注的是那些被证明在实际中十分有效的策略。在本书中,我们将避免多谈理论,而尽量为读者给出例子及实用的建议。

    我们尽量保证不偏离惯例。在本书中,没有一个想法或技术会超出语言的基础,它们大多来自于有着多年C++经验的程序员日常的实践中。很显然,最新的想法总是具有最大的风险。我们希望能够避免将C++的初级用户引导到那些想法上去。除了第10章之外(译注:在本书写作过程中,异常还只是C++中的一个新增特性。但到了现在,在C++中异常己经发展得比较成熟了)、本书中所有的技术都经过了实践的证明。

    我们也无意将读者变成C++专家。C++中也包含了一些阴暗的角落,我们会在书中将它们一一指出并教导读者如何避免它们。写出依赖于语言中定义含糊、意义微妙的规则的程序是不好的,即便作者本人清楚它的意义并保证它可以正确运行,下一个来维护这段代码的人也可能未必能够做到这点。比较好的做法是:坚持使用语言中那些被广泛使用及理解的部分来书写程序。

    0.1 关于示例代码

    本书中的示例代码都通过了编译(或是取自一个通过编译的文件)。为了使代码尽可能短小,我们在此略掉了那些和主题无关的周边代码(如#include指令)。

    本书中的示例大多只处理接口,而不是实现。因此,为了清晰起见,大部分的示例代码都略去了类的私有部分:

    class Something {

        //私有部分被省略……

    public

        Something();

    };

    0.2 本书的组织

    在第1章中,我们讨论了如何选择一种合适的高阶抽象方式来实现设计,并着重阐述了抽象和其实现之间的区别。

    后续的两章主要关注如何在C++的类中实现较高层次的抽象。第2章的讨论涵盖了自高阶的设计策略到底层的接口和实现细节。在第3章中,我们阐述了几种句柄在类实现中的用法。

    接下来的三章介绍了继承。第4章中讨论了公用、保护、私用继承的区別,并给出了如何选择使用各种继承方式的参考意见。第5章中的讨论主要针对超过基类不止一个的继承,我们讨论了应该如何使用它以及有关多继承的一些难以掌握的细节之处。在第6章中,我们讲述了一些有关如何构建类的方法,以使得其他人可以把这些类作为他们的基类来发展他们自己的继承体系。

    模板,作为C++语言的个新特性,其功能非常强大,它必将对人们以后编写C++程序造成极大的影响。我们在第7章和第8章中详细地讲解了模板。由于大部分C++用户对于模板还不甚了解,我们开始只是以基础为始,先描述一些用来构建有效模板的技巧,接着才构建各种各样的模板。包括:使用模板来实现智能指针,一些简单的容器,最后是一个接近实际应用的容器(一个List模扳)。然后我们才讨论一些关于模板的高级技巧,如:如何对那个List模板进行重新组织,使其更快、更小、并且具有更多功能。

    9章中讨论了如何把一段可工作代码加入到重用库中:重用的困难程度要远远超过其字面意思。我们在本章中也展示了如何使用前几章中介绍的技巧来提高代码的健壮性、使其更容易使用以及运行得更快。

    C++中新的语言特性——异常——可以使我们在编写程序时不再需要经常去进行出错情况的检测,但它也很容易被人们给误用。在第10章中,我们讲述了如何使用异常以及不适合使用它的情况。工业界目前也正在学习如何使用异常,这也使这一章显得稍微有点投机。

    将一个项目从C平台移植到C++平台所牵涉到的不止是更改一个编译器那么简单:我们必须在项目开发中习惯一种新的开发软件的方式。我们将会在第11章中简单讲述一些有关釆用C++开发的项目中经常碰到的技术及人们自身上的问题。

    0.3 问题

    除本章外,本书中的其他章节都以一个“小结”加一个“问题”作为结束。在“小结”中,我们将会以列表的方式给出每一章中的主要概念。那些问题是用来促使读者去思考以及讨论有关技术和人们自身方面的问题,以使得他们可以更容易地理解和记忆每一章中给出的内容,问题中的一部分具有“标准”答案,但更多的则没有,我们衷心地希望读者就此进行的讨论会对他们产生帮助。

    0.4 语言规则

    在本书书写过程中,C++语言的当前“官方”标准文档是ElIis和Stroustrup所编写的《Annotated C++ Reference Manual})(也经常被简称为ARM)(译注:目前C++的标准文档是1998年7月所发布的ISO 14882文档,也称C++98)(PS:现在已经是C++11了,并且ARM已经过时)。ARM是ISO/ANSI C++标准委员会(一个由来自工业界以及学术界的自愿者所组成的团体,他们正在制订一个就会被ANSI和IS0同时采纳的C++语言标准)用以制订标准文档的基础。除非ISO/ANSI委员会明确提出了某些不同之处,否则在本书中所提到的“语言规则”都是基于ARM之上的。实际上(ISO/ANSI委员会与ARM之间的)大部分的区别都微不足道。我们也鼓励所有的C++用户都能够遵循标准化结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值