前段时间正好把很久前买的《Effective C++ 中文版 2nd Edition》看完,觉得挺不过瘾,而且第三版也出了很长时间了,比第二版多了5个Item,有点纠结会不会遗漏掉什么重要的东西,于是又买了一本第三版的英文+评注版,趁热打铁看第二遍,把一些存在疑惑和不解的代码也手写运行一下,增强理解用。
正如我之前Blog中提过,在看C++之前,先是看了两本C语言的书,也写了不少的C代码(比较遗憾的是,都是些实现算法的代码,不是操作系统相关的代码)。之前零零散散翻过《C++ Primer》,对C++的认识基本停留在类、继承和模板编程的表面认识上,没有用C++写过大规模的代码过,半懂不懂的看过侯捷老师的《STL源码剖析》了解了下工程级(或者说是教科书级别的模板编程和接口定义),但是在实践方面比较的欠缺,只是偶尔翻翻STL的Reference,选些合适的容器写过些代码。
说真的,我并不喜欢C++,因为它的范围太大了,正如本书Item 1所说的,View C++ as a federation of languages. 因为我之前也听到过别人评价他人的C++代码“代码写的不错,但是这是在用C++写C,而不是在写C++”,回想起来,我看过不少C++的代码也差不多如此。不过看了此书后,我不认为这个评价是一种批评,因为按照此书作者Meyers的观点,这也是C++语言联邦中的一个重要成员。确实,作者在Item1中把C++横向切割成以下四个成员:
- C++中的C语言
- 面向对象的C++
- 模板C++
- STL标准模板库
这有点像C++的编程规范,如果你要用C++的话,你要选择正确的方向或者说是C++中合适的部分去做正确的事。毫无疑问,支持你作出正确选择的前提是你必须对各个方向都很了解。
C++不是一门拿来就能用的语言,这和Java、Ruby很不一样,如果对C++的相关概念细节稍有遗漏,写代码的时候就会遇到各种问题;甚至,C++号称C with Class的同时,似乎也继承了不少C语言上的陷阱。如果有的选择的话,我应该是不会在工作中把C++作为首选语言的;但是,正因为C++如此的复杂,我认为非常有必要系统的学习这门语言,因为它几乎包含了常见语言的所有特性,当然,除了,函数式编程;甚至,TMP(Template Metaprogramming 模板元编程)中能够找到一些Lisp的影子了。除了上面提及的对C++横行切割,我认为纵向切割,至少也有三个方面
- 其一,内存级别的实现,包括像类的成员、vtbl的细节,类似《深度探索C++对象模型》中的内容。
- 其二,语言层次的细节,即语法层次上的,如《C++ Primer》一书,内容之多,如汗牛充栋
- 其三,实践和设计层次上的,如本书,相信阅读了Chapter4和Chapter6后会特别有感触。
好吧,上面甚至都还没完全包括设计模式上的内容,所以,C++真的是一门很难精通的语言。
回到读书笔记,Chapter 1的标题为“Accustoming Yourself to C++”,包括Item 1到Item 4四个部分。除了上面提及的Item 1是第三版新增的内容,其余都在第二版中能够找到,2、3两个Item强调了尽量不要使用#define这个C中的东西,以及尽量去使用const;Item 4强调了在使用一个对象前一定要先将其初始化。C++对象的初始化的细节也是相当繁多,经常还会涉及到成员初始化的顺序问题,而这自然而然就牵扯到了构造器的问题,也算是引起了Chapter 2的内容吧。此章诸多零散细节,不详表,下一章争取多写点内容。