评 《C++程序设计原理与实践》
时间:2010-09-18 来源:OwnWaterloo
评 《C++程序设计原理与实践》
这是一本大杂烩!
文法分析、 GUI、 数据结构、 正则表达式、 数值计算、 嵌入式、 内存管理、 加密、 测试, 哦, 还有某章中的若干语言; 最后, 当然还包括C++自身 —— 每一个方面的入门书籍, 都不会比本书更薄。
本书目的何在?
入门级书籍
“我需要这样一本C++书籍,看了之后就可以在实际环境中得心应手地使用C++。” —— 这种想法也没什么不好, 如果真的存在这样一本书, 肯定会被视为C++社区的福音, 推荐给每一个想要学习C++的人。
问题是, C++的复杂性使得这个任务几乎不可能完成。 Stroustrup博士的新作给人带来了一丝希望, 但我觉得本书依然没能创造这个奇迹, 依然是一本入门级别的书。
上手容易 从来不是C++的优点, 将来也不会是。 所以, 打算学习C++的朋友,请打消 “一口吃成C++专家” 的念头。 吃成C++中级用户都不太现实, 除非你才华出众。 就目前来看, 依然需要走那个经典的模式: 从一本入门级别的书感受C++的整体轮廓, 然后从更多书籍中逐步细化、 完善对C++的各个方面的认识。 立马行动, 极有可能在神作出现之前就不再需要它了。
而与其他同类书籍相比, 本书还是有一些特点的。
着重程序设计而非语言规则
记得我们是如何学习加法与乘法法的? 从竖式开始? 竖式确实能展示计算的过程, 并能得出计算的结果。
但计算意义, 通常不是通过竖式了解到的, 而是在更早的启蒙教育中就获得了:
“我给希望工程捐12元, 你给希望工程捐26元, 我俩 总共 捐了多少元?”因为我不懂政治, 所以答案是38元 —— 这就是加法的含义: 求和。
“每发一帖可以得5毛钱, 发74帖 一共 能得多少钱?”这就是乘法的意义 —— 多个相同的数求和。
正因为我们需要解决这些问题, 所以给这些问题以定义, 并逐步总结解决问题的一般方法。
而很多C++书籍着重C++语言本身。 通过这类书籍,我们可以得知 X —— 此处, X=构造/析构、访问控制、 虚函数、 继承、 异常、 模板等等 —— 能起到怎样的效果、 存在何种陷阱、 甚至还能了解X是如何被实现。 但很少有书籍能清楚的阐述出 “ 为什么需要X ?”、“ X应该用于何种场景 ?”
本书的的首要主题是 程序设计 。 是因为程序设计需要: 维护不变式、 隔离接口与实现、 开闭原则、 差异编程、 错误的报告与处理分离、 元编程等等等等。 为此, C++添加了许多特性以直接支持种种程序设计的需要。
所以本书不是孤立地介绍C++, 而是揭示C++与程序设计的关系。 通过本书, 可以更快掌握X的使用时机。
示例选材
程序设计要通过编写程序的实践来学习
—Brian Kernighan
所以, 编程书籍中从来不会缺少示例。
本书从程序设计的各个领域(见上)中选取较丰富的题材、 加以简化浓缩、 作为书中的示例。 一方面, 可以开阔视野; 更重要的是, 通过这样的示例比那些个 toy 示例 更能体会出程序设计, 而不是仅仅展示语言规则 —— 那些充斥着 foo 、 bar 、 42 什么的代码片段最讨厌了。
另外, 关于这些丰富的题材:
- 如果对某领域感兴趣, 想更深入地了解, 肯定需要参阅更多的资料。 但以“通过这些题材体会程序设计与C++相应支持”为目的的话, 并不需要额外掌握相应的知识。
- 这也是一个例子, 说明C++是一门general purpose而非领域专用的语言, 能够(但并不总是适合)在许多领域使用。
C++语言规则选材
C++语言规则非但不是本书的第一要素, 还要通过审查才能进入本书。
本书包含了C++语言规则的 每一个主要方面 , 没有遗漏任何一个方面; 但每个方面中, 作者只介绍了C++中的 最常用与实用的部分 , 有意避免了那些 复杂且冷僻 的部分 [1] :
- 函数没有重载解析规则
- 类没有多继承
- 内存管理没有 operator new
- 流没有 locale 与 codecvt
- 模板没有偏特化与 template template argument
- 异常没有 terminate_handler 和 exception specification
- ……
也就是说, 本书包含了C++语言的 所有主干内容 , 如果对那些细枝末叶的东西感兴趣, 可参阅更多的C++书籍。
如果不感兴趣?上面那些东西其实也没什么大不了的。
[1] | 注意: 这并不是一个 系统的C++语言规则列表 。 并且, 因为时间仓促, 可能与书中的真实情况不符。 |
权威的指导
事物越是复杂, 对它的理解也就越多样化, 也越不可能和谐统一。 C++自然也如此。
对 应该如何使用C++ 这个问题, 10个人可能会得出11种答案。 稍有经验的C++程序员都会存在自己的 倾向 , 即: 当满足何种条件时, 使用/禁止某种特性 。
上文有提到, C++书籍中, 多是讲述语言特性是什么, 而非 指导应在何种情况下使用 。 因为大师们都明白后者很难, 为了不误导读者, 他们只能从C++的 某些局部 选出一些 久经考验 、 并且在绝大部分情况下都适用的经验, 从而成就了一些C++的经典书籍。
既然本书旨在传授 “如何使用C++的方方面面”, 并且本书的作者之一 —— Stroustrup博士 —— 可谓全世界对C++理解最深入与权威的人, 所以本书必然存在相当强烈的倾向。
我不是在说 “迷信权威” 。
对乐于让别人代替自己思考的人, 跟着Stroustrup博士混, 风险最小 —— 本书中的C++倾向是最为主流与经典的一脉。
对喜欢自主思考的人, 当你对C++越来越熟悉的同时, 也会产生不同于其他人的看法。 但在变得熟悉之前, 总得被动接受点什么。 Stroustrup博士可能会教给你一些在20%的情况下不适合的东西, 人无完人; 但不太可能教给你一些在80%情况下都不适合的东西。 人是白纸一张时最容易吸收, 而且也吸收的最彻底; 往后要发现、 承认并改正这个时期产生的认识偏差是很困难的。 跟Stroustrup博士混, 这种情况不那么容易出现。
关于倾向, 最后再多说一点个人建议供参考: 请考虑你编程的目的是为了 用小代价解决问题 , 还是为了将某种技术 —— 不仅仅只C++语言的各种特性, 还包括但不限于OO、 设计模式等 时尚 的东西 —— 玩得最 纯粹 、 最 炫 ?
附录
当需要查询某个C++语言规则时, 由于本书的安排, 这些规则散布在各个章节之中。 这非常不利于查阅。
本书的附录可作为一种补充。 附录A是按语言规则而非程序设计组织, 并且:
- 包含正文章节数, 如果本书中有关于该规则的详细讨论
- 或者 “请查阅专家级的书籍或资料”, 表示本书中没有(或极少有)相关讨论, 并且可能属于比较偏门的知识。
遗憾的是附录在中文版中被阉割, 只能 在线 下载, 文件没有标签, 甚至搜索不能…… 严重影响附录原本的查阅效果……
末
三周时间要细读这样一本书还是有些小困难…… 所以, 以上的文字请各位 随便看看就好, 切勿太过当真……
最后, enjoy