用 C++ 来思考
——评《C++编程思想》第1卷:标准C++导引
当我第一次打开这本书的时候,我就已经意识到这是一本好书。即使仅仅是惊鸿一瞥,我仍然没有丝毫的犹豫就将它买了下来——那是这本书第一版刚出版的时候。之所以会在看到它的第一眼就认可它,与作者优美流畅的文笔不无关系。而能够将一本专业书籍写得引人入胜,这本身就很了不起。而且《C++编程思想》还不仅仅局限于此。在读这本书的时候,我很快就意识到为什么这本书会在讲授像C++这样的大型程序设计语言时,读者并不因为语言特性类别的繁多、设计思想的变迁与提升而感到学习困难,难于理解C++程序设计语言的设计理念。无他,其原因就在于作者Bruce
Eckel善于从读者、从学习者的角度去看、去思考怎样才能将读者尚不明了的知识通过巧妙的方法,明确的表述出来。这是与Bruce Eckel本人长期从事C++语言教学,不断从教学实际中,从师学的反馈信息中提炼、总结出切实有效的教学方法,并不断根据教学效果整理、修改教学内容这一循序渐进过程分不开的。
本书开篇并没有直接就深入到C++语言的细节中去,而是用清晰的语言将面向对象程序设计方法的概念、思想和过程梳理了一遍。对于刚刚从面向过程程序设计转移过来的读者,无疑一次思想的洗礼。感觉上神神秘秘的“对象”,在Eckel笔下就是“变量”这么简单。在C++的世界里,对象就是用户自定义的变量。他具有属性和方法,也就是封装的数据和对数据的操作。C++语言从语言自身的属性上支持面向对象的程序设计。因此程序员在思考如何解决现实问题时,就不必再拘泥于机器细节的约束,而是通过面向对象的设计思想思考事物本身的特性以及事物与事物之间的关系。同时,C++语言秉承C语言对细节处理的强大而又方便灵活的功能,程序员能够较为容易的处理设计中的细微之处,以获取期望达到的性能。
读这本书,既能从中获取丰富的专业知识,又能从中享受到读书的乐趣。与一些就事论事、就语言论语言单调乏味的书籍不同,作者体贴的为读者澄清了许多程序设计中的疑难。无论其表面上看来是多么的微不足道。在第三章“C++中的C”,Eckel用简练的文字系统性的将C语言的主要概念梳理了一遍。在不失完备性的同时,深刻的挖掘了C语言的内容细节。我最为喜爱的部分是本章中关于C/C++复杂声明和定义的阐释。一句话,简直太漂亮了!从此阅读源代码中的复杂声明由痛苦就变成了充满成就感。
试问double (*(*(*fp3)())[10])() 定义的是什么??这是什么复杂的定义哟?谁遇上这样的定义都会感到费解的。我们来看看书中介绍方法——通过遵循编译器分析“定义”的法则:从变量名开始,先右后左,遇括号返回。
double ( * ( * ( * fp3 ) ( ) ) [10] ) ( )
变量名为fp3,向右探测遇括号返回,向左发现*,故fp3是指针;再向右发现一对空括号,遇右括号返回,向左发现*,该指针指向一个函数(函数无参数,返回指针);再向右发现[10],向左发现*,函数返回的指针指向一个10元素指针数组;再向右是(),向左是double,指针数组的指针指向一个无参数返回double类型数据的函数。
C风格的古怪定义不知难倒了多少C/C++语言学习者,即使是对C/C++很熟悉的程序员,面对如此晦涩语法也会觉得头大了一倍。看了Eckel的书,若是再遇上这样的问题,心里不知道会有多痛快。
在第四章“数据抽象”中Eckel没有直接去介绍C++抽象数据类型的概念,而是设计并实现了一个袖珍的C库(这在介绍C语言的书中也是很少见的)。对于尚不十分清楚C/C++语言头文件与库结构的读者来说,又是一次深入学习语言底层知识的好机会。很快,Eckel通过指出C风格库所掩盖的不足,并由之产生出对缺陷的改进方法。而随着改进的不断增加而日趋完善,这最终形成了C++。Eckel用最平实的语言,示出了C++语言根植于C的发展历程。原来C++语言就是这么产生的,就是在程序设计与工程实践的实际需要中一步一步发展起来的。
《C++编程思想》这本书,通篇都贯彻着这样的一种思想——C++是C语言的改进与延伸,它摒弃了C语言中特别容易引起混淆与错误的地方,并将C语言演变成为一种支持现代程序设计要素、结构优良的大型语言。(注:C语言本身并无重大的缺陷,C++之所以要对其进行拓展是在于其与C的设计理念不同。C语言讲求语言本身的精巧与简洁,并期望程序员自己清楚自己在做什么。)我认为本书能够取得如此的成功,其原因在于作者始终坚持以面向对象的思考方法,深入浅出的理顺了像C++这样大型的结构、功能和特性非常复杂的语言。尤其值得称道的是,作者并未因该书面对初学C++的读者而降低内容的深度。大量与底层联系紧密的概念、方法,Eckel都通过丰富的内容实例将其解释得非常清楚。
现在《C++编程思想》已是第二版了。面向对象与C++语言丰富的新知识不断地涌现已经很难再以一本书的页码来容纳。Eckel将C++语言中复杂晦涩但却又是非常重要的内容放到了本书的第二卷。这样,就可以有充足的空间去拓展作者想要表达的思想,而不必再往一本书里硬塞。虽然,更复杂的放到了第二卷,但正如我前面所阐述的,第一卷的内容并没有因此而显得空泛,作者丰富的技术与教学经验使之读来充满乐趣,而又能学到富有深度的知识。我想,无论是初学者,还是意图提高C++程序设计水平的程序员,《C++编程思想》一书无疑是一本学习C++的上佳之作,而且是一本充满乐趣与挑战的经典。
作为业界最风行的语言,C++的好书太多了,在此只好挂一漏万:
《C++程序设计语言》(特别版)Bjarne Stroustrup著 机械工业出版社
作为C++之父,其书亦成为业界的经典。不过要求读者意志坚强,Stroustrup写程序可比写书强。
《C++ Primer》(3RD) Stanley B.Lippman,Josee Lajoie 中国电力出版社
《Essential C++》Stanley B.lippman 华中科技大学出版社
《深度探索C++对象模型》Stanley B.lippman 华中科技大学出版社
当年与Stroustrup共同开发第一个C++编译器,现为微软VC.NET首席设计师的Lippman,书也写得挺不错,尤其是其技术背景特别强。《C++
Primer》内容非常全面,《Essential C++》则利于快速上手,但两书均有一定难度和深度。而《深度探索C++对象模型》一书难度极高。
《C++语言大全》 Herbert Schildt 电子工业出版社 读Schildt的书特别轻松,我也特别喜欢。Schildt的《C语言大全》据说直追Kernighan的《C程序设计语言》,简直不可思议。
《Effective C++中文版》2nd Edition Scott Meyers 华中科技大学出版社
C++编程规则的大师之作,在行内有非常大的影响力和号召力。
|