C++ 基本上可以运行在所有的平台上,并且有无数的应用程序都是用C++ 实现的。如果
你买了或者可能买这本书,你很有可能就是一个实现这些程序之一的工程师或者研究人
员。但是无论你正在实现什么、你的目标平台是什么,你都可能碰到其他的研发人员已
经解决很多年的那些共同的问题。本书就是用来解决这些共同的问题并对每一个解决方
案进行了解释。
无论你是一个对C++ 非常熟悉、具有很多年经验的人员还是刚接触这门语言的工程师,
你都可能非常熟悉在每一个项目中都需要重新实现的那些功能:日期和时间解析/算术、
操作字符串和文本、操作文件、解析XML 文档、使用标准容器等等。对这些问题,本书
都包含它们的一些解决方案。在某些情况下(例如,时间和日期算术),标准类库基本上
没有提供什么支持。而在其他一些情况下(例如,字符串操作)标准类库则包含很丰富
的功能支持,但是它们也不是万能的,同样还是有很多共同的问题非常的麻烦。
每节的格式都是直截了当的。基本上每一节都一个问题描述和一个代码解决方案,并且
紧跟着是一个讨论。每一节的讨论都是尽量地简短和适用,尽量做到把问题解决清楚但
又不哐罗嗦,但是还是有一些有用的相关的主题,我们用了较长的篇幅来讨论它们。
本书是用来解决C++ 中的一些共同问题的,而不是C++ 的一本入门书籍。在讨论前,我
们都假设你最少对C++ 和面向对象编程有一些基本的了解。特别地,如果你熟悉以下这
些技术会对你有所帮助:
. C++ 的继承和虚函数
. 标准类库
. 标准模板库中的一些组件(容器、迭代器和算法等)
. 模板
当然当你读这本书时这些也不是必要的,但是最少有些了解则对你理解本书的内容会有
所帮助。
关于例子程序
在设计我们的例子代码时,我们尽量做到简单、可移植和比较好的性能。每一个解决方
案的设计都追求相同的设计思路:有可能就使用标准C++(语言或库);如果不能这样,
就使用事实上的标准作为替代。例如,许多的章节都使用标准的字符串类来处理字符串,
并且大部分数学和科学计算章节使用标准的数字类型、容器和模板。标准的类库在这些
领域都有很强的支持,因此标准类库的使用是非常合适的。但是,相反在多线程或者XML
解析中C++ 则支持很差。因此,我们就使用Boost 线程库来处理多线程问题,用Xerces
解析器来处理XML 的解析问题。
通常,在C++ 中,对同一个问题有很多种解决办法,这给开发人员提供了灵活性,但是
这也带来了一些争论。大部分例子都是我们能提供的最好的解决方案,但是这并不意味
着这永远就是一个最好的方案。如果在某些方面存在更好的替代方案或者比较起来更好
的办法(或许使用标准类库的方案是笨拙的、没创意的;这种情况下,我们使用了Boost
库来提供一种可替代的方案),我们将展示某些可能的替代方案从而给你打开一些思路。
大部分例子都使用模板。如果你对于使用模板没有什么经验,你还是应尽快地学习一些
这方面的知识。在这本书中对于模板没有特别多的介绍,除了在第8章中的8.11节和8.12
节有些介绍之外没有更多的介绍。用C++ 开发的大部分兴趣出现在模板的元程序设计和
基于策略的设计这些领域。
谈到C++ 的文献资料,在C++ 社区中有很多的跟踪。第一个技术报告(称为TR1)多少
还有点不稳定。它列出了一些在C++ 的下一个版本中将会加进去的特性。标准类库并不
要求支持它,但是很多的厂商已经开始实现TR1 并且在不久的将来你可以看到有些特性
会出现在它们的编译器中。TR1 中的大部分库都出现在了Boost 项目中。
我们使用Boost 库更多一些。Boost 是一个开源的、可移植的类库,它填补了标准类库中
很多的缺陷。目前的版本是1.32,1.33 版也快完成了。在一些例子中我们提供了许多指
向特定Boost 库的指针。更多的关于Boost 库的信息请参考网站www.boost.org。
本书中使用到的一些惯例
下面的一些字体格式是本书使用的一些惯例:
前言
斜体(Italic)
表示新的术语、URL、电子邮件、文件名、文件扩展名、路径名、目录、Unix 实用
程序、命令和命令行参数。
<...>
尖括号是用来包含这些元素,当这些元素以斜体格式出现时,这些元素是你在命令
和命令行中需要指明的。
等宽字体(Constant Width)
指明其中的代码或片断。例如,类名、方法名、以及无论它们什么时候出现时呈现
的常数宽度。
等宽粗体(Constant Width Bold)
表明用户在混合输入/ 输出例子中的输入。
等宽斜体(Constant Width Italic)
表明在语法例子中用户指定的项目。
使用例子代码
本书旨在帮你更好地完成工作。总体来说,你可以在你的程序和文档中使用本书中的代
码。你不用与我们联系来得到允许,除非你打算复制这些代码的大部分。例如,使用本
书中的很多代码来实现一个程序不需要得到允许。但是出售或者发布来自O'Reilly 书中
的例子的CD-ROM则需要得到我们的允许。引用本书和本书中的例子来回答问题不需要
得到我们的允许。但把本书中大量的例子代码合并到你的产品文档中则需要得到我们的
允许。
我们会很感谢你指明出处,但也不是必要的。一个出处常常包含标题、作者、出版商和
ISBN 号。例如:“C++ Cookbook by D. Ryan Stephens, Christopher Diggins, Jonathan
Turkanis, and Jeff Cogswell. Copyright 2006 O'Reilly Media, Inc., 0-596-00761-2。
”
基于以上的授权,如果你在使用我们的例子代码时需要得到我们的允许,请与我们联系:
permissions@oreilly.com。
意见和问题
有关这本书的意见和问题,请致信以下出版商:
美国:
O’Reilly Media, Inc.
1005 Gravenstein Highway North
Sebastopol, CA 95472
中国:
100080 北京市海淀区知春路49 号希格玛公寓B 座809 室
奥莱理软件(北京)有限公司
本书的Web 页上列出了勘误表、示例和任何额外的信息。可登录以下网址查询:
http://www.oreilly.com/catalog/cplusplusckbk
http://www.oreilly.com.cn/book.php?bn=978-7-302-15555-
3
如果想就本书的技术问题发表评论或咨询,请发邮件至:
bookquestions@oreilly.com
info@mail.oreilly.com.cn
关于本书和其他书籍的更多信息,请访问O'Reilly 的网站:
http://www.oreilly.com
http://www.oreilly.com.cn
致谢
来自D. Ryan Stephens
我想感谢的最重要的人就是我的妻子Daphne和我的孩子Jesse、Pascal和Chloe。完成这
本书的写作是困难的,但是最主要的是它是一项很费时间的工作,而我的家庭大力支持
并且以最好的方式容忍我深夜还在办公室工作。
我还需要感谢技术审查人员,正是他们使得这本书的质量如此好。与其他的很多事情一
样,正是他们一遍遍的检查使得本书的清晰性和准确性得以保证。非常感谢Dan Saks、
Uwe Schnitker 和David Theese。
最后,感谢我的编辑Jonathan Gennick,,正是因为他的建议,使得本书的语法、格式以
及我的写作心态都一直很好。
来自 Christopher Diggins
感谢Kris Unger、Jonathan Turkanis、Jonathan Gennick 和 Ryan Stephens,感谢他们给
我带来帮助的建议和批评,使得我能成为一个更好的作者。特别要感谢我的妻子Meanie
Charbonneau,因为她照亮了我的生活。
前言
来自 Jonathan Turkanis
由于我负责的章节涉及到非常多的不同商业产品和开源项目,并且又由于我对这些项目
和产品又有很多的问题,所以我需要感谢很多的人。
首先,让我感谢Ron Liechty、Howard Hinnant 和Metrowerks 的工程师,因为他们回答
了我的每一个可能的问题并且给我提供了CodeWarrior 的好几个版本。
我还要感谢Boost.Build 的开发人员,特别是Vladimir Prus、Rene Rivera 和David
Abrahams,不仅仅是因为他们回答了我的问题,而且还因为他们集成了Boost build 系统,这对于第1 章中的信息提供了一个唯一的非常重要的来源。
同样,还要感谢Digital Mars 的Walter Bright;Comeau Computing 的Greg Comeau;
Dinkumware 的P. J. Plauger;Bloodshed Software 的Colin Laplace; borland.public.*
newsgroups 的Ed Mulroy 和Pavel Vozenilek;microsoft.public.vc.languages 的Arnaud
Debaene 和Igor Tandetnik;MinGW/MSYS 邮件列表中的Earnie Boyd、Greg Chicares、
Adib Taraben、John Vandenberg 和Lennart Borgman;Cygwin 列表中的Christopher
Faylor、Larry Hall、Igor Pechtchanski、Joshua Daniel Franklin 和Dave Korn;GCC 开
发者列表中的Mike Stump 和 Geoffrey Keating;DecisionSoft的Mark Goodhand;以及
apache.org 的David N. Bertoni。
我还要感谢Robert Mecklenburg,因为他的书Managing Projects with GNU make,Third
Edition (O'Reilly)给我提供了很多GNU make 工具的基础知识。
此外,我还要感谢Vladimir Prus、Matthew Wilson、Ryan Stephens 和Christopher
Diggins,正是他们提供了我的前期手稿的批评意见。
最后,我还得感谢我的编辑Jonathan Gennick、我的妻子Jennifer 和我的祖父Louis S.
Goodman,正是他教会了我如何写作。






