系统学习C++语言的全面指南

发表时间: 2022-06-15 16:53

hello,大家好,我是 Jackpop,硕士毕业于哈尔滨工业大学,曾在华为、阿里等大厂工作,如果你对升学、就业、技术提升等有疑惑,不妨交个朋友:

我是Jackpop,我们交个朋友吧!

C++是一种通用的、面向对象的编程语言,可用于开发操作系统、游戏、图形用户界面、后端以及高性能系统和应用程序。

所以,尽管Python、Go这些后起之秀近几年热度非常高,但是在很多领域还是无法撼动C++的地位。

今天,就从浅到深,从入门到实战,教你如何学习C++。

篇幅较长,先给出本文的目录:

  • C++简介
  • 什么是C++?
  • 为什么学C++?
  • C++的历史
  • C和C++的区别
  • 编译型语言和解释型语言
  • 从入门到实战
  • 开发环境
  • C++入门
  • C++练习
  • C++实战
  • C++进阶
  • 学习资源
  • 书籍
  • 视频课程
  • 开源项目

下面,就正式开始本文的正式内容吧!

C++简介

什么是C++?

现如今,流行的编程语言非常多,Python、Go、Java、PHP、JavaScript等等,它们各有自己擅长的领域和方向。

而C++则在系统资源和内存控制更胜一筹,因此,在操作系统、图形图像、游戏、嵌入式这些对性能要求较高的领域,C++一直都具有不可替代的地位。

它可以用来开发在多个平台上运行的应用程序,如服务器、个人电脑、基于云的系统和移动设备。

为什么学C++?

如果你对计算机游戏、高端计算项目的软件工程、加密货币挖矿程序和开发移动设备的操作系统等领域感兴趣,学习C++则是必不可少的。

此外,相对于Go、Python这些更加高阶的编程语言,会涵盖更加全面的编程知识,也有助于学习者理解变量、函数、面向对象、指针、内存...这些在很多高阶语言中容易被忽略的概念和知识。

C++的历史

C++是由丹麦计算机科学家Bjarne Stroustrup(比雅尼·斯特劳斯特鲁普)创造、设计和开发的。

斯特鲁斯特鲁普想制造一种类似于C语言的灵活和动态的语言,但是,需要拥有更多的功能。

它最初被称为 "C with classes",在1983年被重新命名为C++,意思是 比C高一等。

国际标准化组织的C++联合技术委员会在1998年至2017年间对C++进行了五次升级。

一个新的版本,C++20,计划也在计划中将要发布。

C和C++的区别

C和C++有哪些区别?

这是在学习C或者C++时无法绕开的一个问题。

Jon Kalb(软件工程讲师、C++ Now和CppCon的主席)说,C++是C的进化

虽然它们有一些相似之处,但现在两者有很大的不同。

虽然C语言被广泛使用,但Kalb说它并不像C++那样支持抽象、通用编程和面向对象编程

在大型项目中,往往需要非常高层次的抽象,在这方面C++要远胜于C语言。

抽象层指的是观察或编程一个系统的复杂程度。低层次的抽象有更多的细节,而高层次的抽象可以包括整个系统。

C语言是一种程序性语言,它的代码由指令组成,直接告诉计算机或其组件按逻辑步骤完成一项任务。

C++也可以做到这一点,而且,在此基础上它支持高级功能,如类和面向对象,它允许程序员创建包含数据和功能的 "对象"。这种方法的优点是,软件对象比程序性指令执行得更快,更容易执行,而且面向对象的编程使代码更容易修改、维护和调试。

编译型语言和解释型语言

提起编程语言,就必须先要理解语言所属类型 。

编程语言可以分为编译型语言和解释型语言,下面分别解释一下。

编译型语言:程序在执行之前需要一个专门的编译过程,把程序编译成 为机器语言的文件,运行时不需要重新翻译,直接使用编译的结果就行了。程序执行效率高,依赖编译器,跨平台性差些。比较有代表性的有C、C++等。

解释型语言:相对于编译型语言存在的,源代码不是直接翻译成机器语言,而是先翻译成中间代码,程序在运行时才翻译成机器语言,每执行一次都要翻译一次,因此效率比较低。比较有代表性的包括Java、Python、JavaScript等。

从入门到实战

因为C++很受欢迎,所以有很多资源可供初学者使用,包括在线教程、网站和书籍。

当决定学习C++或任何其他计算机语言时,你首先要清楚将它用于什么方向、什么岗位。

如果你从事机器学习、深度学习、数据分析这些偏重于算法和分析、对性能不敏感的岗位,你完全可以选择R或者Python这些语言替代。

但是,如果你从事游戏、系统等对性能有严格要求的岗位,C++则是首要的选择。

下面,就开始学习旅程吧!

开发环境

如前面介绍的那样,C++属于一种静态的编译型语言,所以,开发环境配置过程中就需要用到对应的编译器。

C++有很多编译器可以用,GCC或GNU Compiler Collection是最流行的C++编译器之一。

下面是不同操作系统下的编译器安装方式。

Linux

如果你使用的是Linux,可能已经默认安装了GCC。

如果没有,可以通过如下命令安装:

# Debian/Ubuntusudo apt install build-essential# Fedorasudo dnf install make automake gcc gcc-c++# Arch Linuxsudo pacman -S base-devel

Linux下的IDE可以选择Codeblocks IDE或Eclipse CDT在Linux。

macOS

在Mac上,你可以使用Clang或GCC,两者都是免费的。

虽然GCC支持更广泛的C和C++标准,但Clang在大多数情况下都能正常工作。

可以使用Homebrew安装GCC:

brew install gcc

开发工具方面,可以选择Visual Studio Code或者Xcode。

Windows

在Windows上有很多好的编译器。

在Windows上,Visual Studio提供了一个C++编译器,该编译器还可以构建C语言程序。

Visual Studio有自己强大的、功能丰富的IDE,对于任何开始使用C或C++的人或主要针对Windows平台的人来说,它是一个很好的选择。

如果你想要更符合标准的编译器,GCC(MinGW)也可以使用,Codeblocks IDE通过设置就可以满足需求。

IDE方面,Clang是目前比较好用的的工具,除此之外,还有一些跨平台的IDE,如Eclipse CDT、Jetbrains CLion和Netbeans,它们提供了功能齐全的C和C++开发环境。

最近,Visual Studio Code非常火热,在很多编程语言比较受欢迎,它也可用于Linux和Mac环境。

C++入门

语法是一种编程语言的核心,也是用C++开发的基础,就如同我们说汉语、英语一样,语法定义了C++代码的组成和理解方式。

下面看一段示例代码:

# include <iostream>using namespace std:Int main () {cout << ”Hello World“ ; return 0;

#include <iostream>:这是一个头文件库,将功能导入到程序中。该命令的含义是程序从一个名<iostream>的文件中导入内容,该文件代表输入和输出流。

using namespace std:指的是来自标准库(std)的对象和变量名称,通常用关键字std和运算符::来缩写。

int main ( ): 指定了一个主函数。函数是C++程序的一个重要部分,因为它们在代码中定义了一个动作,包含在括号{ }中的代码将被执行。

cout(读作see-out):是一个定义输出的对象,也就是代码中的字串,这里会输出Hello World

return 0:指示程序不返回任何东西,文本字符串将是唯一的输出。

<<:是一个用于命名对象的操作符,而;(分号冒号)则作为一行代码的结束标识。

把这些放在一起,就组成了一段完成的C++代码。

通过这段简短的代码就简单的涵盖了C++中的一些基本语法,如果不首先学会基础语法,看这段代码如同天书一样,不知道它在做什么?它有什么含义?

如果了解基本语法,就能够像看一段汉语一样轻松理解它表示什么。

基本语法只是入门的一个方面,除此之外还要对如下内容有基本的认知:

  • 函数--一个函数是一组语句,它们共同执行一项任务,每个C++程序至少有一个函数
  • 数组--数组是一种数据结构,用于存储固定大小的同类元素的顺序集合
  • 字符串- 字符串是由字符组成的一维数组,以空字符'/0'结束
  • 指针- 指针是变量,其值是其他变量的地址。指针有助于更容易地执行C++任务,有些任务没有它们就无法执行
  • 引用--引用是一个别名,是一个已经存在的变量的另一个名字。如果一个引用被初始化为一个变量,那么这个变量的名字和引用的名字就可以交替使用来指代这个变量
  • 类和对象--类是C++的一个关键特征,通过将数据表示和操作该数据的方法结合到一个包中来指定一个对象的形式
  • 多态--多态意味着有多种形式。在C++中,这指的是调用一个数值函数导致不同的函数被执行,这取决于调用该函数的对象的类型

C++实战

在入门C++并学习了一些C++编程技巧后,接下来需要做的就是把它们好好利用起来了,在实战中打磨并熟练C++。

做到这一点的一个方法是通过做一个项目来了解该语言的各个方面是如何结合起来的。

目前Github上有很多相关的项目,我们可以通过阅读相关的代码,理解它的实现过程,然后自己复现相关的项目来起到实战的作用。

也可以根据自己感兴趣的领域,给你寻找一些相关的需求场景,然后通过C++实现相应的工具或者软件。

例如,开发一款简单的小游戏、实现一个文献翻译工具、开发一个简易的计算器等等。

C++进阶

中级和高级C++编程建立在基础知识之上。

《C++ Crash Course》一书的作者Lospinoso说,在中级阶段,程序员需要了解引用和指针如何工作。支撑最强大的C++功能的其他核心概念,例如,对象生命周期和多态。

对这些概念如何理解、如何使用,以及如何高效的应用于项目中,则是走上进阶路线上必须学会的。

在进阶之路上,一个C++程序要做的就不再是如何通过基本语法或者面向对象编程去实现一项功能或者一个系统,而是学会并熟练通用编程、泛型编程,也就是说,需要考虑代码的通用性、可扩展性,以便后续可以更好的向后兼容,以及更加容易适应多平台的需求。

学习资源

书籍

《C++ Primer Plus(中文版)》

想必绝大多数从事C++开发的同学都看过,至少听过这本经久不衰的经典书籍。

这是一本全面、细致、权威的C++书籍,对零基础小白非常友好,即便没有任何编程基础,在阅读过程中也不会有太大障碍。

而且,相对于很多数据喜欢给出伪代码,这本书中给出大量完整、可执行的代码,这对于基础较弱的同学上手训练非常良心。

此外,这是一本站在更高层次讲解C++的书籍,对比很多书籍一味的讲解概念和理论,它用更高层次的视角教授C++,比如,哪里有潜在问题?哪些地方需要着重注意?它都会给出详细的提示和阐述。

《C++ Primer(中文版)》

C++大师StanleyB.Lippman、C++标准委员会原负责人JoséeLajoie、C++先驱BarbaraE.Moo三位C++领域大牛合著的一本经典C++书籍,也倾注了三位大牛对C++独特的理解。

相对于很多书籍单纯的概念讲述,《C++ Primer(中文版)》从因到果,由浅入深,由表及里娓娓道来,从语言的简单用法,到为什么这样设计语言,你不仅能从一个语言使用者的角度看问题,更能站在一个语言设计者的角度思考这种语言的设计优劣。

而且,这本书完全可以作为一个参考字典使用,在日常C++开发过程中遇到的很多语法和编译问题在这里都可以寻找到答案。

《Essential C++中文版》

相对于《C++ Primer Plus(中文版)》和《C++ Primer(中文版)》的全面而厚重,《Essential C++中文版》显得”轻薄“很多。

相对于前两本的全面,这本书更加注重C++进阶部门的讲解,全书围绕procedural(面向过程的)、generic(泛型的)、object-based(基于对象的)、object-oriented(面向对象的)着4个面向进行详解,从这里,你可以学到很多C++的高阶用法

《C++标准库》

标准库是C++一个非常重要的组成部分,在C++开发中也是无法绕开的一个部分。

《C++ 标准库》这本书详细讲解了每一标准库组件,包括其设计目的和方法、复杂概念的剖析、实用而高效的编程细节、存在的陷阱、重要的类和函数,除此之外,还大量用 C++11 标准实现的实用代码范例,覆盖全新组件、特性。

这本书重点着眼于标准模板库(STL),涉及容器、迭代器、函数对象以及 STL 算法。

《Effective C++:改善程序与设计的55个具体做法》

这是一本来自全世界知名C++软件开发专家Scott Meyers的经典书籍,这本书更像是一本经验的积淀。

如果你想沿着C++的方向一直走下去,我建议《Effective C++》一定要读,它提炼和升华了作者在C++开发过程中多年的实战经验,这些都是C++程序设计和优化过程中宝贵的经验,也是普通程序员和高阶程序员之间差距的关键所在。

《More Effective C++(中文版)》

这是继Effective C++之后,Scott Meyers于1996推出这本续作,相对于《Effective C++》也更加高阶。

这本书比较适合有一定经验的C++开发人员,对于C++初学者有一定难度。

视频课程

其实,仔细阅读上面介绍的6本书籍对于C++的学习就已经足够了。

但是,不同同学有不同的学习偏好,有的同学喜欢通过看书学习新知识,有的同学则更加倾向看视频。

所以,这里也给大家推荐两个视频课程,都是免费的。

《面向对象程序设计-C++》

内容包括基本理论、类与对象、构造与清除、函数、引用、继承与多态、拷贝构造、运算符重载、异常、模板和流等,课程中贯通汇编、操作系统等知识,深入浅出,在这个课程里可以看到很多有关上面这些经典书籍的影子,可以说是一份比较用心的课程。

《C++教程:从0到1入门编程》面向对象程序设计-C++ - 网易云课堂《C++教程:从0到1入门编程》

B站上一个颇受欢迎的C++视频课程,目前播放量已经超过1500万,从基本语法到进阶知识,从概念理解到动手实践,没有多余的话术,纯干货的视频教程,对初学者非常友好。

开源项目

我个人认为,开源项目是学习一门编程语言非常快捷且行之有效的方法。

得益于强大的Github,提供了很多开源优质的项目,在这些项目中,我们可以学习那些优秀程序员的编码方式、学习并借鉴它们的程序设计模式。还能够从这些项目中得到一些灵感,去动手做一些实战项目,让我们从书本的理论知识中走出来,走向贴近实际场景的项目,让我们的技术得到升华可提炼,让我们从一个普通C++程序员进阶到一个高阶C++程序员。

interview

Star:24.4k

C/C++ 技术面试基础知识总结,包括语言、程序库、数据结构、算法、系统、网络、链接装载库等知识。

这是一个比较适合初学者的C++项目,沉淀了面试过程中C++相关的一些问题和解答,这些知识相对于书本上的内容,更加贴合项目实战,往往都是实际项目中会遇到的一些问题。

因此,这个项目可以让我们脱离书籍和教程,学到很多有实战价值的C++知识和技巧。

tinytetris

Star:1.7k

这是一个利用C++实现的俄罗斯方块的小项目,相对于那些大型项目,这个项目对初学者比较轻松,而且把C++和耳熟能详的游戏开发有机的结合到一起,这会让学习者有更加直观的感受,也有更加强烈的代入感,能够把学习者的注意力吸引到程序的设计过程中。例如,如何实现方块图像?如何实现方块的移动和选择?如何实现消除和积分功能?

这些抛出的问题在这个小项目中都可以找到解答。

MyTinySTL

Star:6.3k

就如同前面介绍的那样,STL是C++中很重要的组成部分,是学习C++无法绕开的概念。

MyTinySTL通过一个个代码示例,配以详细的注释详解,让初学者更加清楚STL的用法,对于刚学完基础知识想要夯实基础的同学非常有价值。

到这里,介绍了几个比较适合初学者的开源项目,这些比较适合刚撇下书本,需要用一些实战项目来练手、提升自己对理论知识印象和理解的同学,下面再介绍几个进阶实战的开源项目。

Cytopia

Star:1.4k

Cytopia是一个免费的、开源的复古像素艺术城市建设游戏,它采用了基于SDL2的自定义等距渲染引擎。

在这个项目中涉及到游戏开发中的很多关键因素,例如,渲染引擎、UI系统、摄像机平移缩放、地形操作、声音效果等等。

这是一个比较完整且丰富的开源项目,对游戏开发感兴趣的同学可以深入学习一下。

OpenTTD

Star:4.1k

OpenTTD是一款运输模拟游戏,基于Chris Sawyer编写的流行游戏Transport Tycoon Deluxe。

它试图尽可能地模仿原来的游戏,同时用新的功能来扩展它。

OpenTTD采用GNU通用公共许可证2.0版,但包括一些采用不同许可证的第三方软件。

devilutionX

Star:5.8k

devilutionX是《暗黑破坏神》和《地狱之火》的源码移植,它努力使游戏的运行变得简单,同时提供引擎改进、错误修复和一些可选的生活质量功能。

calculator

Star:25k

calculator是一个用C++编写的Windows计算器程序,预装在Windows中。

没错,就是我们现在在Windows操作系统中使用的那个计算器。

该应用程序提供了标准、科学和程序员计算器的功能,以及一组各种测量单位和货币之间的转换器。

DearPyGui

Star:7.9k

DearPYGui是一款用C++开发,适用于Python的快速而强大的图形用户界面工具包,具有最小的依赖性。

在这个项目中,可以学习如何使用C++实现UI界面,进行图形图像的开发。

Clementine

Star:3.2k

Clementine是一款适用于Windows、Linux和macOS的现代音乐播放器和资料库组织工具。

通过这个项目,我们可以学习如何通过C++处理音频文件,以及实现文件的组织与管理。

zeal

Star:9.6k

zeal是一款由C++开发的离线文档浏览和阅读工具,通过这个项目会涉及到Qt、cmake、libarchive、SQLite等工具的用法。

开源项目这里,我共介绍了10个项目,涉及到实战知识、游戏开发、用户界面、游戏引擎、媒体播放、文档工具,有比较适合初学者的,也有适合C++进阶的,大家可以根据自己感兴趣的方向选择适合的项目进行深入了解和学习!