# [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] 类库