# [28] 學習OO/C++
## FAQs in section [28]:
* [28.1] 什么是師徒指導?
* [28.2] 在學習OO/C++之前我應該先學C嗎?
* [28.3] 在學習OO/C++之前我應該先學Smalltalk嗎?
* [28.4] 我只買一本書就夠了么?還是需要買幾本?
* [28.5] 有哪些講合理使用C++的好書?
* [28.6] 有哪些講合法使用C++的好書?
* [28.7] 有哪些通過例子講解C++編程的好書?
* [28.8] 還有哪些與OO/C++相關的講OO的書?
## 28.1 什么是師徒指導?
這是學習OO最有效的辦法。
用面向對象的思考方式經過努力學來的,不是光靠老師教就可以的。跟那些_真正_知道自己在說些什么的人混熟,研究他們的思考方法,觀察他們是如何解決問題的。傾聽他們的言論。通過模仿來學習。
如果你在一家公司工作,那么讓公司為你派一個指導者。我們見過有公司浪費了很多錢,這些公司希望能夠“省錢”,于是就僅僅為雇員買幾本書(“書放在這里了,周末讀一遍;到禮拜一,你就學會OO了”)。
## 28.2 在學習OO/C++之前我應該先學C嗎?
不用費那個勁。
如果你最終的目標是學習OO/C++并且還不會C,那么讀有關C的書籍和參加學習C的課程只會浪費你的時間,而且還會教你一堆在你以后學OO/C++時要忘掉的東西(例如malloc(), 不必要的switch語句,等等)。
如果你想學OO/C++,那就直接學這個。另外花時間學C只會浪費你的時間,還會迷惑你。
## 28.3 在學習OO/C++之前我應該先學Smalltalk嗎?
不用費那個勁。
如果你最終的目標是學習OO/C++并且還不會Smalltalk,那么讀有關Smalltalk的書籍和參加學習Smalltalk的課程只會浪費你的時間,而且還會教你一堆在你以后學OO/C++時要忘掉的東西(例如[動態類型](http://www.sunistudio.com/cppfaq/smalltalk#[30.3]),[非子類化的繼承(non-subtyping inheritance)](http://www.sunistudio.com/cppfaq/smalltalk#[30.5]),[用錯誤碼處理異常](http://www.sunistudio.com/cppfaq/exceptions.html),等等)。
如果你想學OO/C++,那就直接學這個。另外花時間學Smalltalk只會浪費你的時間,還會迷惑你。
注意:我是ANSI C++(X3J16)標準委員會的成員。我不是什么語言的死忠。我沒說C++和Smalltalk哪個好哪個壞。我只是說它們是不同的語言。
## 28.4 我只買一本書就夠了么?還是需要買幾本?
至少3本。
在用C++進行OO編程的領域里,有3類知識需要學習。應該在每一類里都買一本好書,而不應買一本還湊活的書。這3類包括:
* [合法C++的指南——在C++里哪些能做,哪些不能做。](http://www.sunistudio.com/cppfaq/how-to-learn-cpp#[28.6])
* [合理C++的指南——在C++里哪些應該做,哪些不應該做。](http://www.sunistudio.com/cppfaq/how-to-learn-cpp#[28.5])
* [通過例子講解編程的指南——演示很多例子,這通常會大量使用C++標準庫](http://www.sunistudio.com/cppfaq/how-to-learn-cpp#[28.7])
合法性指南會按一種平等的方式講解所有的語言特性。合理性指南專注于那些在通常的編程任務中你應該使用的方法。合法性指南教會你如何讓程序通過編譯器的檢查。合理性指南則指導你何時使用或放棄一項語言特性。
注
* 不要在這幾個類別之間權衡。不應重視只一個而忽略其它。它們要配合起來才有用。
* “合法性”與“合理性”都是必要的。你_應該_把它們都掌握好。
除了這些(強調“附加事項”),你應該考慮在其它兩個領域內至少各買一本書:至少一本有關[OO設計](http://www.sunistudio.com/cppfaq/how-to-learn-cpp#[28.8])的和至少一本[編碼標準](http://www.sunistudio.com/cppfaq/coding-standards#[27.1])的。講設計的書訓練你在更高層次上用對象來思考問題,編碼標準則可以為你所在的機構推廣最佳實踐,還能幫助人們容易讀懂別人寫的代碼(例如如果某個團隊落后了,你可以調人上去。)
## 28.5 有哪些講合理使用C++的好書?
這里有些我個人(經過仔細篩選的)認為必讀的書,按作者姓名的字母順序排列:
* Cline, Lomow, and Girou, C++ FAQs, Second Edition, 587 pgs, Addison-Wesley, 1999, ISBN 0-201-30983-1\. 以類似FAQ一問一答的形式覆蓋了大約500個方面的話題。
* Meyers, Effective C++, Second Edition, 224 pgs, Addison-Wesley, 1998, ISBN 0-201-92488-9\. 以短文的形式探討了50個話題。
* Meyers, More Effective C++, 336 pgs, Addison-Wesley, 1996, ISBN 0-201-63371-X. 以短文的形式探討了35個話題。
_相似點:_這幾本書都給出了很多代碼示例。都是非常優秀、有見地、有用的好書。都有很好的銷量。
_不同點:_Cline/Lomow/Girou書中的示例都是完整可運行的,不是代碼片段或單獨的類。Meyers的書用了很多圖例來說明問題。
## 28.6 有哪些講合法使用C++的好書?
這里有些我個人(經過仔細篩選的)認為必讀的書,按作者姓名的字母順序排列:
* Lippman, Lajoie and Moo, C++ Primer, Fourth Edition, 885 pgs, Addison-Wesley, 2005, ISBN 0-201-72184-1\. 可讀性很好
* Stroustrup, The C++ Programming Language, Third Edition, 911 pgs, Addison-Wesley, 1998, ISBN 0-201-88954-4\. 包含了很多內容
_相似點:_這兩本書都很好地概括了幾乎所有的語言特性。我在連續兩期C++ Report上分別評論了這兩本書。我評論說這兩者都是頂尖的好書。都有很好的銷量。
_不同點:_如果你不懂C,那么Lippman等人的書比較適合。如果你了解C并且向快速了解很多東西,Stroustrup的書更合適。
## 28.7 有哪些通過例子講解C++編程的好書?
這里有些我個人(經過仔細篩選的)認為必讀的書,按作者姓名的字母順序排列:
* Koenig and Moo, Accelerated C++, 336 pgs, Addison-Wesley, 2000, ISBN 0-201-70353-X. 很多使用C++標準庫的例子。真正是一本通過例子講解編程的書
* Musser and Saini, STL Tutorial and Reference Guide, Second Edition, Addison-Wesley, 2001, ISBN 0-201-037923-6\. 用很多例子說明如何使用C++標準庫的STL部分,還有很多基本的小細節。
## 28.8 還有哪些與OO/C++相關的講OO的書?
有的!很多!
上面列出的合理性、合法性和例子講解的幾類書都是和OO編程相關的。在有關OO分析與設計的領域中,也有很多好書。
在這些領域中有大量的好書。我個人(經過深思熟慮)認為,在OO設計模式方面最重要的必讀書是:Gamma et al., Design Patterns, 395 pgs, Addison-Wesley, 1995, ISBN 0-201-63361-2\. 此書描述了在好的OO設計中常會出現的“模式”。如果你準備做OO設計工作,那就_一定_要讀這本書。
- C++ FAQ Lite
- [1] 復制許可
- [2] 在線站點分發本文檔
- [3] C++-FAQ-Book 與 C++-FAQ-Lite
- [6] 綜述
- [7] 類和對象
- [8] 引用
- [9] 內聯函數
- [10] 構造函數
- [11] 析構函數
- [12] 賦值算符
- [13] 運算符重載
- [14] 友元
- [15] 通過 <iostream> 和 <cstdio>輸入/輸出
- [16] 自由存儲(Freestore)管理
- [17] 異常和錯誤處理
- [18] const正確性
- [19] 繼承 — 基礎
- [20] 繼承 — 虛函數
- [21] 繼承 — 適當的繼承和可置換性
- [22] 繼承 — 抽象基類(ABCs)
- [23] 繼承 — 你所不知道的
- [24] 繼承 — 私有繼承和保護繼承
- [27] 編碼規范
- [28] 學習OO/C++
- [31] 引用與值的語義
- [32] 如何混合C和C++編程
- [33] 成員函數指針
- [35] 模板 ?
- [36] 序列化與反序列化
- [37] 類庫