第一篇 0 h! E* B0 s" n$ r% F5 X3 n 7 T2 M% F9 q; G N1 f一些同学问我,如何学好C++,我没有别的办法给你们,唯一的办法就是读书,读大 3 A: ?$ U- \1 V' c" C* D量的书,就可以解决。要把C++作为日常语言,而不是一种程序语言,这样就好办了。4 k" ~4 o' p7 D# ~5 }( y
/ i' a( `4 |7 n5 {有人又要问我,那么我应该读什么书才好?没有时间怎么办? n# f/ D' ?& X O: ~; I f$ v( ]: g1 a% B9 i" u4 U* F我只能对你们说,没时间的话,就别学C++了,做你们喜欢做的事。生活中没有" O v& m+ e# s& Z3 ?
C++,也同样美好。 ; ~% ]. i! y- `0 G3 B% b! U \ A; E
如果你准备学,一定要学好,那么我开个书单,应该问题不是甚大。/ G3 M$ |9 H$ h- d+ s
$ [# [: G& B3 f: ?4 N; G首先肯定要读一读Bjarne Stroustrup的The Design and Evolution of C++,了解2 F J/ }5 n& k, g" u5 k3 I( M
一下这个语言的历史。接下来就可以看别的书了,但要不停地回头看这本书,看到 & Y. l% U+ v& a9 ^你不断地学到的新技术是怎么样一点点地被接纳到这个语言中去的。# w! u2 O9 J! A i+ v
2 j; M2 A( V3 H O3 R% b$ n第一本书因人而异,基础好一些的,可以看Stanley B. Lippman的C++ Primer,这 / V2 o1 g6 _2 L' t# `: w" P1 X本书非常地巨大,你打星号的部分可以不要看。基础不太好的,可以看Stanley B.' v8 q6 i, b4 ]# z6 w
Lippman的Essential C++,这本书份量要轻得多,不过四个C++的范型都讲了,而0 e. i) @" \5 e" W, N( b
且讲得非常清楚。 - {$ m1 x; Z: r" X5 y! |+ K( g3 _; l2 z* h* p' M; ^4 H8 `" R
第二本应该停止技术层面的东西,静下心来看看Pike和Kernighan的The Practice, Z& q8 q# U' a5 H2 ~# b
of Programming,好好地整理一下,在程序设计中应该有哪些注意的事项。这本/ {' p; A1 I8 j0 U! F1 B
非常薄的booklet,可以说是程序员必读的指南。) \9 G4 o n+ p" x1 Q
; j1 _5 j/ Y- `7 e' N
第三本书,就应该是Bruce Eckel写的、候捷译的Thinking in C++,这本书每过! ^) G4 \3 {4 M7 z" p, B
半年我就要重读一遍。可以说每一章都是写得发人深省的,这本书让我感觉到了 8 l% \) Y/ {/ s: e8 H2 Z技术运用的非常高的境界,但是语言非常平实,只要认真地读,即使基础不行,0 X' s( H- f5 Z
也一定可以懂。我在教课的时候,就是用这本书(面对的学生是零基础)。 - ?$ ~0 W4 ?( Z7 j% j* W3 U; | % q7 _/ g+ n! q要更上一层的话,就要慢一步,先要把握C++设计习惯的良好。这是Scott 9 U1 e7 K1 t, k& ~+ `Meyers的Effective C++和More Effective C++带给我们的无尽收益。我More 2 p; \. a8 a; y7 o- _2 r/ c$ VEffective C++买不起,只好花了10块钱复印装订了一本"线装本",看起来像葵花8 F# w: U0 R0 D& M# Z; Z0 b
宝典(;-))。这两本书是真正的经典,作者对C++的纯熟,使得语言的风格读起来 ) {- [7 G) ^$ E, i+ R/ z$ l; J简直是如饴甘甜,就像他站在对面在讲课。我手中有这两本书的原版CD,如果有兴/ b" Y7 c; x8 J8 E! F1 E+ `$ p
趣,可以发E-mail到sjtu@263.net或在饮水思源投条儿给gaobo索要,只要您提供 5 o% y' E8 A1 {* I+ l; }2 S* s光盘我就给免费烧。如果你已经深刻地理解了Effective C++和More Effective % X; O2 z* B! P$ J& NC++,那你可以发现,你在众人中已经是鸡群之鹤。可以指导项目运作了,可以编% W8 f% r0 I; `: ]" T5 y
写一切你想做的程序了,可以指出别人看起来不错的代码的大小问题了。如果你能& O/ V1 [9 z' D! ^8 M0 `
一眼看出有人的代码是对应于"条款27"或"条款M6",那你可真是让本人刮目了。 # U' h7 T( a6 [ |1 C( k" ?: P1 W) ^- t0 w5 ^4 V( w
我已经讲了,如果要写程序,EC++和MEC++的境界已经足以使你自如应付,可是如: p2 s* d& ^: P9 H1 w- B" i: N
果你还不满足,想关注一些理论层面的问题,或是想看看实现的代码,你就不应该/ |% g1 N6 L6 h" v R7 }' |4 y
错过这几本好极了的书。我是说Herb Sutter的Exceptional C++和More ' c6 R4 B+ n9 {' HExceptional C++,这两本书的难度是非常大的,我对每一条的阅读笔记都是十多 5 ]) q/ W. H' Z5 g页。特别是泛型程序设计的部分,这两本书旁征博引,极尽深入探讨之能事,每每 + I# L5 {4 s5 r: K" c$ g2 e! t看懂一条,都抹汗一次,大感酣畅淋漓;还有侯捷的 STL源码剖析 ,以实际的" w' ?0 K$ R, M; C! O
例子一点点地讲解一个STL是怎么样实现的,我是刚开始读,不发表评论;而# n6 i7 _4 j' D0 L/ C
Stanley B. Lippman,Cfront的实现者之一,执笔写出Inside the C++ Object7 R/ s! }/ |4 H% g
Model,我只有一个字,就是基本帅呆了。我从中了解了无数的编译器解释源代码2 X& }& @' o: w, O$ D- ]
的细节,以及记忆体分配的细节,呵呵,这些都知道了,我还怕什么呢?最近得到 0 _6 [/ g- T' x# F, s- H了另一Cfront实现者、C++标准委员会Koenig的 C++沉思录,看起来非常不错,这2 A, V# ]& a' f4 J b8 R
里也推荐给大家,但我也没看完,亦无发言权。 . b; z) I* R2 ]* w+ S
4 T+ o- x) ?9 d9 v# a3 O8 ^最后最后,你们,未来的C++理论家们,可要记住,Bjarne Stroustrup的The C++ . i8 y" k0 S1 H5 w' u+ h s
Programming Language无论如何也应该读个四五遍!这是一切C++的书本的源泉。 t( h3 x- N; \8 q- a如果还觉得不够,就向C++标准委员会订购一本C++标准。 ! V! n5 u+ E5 [! c5 T( M/ r: F" o Y+ F0 y3 b" E
一切中国大陆作者的书,一概不要看(包括我的)。一切VC++或讲特定的编译器的3 C' }4 h+ Y( E5 |
书,一概不要看。如果需要补C语言的课,买一本非常小的K&R的The C" m: K% b) _, s" Q2 Y/ X# d
Programming Language足矣,其它的书一概不要看。不要先学C,再学C++,而要直 / K! E; |7 N- C接学C++。你不是先学古文,再学白话的,对不对?所以相信我,直接来更容易。 + _5 T# |- F' n# _; Y# C$ |1 ~9 c& D' P" t1 G( L/ G' f+ b
以上文字,皆为原创,本人愿意为每个字负责。 / ^. g* C9 a2 b: x3 m9 y {, s+ R . Z p+ ?7 a7 n. q- X4 k第二篇 : y9 X5 X( ~% m! P" n; A8 l( Q2 t. l; v. U8 q9 Z
好久未来C板了,原因这段时间一直在研究两本书,看得自己不敢多说一句话。0 M8 r; ~1 D* A# H! f/ x
' P } W" r4 Y% Y, Q
1、《Effective STL》8 u! c7 t0 F: c7 z; k3 A6 F+ h
订购:http://www.cnforyou.com/query/bookdetail.asp?viBookCode=8537 . p+ y2 H6 I0 V作者:Scott Meyers# Q; j0 _$ R$ h0 z0 W2 y# L
出版社:中国电力出版社4 c* |( X! h# P R& q* l9 p
一开始欺负这本书比较薄,想快点看完,但不久就发现自己已经翻不动了。直" G+ X: P. f, Q1 o! j$ j
到看完最后一个字,才发现一个基本的事实:薄的不是这本书,而是自己的见识。 . V1 Q# }/ U* n) B9 F 有关STL的书也读了不少,正如读《Effective C++》以前,有关C++的书也读了! Y! n: G( l' D$ Q& f
不少。Meyers的书总是给人一种脱胎换骨的提升感觉,他总能在大家以为老生常谈, D5 O( ?7 e# v! \& d
的地方挖出意想不到的新意,并指出一些一般人习以为常的东西其实存在种种危机, 3 f3 `8 K; y, V5 s: v3 u; o8 M+ n! |或是在一些看来完全等价的选择中,为特定的场合选择最有效的(Most + n! i i/ k* D% H, HEffective)那一种。而且他的切入口总是让人看得懂的(不像Stroustrup的书, ) Y! }7 O% g7 G" C) C X第一句话就要琢磨半天),但是他总是会选择几个拓展点,并把它们分析得淋漓尽0 V, O, P: p9 B/ ^
致,这时候就需要一段代码一段代码甚至是语句粒度地阅读了——当然,最后总是 ' w/ e0 n- I" x看得懂,这和读者的阅读程度总是正比,这会给人极大的成就感。可以说,在STL 5 Y& L# k. v. O4 |) E实践的书籍,无书可出其右(当然在STL实作方面,我还是要向大家推荐侯捷的4 |9 u) ^ K( E/ V ^6 ?
《STL源码剖析》)。9 {( g" m7 L# a- |- i x
读完这本书后,和Pascal就产生明显的距离感了。这里我仍然要说:请热爱 % u& s0 [4 L( J' Y, X! UDelphi!我还是更愿意写“var s:set of char;”而不是 3 r0 y0 c* s7 w2 T3 \ U“set <char*, less<char*>, allocator<char*> > s”,;-)。 $ ]! }6 p+ X8 U, }" e+ x% w& V. V3 r! ]8 Y+ v' G# t( k' `% Z9 s2 ^
2、《Modern C++ Design》 / f% N$ b( Z* C5 S3 T订购(中文):http://www.cnforyou.com/query/bookdetail.asp?viBookCode=8184 & w+ l& q" T6 ^* D/ g订购(影印):http://www.cnforyou.com/query/bookdetail.asp?viBookCode=8319 ( Z1 _4 x6 z1 E; H% E5 _3 ?) Q作者:Andrei Alexandrescu. y+ m4 h# u8 l9 ]; r' l( u7 ^% ?
译者:侯捷、於春景' T& Z6 A( o4 }5 x, M
出版社:华中科技大学出版社(中文). n- }" T6 u& F, x0 [7 ]" ?5 n
中国电力出版社(影印)6 P G. T9 U8 G( _& d* D
读完这本书的第一页,我就知道自己放不下它了,但我也知道,我的苦难经历 1 h6 b Q- H* Q8 N8 Z& r# n又要多上一笔了。用C++实作设计模式,已经是骨灰级的难度,但这本书明显还在讲 & S6 j# L; a& R- A4 i1 e% v! e- M一个template的对象模型的问题,这在我读《Inside the C++ Object Model》时是 ' U4 \0 N! `: L7 r' |) }屡攻不下的难点。不过,出乎意料的是这本书居然使我具有一些概念了,而且动手写! @; _4 @- J. n3 B$ L' W& G9 q
出了一个SmartPointer。, n% ^% e# a* W0 z( @8 m
这本书我还远不能说我读懂了,但是确乎是读完了。如果你还没有读过对象模型 7 c. L. ~( @+ r% j2 }( E U+ l和设计模式的书,我认为需要读一读。否则,直接看这本书根本就是受罪。最近,有( a) h! A- _4 w
一些朋友也注意到设计模式的重要性了,可能从明年起我在《电脑报》上要发表一些/ m- b3 [ B, `. j/ Y b
文章,届时请朋友们指教吧。8 d5 U* R( \9 |
* w6 S. F8 k4 Y0 N o3 w4 k! X* x5 y) o另外就是Effective C++点评继续写,我现在觉得更惶恐,但是信心也更足了。