前 言
Imperfect C++中文版
或许我不像喜欢我的孩子们那样喜爱C++,甚至或许我对C++的喜爱都比不上我对骑自行车在坡度为32°、光滑度为10%的柏油路上爬坡的热衷,1尽管有时这些喜爱之情的确十分接近。我庆幸我有这样的人生,让我得以将生命中的部分时间用来实践或阐释Frederick P.Brooks的名言:“尽量发挥想象力进行创造”。我更要感激的是我能够跟这门如此强大、危险却又诱人的语言相伴。
这些话听起来似乎蛮华丽动听,但你可能是因为看到本书的书名才买下它的,以为本书是一本抨击C++的图书。你可能是Java或C或其他主流语言的热衷者,因而买这本书可能是想从中找到支持你远离C++的理由。倘若果真如此,你会失望的,因为本书并不是举办一切C++批判大会。不过先别急着离开,因为你或许能够从中找到令你开始接触C++的理由。
你将从中学到什么
我写这本书的目的在于给予开发同行们一些能量。它以虽批评但具建设性的眼光来看待C++及其不完美之处,并给出实际的措施以避免或改善这种不完美。我希望你在读完本书后能够对下面这些问题有一个更好的把握:
如何克服C++类型系统中的某些不足。
模板编程在提高代码灵活性和健壮性上的强大能力。
如何在(当前标准尚不予置理的)未定义行为的险恶丛林中生存下来。后者包括动态库、静态对象以及线程等。
隐式转换的代价、它所带来的问题,及其替代方案,即基于显式转换的、高效且易于控制的泛用性编程。
如何编写能够与(或更容易令它们与)其他编译器、库、线程模型等兼容的软件。
编译器“在幕后”都做了些什么?你对编译器可以施加什么样的影响。
数组和指针之间微妙而棘手的互操作性,以及用于防止它们的行为变得彼此相似的技术。
C++对RAII(Resource Acquisition Is Initialization,资源获取即初始化)机制的支持,以及该机制可以被运用到的各种问题领域。
如何通过最大限度地榨取编译器的侦错能力来节省你自己所需花费的工夫。
有了上面这些“装备”,你编写的代码将更有效率、更具可维护性、更健壮,也更具灵活性。
我的意图是,即便是经验丰富的C++实践者也能从本书中发现新思想和新技术,从而引发他们的灵感并提高其现有的实战能力。经验较少的程序员则能领会其中包含的有关原则并将相关技术应用到自己的工作中,在增长见识的同时弥补自己对一些技术细节理解上的疏漏。
我并不指望你们所有人都完全同意我所说的一切,但我期望哪怕是最有争议的内容也能激发你去真正弄明白自己对这门强大语言的使用问题。
第1章 强制设计:约束、契约和断言
1.1 绿蛋和火腿
1.2 编译期契约:约束
1.3 运行期契约:前置条件、后置条件和不变式
1.4 断言
第2章 对象生命期
2.1 对象生命周期
2.2 控制你的客户端
2.3 MIL及其优点*