C++ 语言概述
C++ 是在 C 语言基础上开发的一种集面向对象编程、泛型编程和过程化编程于一体的编程语言,是 C 语言的超集。它融合了三种不同的编程方式:C 语言代表的过程性语言、类代表的面向对象语言以及模板支持的泛型编程。
入门与基础
对于初学者,选择合适的教材至关重要。以下是几本经过时间检验的经典书籍:
《C++ Primer Plus(第 6 版)中文版》
这本书分 18 章,详细阐述了 C++ 的基本概念和技术,包括程序运行方式、基本数据类型、函数重载、内存模型、类的设计、多态、虚函数、动态内存分配、继承、异常处理、STL 以及输入输出等。书中专辟一章介绍了 C++11 新增的功能。
该书针对 C++ 初学者,从 C 语言基础知识开始介绍,然后在此基础上详细阐述 C++ 新增的特性,因此不要求读者有 C 语言方面的背景知识。它既可作为高等院校教授 C++ 课程的教材,也适合初学者自学使用。与之配套的《C++ Primer Plus 第 6 版 中文版习题解答》也是提升编程能力的优选练习册。
《C++程序设计(第 3 版)》
本书是以 C++ 编程语言来讲解计算基础知识和技能的实用教程,是作者数十年教学经验凝结的成果。书中深入浅出地介绍对象和类的概念,帮助学生更好地学习计算机科学课程,并为后续课程的学习打下坚实的基础。每一章都给出了自测题、练习题、编程技巧及编程项目等内容,附录部分提供了所有自测题的解答。
进阶与深入
当掌握基础后,需要阅读更深入的著作来提升技术能力:
《C++沉思录》
这是 C++ 业界资深技术大神、标准委员会成员的经典著作,全球畅销 20 余年。融聚了作者 10 多年 C++ 程序生涯的真知灼见,由 C++ 之父 Bjarne Stroustrup 倾力推荐。
全书分为 6 篇共 32 章,对 C++ 语言的历史和特点、类和继承、STL 与泛型编程、库的设计等几大技术话题进行了详细而深入的讨论。细微之处几乎涵盖了 C++ 所有的设计思想和技术细节,通过精心挑选的实例传达先进的程序设计方法和理念。适合有一定经验的 C++ 程序员阅读学习。
《C++语言的设计和演化》
这是 C++ 之父 Bjarne Stroustrup 关于 C++ 语言的最主要著作之一。在这本书中,作者全面论述了 C++ 的历史和发展,各种重要机制的本质、意义和设计背景。本书在帮助人们深入理解 C++ 语言方面的地位无可替代,值得每个关心、学习和使用 C++ 的专业工作者、科研人员、教师和学生阅读。
《C++并发编程实战》
这是一本基于 C++11 新标准的并发和多线程编程深度指南。内容包括从 std::thread、std::mutex、std::future 和 std::async 等基础类的使用,到内存模型和原子操作、基于锁和锁数据结构的构建,再扩展到并行算法、线程管理,最后还介绍了多线程代码的测试工作。附录部分还提供了 C++11 线程库的完整参考。
学习路径建议
是否先学 C?
我对 C 或 C++ 都不了解,是不是应该先学习 C?我的建议是:不,首先学习 C++。
C++ 的 C 子集对于新手来说比较容易学,又比 C 本身容易使用。原因是 C++(通过强类型检查)提供了比 C 更好的保证。进一步说,C++ 还提供许多小特征,例如运算符 new,与 C 语言对应的东西相比,它们的写法更方便,也更不容易出错。
如果你计划学习 C 和 C++(而不只是 C++),你不应该经由 C 那条迂回的路径。为能很好地使用 C,你需要知道许多窍门和技术,这些东西在 C++ 里的任何地方都不像它们在 C 里那么重要、那么常用。好的 C++ 教科书则强调能引导你去做数据抽象、面向对象的程序设计的技术和特征。理解了 C++ 的各种结构,而后学习它们在(更低级的)C 里替代物将会很简单。
是否先学 Smalltalk?
我想做 OOP,那么,是不是应该在学习 C++ 之前先学 Smalltalk?不。如果你计划用 C++,那就学 C++。
各种语言,像 C++、Smalltalk、Simula、CLOS 和 Eiffel 等,各有自己对于抽象和继承等关键概念的观点。学习 Smalltalk 当然能教给你许多有价值的东西,但它不能教给你如何在 C++ 里写程序。除非你有充分时间学习和消化 Smalltalk 以及 C++ 的概念和技术,否则用 Smalltalk 作为学习工具将导致拙劣的 C++ 设计。
模仿性地追随 Smalltalk 风格,将会在 C++ 里产生低效、丑陋,而且难以维护的 C++ 程序。个中理由很简单,好的 C++ 程序所需要的设计应该能很好地借助 C++ 静态类型系统的优势,而不是与之斗争。Smalltalk 只支持动态类型系统,把这种观点翻译到 C++ 将导致广泛的不安全性和难看的强制转换。

