如何学习 C++

学习 C++

什么是指导?

它是学习一项新技术的**最重要工具**。

面向对象和泛型思维是“耳濡目染”而不是“照本宣科”的。找一个**真正**懂行的人,和他多接触,试着进入他的思维,看他如何解决问题。倾听。通过模仿学习。

如果你在公司工作,让他们请一位能充当导师和指导的人。我们见过公司“省钱”只是给员工买一本书(“给,一本书;周末读完;周一你就成了 OO/泛型开发者”)而浪费了大量的钱。

我应该在学习 C++ 之前学习 C 吗?

没必要。

C 和 C++ 的共同子集比 C 更容易学习。需要手动捕获的类型错误更少(C++ 类型系统更严格,表达力更强),需要学习的技巧更少(C++ 允许你更直接地表达更多内容),并且有更好的库可用。最适合初学者学习的 C++ 子集不是“所有 C”。

学习 C++ 的**首选**书籍是 Stroustrup 的 A Tour of C++。赶紧去阅读并推荐这本核心概述。

如果你想要其他选择:请参阅 Stroustrup 的 Learning Standard C++ as a New Language,其中讨论了早期学习 C++ 构造、技术和库的选择。有关系统地采用这种方法的书籍示例,请参阅 Stroustrup 的 Programming: Principles and Practice using C++

如果你最终的目标是学习 C++,而你还不懂 C,那么阅读 C 书籍或参加 C 课程不仅会浪费你的时间,还会教你一堆你最终回到正轨学习 C++ 时需要明确“反学习”的东西(例如,malloc()printf()不必要地使用 switch 语句错误码异常处理不必要地使用 #define等)。

如果你想学习 C++,就学习 C++。花时间学习 C 会浪费你的时间并让你感到困惑。

在学习 C++ 之前,我应该学习 Objective-C 或其他 OO 语言吗?

没必要。

学习新事物几乎总是一个好主意。然而,每种语言都是不同的,有其自身的风格和怪癖。以某种据称“纯粹”的 OO 风格(包括所有怪癖)仿照其他语言编写的代码,当过于字面地转录到 C++ 中时,往往会次优且令人沮丧。此外,“**只**编写纯面向对象代码”并非 C++ 的理想;请参阅 Stroustrup 的 OOPSLA 主题演讲 Why C++ isn’t just an Object-Oriented Programming Language。如果你想成为一名优秀的 C++ 程序员,并且没有几个月的时间可以浪费,请专注于 C++ 及其所体现的概念。

如果你最终目标是学习 C++,而你还不了解 Objective-C,那么阅读 Objective-C 书籍或参加 Objective-C 课程不仅会浪费你的时间,还会教你一堆当你最终回到正轨学习 C++ 时需要明确“反学习”的东西(例如,动态类型非子类型继承错误码异常处理等)。

了解“纯”OO 语言并不能让向 OO/C++ 的过渡变得更容易。这并非理论;我们确实培训和指导了数千名软件专业人员学习 OO。事实上,Objective-C 经验对某些人来说反而会**更难**:他们需要**反学习**一些关于类型和继承的相当深刻的概念,此外还需要学习新的语法和惯用法。这种反学习过程对于那些对 Objective-C 抱有宗教般狂热(“C++ 不像 Objective-C,因此 C++ 是邪恶的”)的人来说尤其痛苦和缓慢。

如果你想学习 C++,就学习 C++。花时间学习 Objective-C 会浪费你的时间并让你感到困惑。

我如何开始学习 C++?

快速回答:阅读 Stroustrup 的 A Tour of C++

当然,这很大程度上取决于你已有的知识以及学习 C++ 的原因。如果你是编程新手,我们强烈建议你找一位经验丰富的程序员来帮助你。否则,对语言概念不可避免的错误以及实际实现中的问题可能会放大为严重的挫折。

你需要一本学习 C++ 的教科书。即使你的实现带有丰富的在线文档,也是如此。原因是语言和库文档以及示例代码并不是好的概念教师。通常,这些资料对事物为何如此以及你可以从某种技术中获得哪些好处(以及不应期待哪些)保持沉默。专注于概念和技术,而不是语言技术细节。

选择书籍时,寻找一本从一开始就以整合方式介绍标准 C++ 并使用标准库功能的书籍。例如,从输入读取字符串应该像这样

string s;   // Standard C++ style
cin >> s;

而不是这样

char s[MAX];    /* Standard C style */
scanf("%s",s);

寻求有扎实 C++ 经验的程序员的书籍推荐。

对于即使是从未编程过的人也适合的温和入门,一本很棒的书是 Programming: Principles and Practice using C++,但请记住 没有一本书是适合所有人的最佳书籍。看看 ACCU(C 和 C++ 用户协会)网站上的书评

旨在编写惯用的 C++:避免简单地用 C++ 语法编写你以前语言风格的代码。仅仅改变语法并不能带来多少好处。

哪本是学习 C++ 的最佳书籍?

另请参阅为什么要买好几本书

如果你是编程新手(从未编程过),请考虑 Programming: Principles and Practice using C++。这是 Bjarne Stroustrup 为一年级大学生编程课编写的书,并从三年的课堂使用中受益。

否则,学习 C++ 的**首选**书籍是 Stroustrup 的 A Tour of C++。赶紧去阅读并推荐这本核心概述。

如果您需要其他选择:请参阅 Stroustrup 的 Learning Standard C++ as a New Language,其中讨论了早期学习 C++ 结构、技术和库的选择。对于系统地采用这种方法的书籍示例,请参阅 Stroustrup 的 Programming: Principles and Practice using C++ 和 Koenig & Moo 的《加速 C++》(由 Addison Wesley 出版,属于 C++ In Depth 系列)。

当寻找第二本或第三本书时,这取决于你寻找什么以及你的学习风格。有很多优秀的 C++ 书籍。请查看 ACCU(C 和 C++ 用户协会)网站。这是经验丰富的程序员推荐书籍的最佳网站之一,他们不惧怕表达自己的观点(书商往往会给出美好的评价,而“这本书太完美了,我爱它,我已经读了差不多三章,迫不及待想读更多”之类的评论则毫无用处——我真不知道为什么有人会听取一个完全缺乏 C++ 经验的人关于如何学习 C++ 的建议)。ACCU 根据所需的经验水平和整体质量对书籍进行评级。

对于程序员并且愿意从经典教材中学习新概念和技术的人,我们推荐 The C++ Programming Language (第4版)。请参阅 关于“The C++ Programming Language (第3版)”结构、内容和目标的说明:本书面向有一定经验并希望精通 C++ 的程序员。它不面向试图学习第一门编程语言的非程序员,也不面向试图尽快获得 C++ 肤浅理解的休闲程序员。因此,本书侧重于概念和技术,并尽力做到完整和精确。它描述了“纯 C++”,即独立于任何特定软件开发环境或基础库(当然,除了标准库)的语言。

如果你想知道 C++ 为何如此,请参阅 The Design and Evolution of C++ (D&E)。理解设计标准和约束有助于编写更好的程序。

我应该买一本书,还是几本书?

至少三本。

使用 C++ 进行面向对象编程,有三个类别的洞察力和知识。你应该从每个类别中选择一本好书,而不是一本试图面面俱到的平庸书籍。这三个面向对象/C++ 编程类别是:

合法性指南以大致相同的重点描述所有语言特性;道德指南侧重于你在典型编程任务中最常使用的语言特性。合法性指南告诉你如何让给定特性通过编译器;道德指南告诉你是否应该首先使用该特性。

元评论

  • 不要在这些类别之间进行权衡。你不应该偏袒一个类别而反对另一个类别。它们相辅相成。
  • “合法性”和“道德”这两个类别都是必需的。你**必须**很好地掌握**可以**做什么和**应该**做什么。

除了这些(强调“此外”),你还应该考虑至少阅读另外两个类别的各一本图书:至少一本关于OO 设计的图书,以及至少一本关于编码标准的图书。设计书籍为你提供了用对象进行更高层次思考的想法和指导,而编码标准书籍则在你的组织中建立了最佳实践,并有助于确保每个人都能阅读彼此的代码(例如,这样你就可以在一个团队落后时调动人员)。

有哪些优秀的 C++ *道德*指南?

以下是一些主观且精选的必读 C++ 道德指南简短列表,按作者字母顺序排列:

  • Cline、Lomow 和 Girou,《C++ FAQs,第二版》,587 页,Addison-Wesley,1999 年,ISBN 0-201-30983-1。以 FAQ 问答形式涵盖约 500 个主题。
  • Meyers,《Effective C++,第三版》,320 页,Addison-Wesley,2005 年,ISBN 0321334876。以短文形式涵盖 55 个主题。也涵盖 C++98。
  • Meyers,《Effective Modern C++》,336 页,O’Reilly Media,2014 年,ISBN 1491903996。以短文形式涵盖 42 个主题。C++14。
  • Meyers,《More Effective C++》,336 页,Addison-Wesley,1996 年,ISBN 0-201-63371-X。以短文形式涵盖 35 个主题。也涵盖 C++98。

*相似之处:* 所有三本书都大量配有代码示例。所有三本书都是优秀、深刻、有用、一流的书籍。所有三本书都有出色的销售记录。其中,只有《Effective Modern C++》涵盖 C++11 和 C++14。其他书籍涵盖 C++98。

*差异:* Cline/Lomow/Girou 的示例是完整的、可运行的程序,而不是代码片段或独立类。Meyers 包含许多线条图,以说明要点。

有哪些优秀的 C++ *合法性*指南?

一如既往,学习 C++ 的**首选**书籍是 Stroustrup 的 A Tour of C++。它让你“在 250 页内了解现代 C++”。

除此之外,以下是一些主观且精选的必读 C++ 合法性指南简短列表,按作者字母顺序排列:

  • Lippman、Lajoie 和 Moo,《C++ Primer,第五版》,976 页,Addison-Wesley,2012 年,ISBN 978-0321714114。非常易读/易懂,涵盖 C++11。
  • Stroustrup,《The C++ Programming Language,第四版》,1368 页,Addison-Wesley,2013 年,ISBN 978-0321563842。内容非常广泛,是 C++11 的权威参考。

两本书都是对几乎所有语言特性的优秀概述。它们都是一流、顶尖、出色的书籍。两本书都有出色的销售记录。

有哪些优秀的 C++ *编程示例*指南?

以下是一些主观且精选的必读 C++ 编程示例指南。

接下来的两本书是 C++98 时代的书籍,所以它们不涵盖 C++11 和 C++20 中的新特性,但代码仍然有效(C++ 有很好的向后兼容性),而且技术实用甚至巧妙。

  • Koenig 和 Moo,《加速 C++》,336 页,Addison-Wesley,2000 年,ISBN 0-201-70353-X。大量使用标准 C++ 库的示例。真是一本通过示例编程的书。
  • Musser 和 Saini,《STL 教程和参考指南,第二版》,Addison-Wesley,2001 年,ISBN 0-201-037923-6。大量示例展示如何使用标准 C++ 库的 STL 部分,以及大量细节。

还有其他与 C++ 相关的书籍吗?

是的!很多!

上面列出的道德合法性示例类别是针对**编程**的。分析和设计领域也相关,并且有它们自己的优秀书籍。

这些其他领域有大量的优秀书籍。关于设计模式的开创性书籍(以我个人主观且有选择的观点)是一本必读之书:Gamma 等人,《设计模式》,395 页,Addison-Wesley,1995 年,ISBN 0-201-63361-2。描述了在良好设计中经常出现的“模式”。如果你打算从事 OO 和泛型设计工作,你**必须**阅读这本书。

这里有人会帮我做作业吗?

不。抱歉。我们不代做(别人的)作业。我们收到的作业帮助和学生程序调试请求太多,以至于没有时间。无论如何,让远方的专家修复你的程序并不是最好的学习方式。试着找一个有 C++ 经验的本地人,你可以向他寻求指导。一个好的导师是学生能得到的最好帮助;也许这就是他们不容易找到的原因。

另外,不,我们不会建议“一个适合学生做的项目”。我们的经验是,要充分了解一个学生和TA的课程,以了解所需的难度水平和感兴趣的项目类型,这需要时间。然后,构思一个好的项目并非易事,并且确切地解释项目是什么以及如何着手可能需要多条信息和数小时。我们只是没有那种时间。请记住,这些请求至少每周都会来。最后,一些学生似乎认为,如果我们建议一个项目,我们就有道义上的义务在项目完成过程中提供相当详细的帮助。

想法:看看 TC++PL4 或其他优秀教科书中的练习。其中许多练习旨在让学生忙上好几天,阅读这些练习可以激发有进取心的学生做一些类似的事情。或者看看你世界中非计算机科学的部分:也许一个生物学项目需要支持一个新的测量设备,或者一个学习历史的朋友可以使用一个改进的数据库界面。许多最好的项目和计算机的最佳用途都超出了传统的计算机科学!

另请参阅 Stroustrup 的 C++ 风格和技术常见问题解答。初次接触“读取一些数据,对其做些什么,然后生成一些输出”练习的真正新手可能对 一个非常简单的程序一个从输入读取字符串的程序 感兴趣。

我在哪里可以获得免费的 C++ 编译器?

从许多地方;请参阅 isocpp.org 的“入门”页面