C++快速入门

C++快速入门
LZJFR-EDENCREATER-📣 文档更新日期:2025 / 3 / 16
📄 NSPD官方教程,引用自:\ _POST⛔ 未经允许禁止转载
⚠️ 建设中,不代表最终呈现效果
✅ 课程简介:
《 Rapid Learn of C++ 》是NSPD的第一个系列课程文档,针对于刚接触C++不久或者没有学习过C++的同学建设,顾名思义,这仅仅是C++学习中比较微不足道的一个入门级部分。C++的学习难度和成本一直都居于前列,所以,如果您是刚学习编程或者对计算机程序构建没有充分了解的小白,C++的学习肯定会伴随着快乐与疑惑不解。本课程专门为了改善这一高门槛编程语言的学习难度,我们会采用理论与实践结合的方式,每一章从一个小程序开始,用本章所学所讲来逐步提升这一小程序的整体功能,寓教于乐,综合提升。
✅ 本课程主要会包括而不限于下列基础内容:
C++是什么
环境配置与调试
C++基本数据类型
C++的输入输出功能
操作数和运算符
流跳转
程序控制分支
C++中级数据类型
基本函数功能
……
编者:LZJFR-EDENCREATER-
插图:LZJFR-EDENCREATER-
CHAPTER 1 | C++是什么
▶️ 在这章您将会了解到:
C++的前世今身
C++学习之路该怎么走?
说到C++大家应该不陌生,它拥有一套极其丰富并且繁琐复杂的知识体系。可为什么叫做 “C++” 而不是 “C” 或者其他的名字呢,我们认识到,C++实则是由一种叫做C的编程语言进化而来,所以,您如果学习了C++,C语言的内容您就大致掌握了,此乃一举两得之事,不过编者想告诉您,这两种语言虽是同门出生,但在两种语言的性质和编程思维上却天差地别。
我们想要了解C++,不如我们先来了解一下C。
C语言是一门高级编程语言,有多高级呢?其实没多高级😅,所谓的 “高级” 是指的相对于C语言之前的众多编程语言要更加简洁高效、功能丰富、语法完善,并且还有一套自己的“库”,也就是给程序员提供的一种便携工具包,这里面包含了加减乘除、输出输入、随机数字等众多高级功能,用户可以将这些原本需要成百上千行的代码操作对应到一句小小的话里,更或者一个符号里,是不是听起来很诱人?那么我们再来了解一下那些早期编程语言的发挥吧:
汇编语言,就是一种复杂且原始的编程语言,以下是一段汇编语言:
1 | DATA SEGMENT |
您知道这一段飞龙代码实现的是什么操作吗?编者告诉你,这仅仅是想实现从1开始,一直加到100的总求和。读者也许会感觉到,满篇的数字字母交相辉映,令人眼花缭乱。这其实也是有原因的,更早期的语言只采用01代码来进行功能的实现。也就意味着人很难去读懂这一类只有两个数字交替出现的代码,除非您是一位高级分析师,否则您看一会儿就看晕了。
后来出现了汇编语言,所谓“汇编”,就类似于上文所述的“库”,它将一套很复杂的二进制代码浓缩到一个单词上,而用户仅需打出这个单词就能调用这个单词背后的一整座代码山所对应的操作,就像图中1️⃣处那两行开头的MOV操作符一样(本文不讨论低级编程,所以不解释这啥意思)极大地简化了操作。例如将两个数相加,可能用01代码就需要上百行,但汇编语言将这一操作浓缩到一个ADD操作符上,用户仅仅通过使用这一个单词就可以实现加法操作,是不是很简单?
可这并不是最简单的方案,汇编语言依赖于内存处理与指针编程,您可以想象一下,我为了将一个数字从一块内存上转移到另一块内存上,需要反复地调用内存寄存器(也就是将一个数零时存放的地方),因为在汇编语言的体系里,操作一个数,例如将它乘以10,就需要先将它转移到一块特定的内存上,再进行操作。别见怪,这恰恰符合了计算机内存的基本原则,才能有条不紊的进行这些操作;否则,在遇到大量的乘法运算时,如果不把这些数字集中到一块内存上,很容易发生意想不到的错误。为了简化一系列的内存转移操作,新一代(第三代)编程语言诞生了,就像C、C++这样的“高级”编程语言。
如果说将01代码转换为一个操作符是实现了浓缩代换,那么将一系列经过代换的操作符集合成一个全新的单词就更加高级了。有人说那这样无限代换会不会产生一定的混乱感?例如:从1加到100如果代换为一个单词,比如one_to_hundred
,那么按照这个逻辑,实现这样一个操作就只需要输入该单词即可。但,这真的有必要吗?如果这样,我要从1加到500是否就需要一个one_to_500
呢?从1加到1000呢?这样效率太过低下,我会为了实现这一系列的操作而设定一系列的 “代换单词” ,以至于到最后我也不明白那个单词对应哪种操作,人们会为了寻求简便而开发出成千上万的这样的单词,每次写代码第一想到的是操作对应的单词是什么,而不是到底应该实现怎样的逻辑才能看到我想要的效果,这违背了代码的自定义化,局限了大部分的操作体系,就像八股文一样,极力追寻简便往往会适得其反。
每个人写作文都有自己的风格,有的人严肃,有的人诙谐。但无论怎样,他们为了表达同一个观点而写文章,这所表现出来的影响一定是相同的。类似地,高级编程语言一定是像写文章一样,只要语法正确逻辑正确怎样写都没问题。用户想实现一个加法操作也可以按照自己的想法写了,不用在那里乱转寄存器。用户可以像写一段话一样写一行代码,再将你写的代码拿去编译。编译,一种高级操作,通俗来讲也就是将外语翻译一遍变成本地语言的文章,类似于 “本地化” ,你写的程序就像这里的外语,编译就像翻译一样,将你所熟悉的语言转化为计算机所熟悉的语言,例如汇编语言等相对低级的语言。这样,你写出来的代码和之前的汇编代码所产生的效果就一模一样了。
从上面的一段话可以看出来,想要实现高级编程语言的创造,就必须要具备:
- 编译器,也就相当于翻译员,把你的高级语言降级到低级语言。
- 语法检测器,也就是相当于英语阅卷老师一样的语法检查官,如果你写了一段错误的代码,甚至可能是对计算机有害的代码,语法检测器将阻止编译器编译,更高级的,还会指出你的错误,记住,它只能检测语法错误,不能检测逻辑错误,不要指望它为你检测出代码逻辑上的错误,就像法官只按法律审判,而不管人情世故。
C语言完美的兼容了以上所有特性,它拥有GCC编译器,用来转换程序;也有一系列的语法检测算法来检测语法错误。
那C++又更高级在哪里呢?拥有相同的工具,又是同源出生,唯一不同之处便是他们的编程宗旨和内部算法的升级,例如,C语言中的输入输出是靠两个函数(后面再介绍,你就理解成一种高级版的浓缩单词吧)进行的,而C++是靠模板类( 一种高度自定义的操作集合体,本文档不讨论C++的OOP编程 )进行输入输出的,并且还新增了流缓存区这一功能,让输入输出更加简便安全。
这样看,C++确实是比C要更加高级方便,C++还广泛用于游戏、家电、汽车、服务器等多种领域,读者如果没有很强的体会也无关系,后面的教程将增强两者的差异。您只需要知道C++的来历和优越性。
接下来看看C++的开发者吧:
C++是一种计算机高级程序设计语言,最早于1979年由本贾尼·斯特劳斯特卢普在AT&T贝尔工作室研发。不得不说,这人是个天才。
C++还在持续发展与更新,从1979年到您在阅读这句话的那个瞬间,C++的标准制定者们无时无刻不在开发C++的新功能,并舍弃C++的一些旧功能,您需要认识到的是,C++的不同版本会有一些细微的差异,这是很正常的。文档主要使用最新版的C++,您需要兼容一部分的功能才能与文档一致。
尾声
从汇编语言到C++,经过了几代人的不懈付出。如今您的计算机、手机、甚至是冰箱处处都有C++的影子,可见,C++的普及性一定超过了 本贾尼·斯特劳斯特卢普 的预期。但是,站主想告诉您,信息技术始终是发展并且交融的新世纪科学,这难免会有迭代与消亡。C++并不意味着高级,因为C#已经出现了;汇编不意味着低级,因为它在丧失通用特性的同时大大增加了代码的自定义化。学习C++,不能只是学习它的基本知识,更要了解它的历史与基本特性,并用其他编程语言的知识来更加充分的了解C++,这样,您收获的,将是远远超出C++本身的东西。
CHAPTER 2 |C++编程的环境配置与调试
▶️ 在这章您将会了解到:
C++编程环境的配置
C++编程环境的调试
C++编程的原理
2.1 C++编程环境的配置
首先,一位优秀的程序创作者应该知道,他要开发的项目一定要对应一种编程语言,例如游戏创作可以选择C#(Unity)、C++(cocos-2d);网页设计可以用HTML、css、Java等。那么如果他选择使用C++来进行一系列的开发,就必须要有对应的开发工具,就像制作雕塑需要刻刀、画素描画需要H、HB、B数种型号的铅笔……C++也是如此,如果我要写一段C++的代码,从本质上来说,代码就相当于一段人能看懂的话,C++环境在这里的作用就是将这段话编译(一种人机翻译,在第一章讲过)出来,交给计算机去处理你说的这段话,最后达到您想实现的效果。
在第一章,我们提到过一种GCC编译器,它的作用这里不再概述,不过编者想告诉您的是,GCC是一种针对于C语言的编译环境工具,我们强调C++是一种与C形式相近,而截然不同的高级语言,所以,对于C++的编译,我们会用到G++编译器。这是专门适用于C++的编译器,从百度谷歌等平台可以搜索并下载这一工具。
延续上一章没说完的,既然在源代码与成品文件之间存在一种编译关系,也就是说,编译工具将您写的代码转换为机器码并生成出一类叫做可执行文件(例如.exe文件、.bat文件)的成品文件来对应您想实现的功能,从而实现了用户可以通过成品文件来直接使用您开发的软件而非将您的源代码下载下来手动编译一遍。这种做法的好处在于,可以有效避免用户将您的代码进行传播侵权,违法修改,还可以让用户仅仅双击一下鼠标就可以开始使用。总而言之,编译器将您的代码进行编译并加密。下面是一幅编译流程图:
在C++中,源文件的扩展名为:.cpp,所以,您只需要新建一个空白文档,取一个好听的名字(最好只包含数字字母)将后缀从txt改为cpp,无视风险,就可以创建一个最简单的、没有任何内容的源文件了,当然,它的本质还是一个文档文件,没有任何功能和内容,就算进行编译也会失败,后面我们将教您如何编译它。
现在市面上的编程环境主要分为 集成开发环境 (IDK) 和 非集成开发环境,前者较为简单,只需要下载一款软件或者执行一段Shell脚本即可使用,例如Visual Studio、Dev Cpp等,您可以自行从官网下载,这里不多概述。
非集成开发环境指的是分散性的一系列工具组成的环境,在使用时往往缺少一键生成、一键编译等功能,相对繁琐,需要用户使用命令行工具进行手动编译,并且无法直观查错、分析,只有等待编译时的报错信息才能确定程序问题,这里也不多概述。
还有一种便是半集成型环境,指的是将非集成开发环境嵌入集成开发工具(IDE) 中,类似于将环境嵌入模板中,这块模板可以接纳很多诸如此类的非集成环境,使用难度低于非集成开发,高于集成开发,我们着重讲这一类环境的配置:
以开发软件 VS Code 为例,一步步来带领您配置环境。
首先,请在官网下载VS Code 。而后,安装C++插件。如果您不习惯英文,还可以安装汉语插件包,重启应用即可。
安装 C++ 扩展: 打开 VS Code,按下 Ctrl+Shift+X 打开扩展视图。 搜索 C++,找到 C/C++ 扩展并点击安装。
安装好插件以后,需要继续安装 MinGW-W64( Minimalist GNU for Windows x64),一款开源编译环境,免费无污染。可以从Github下载(需要加速器),也可以直接从Github仓库克隆到本地。后者请学习《Github基础教程》或者有一定了解后再使用,上手难度较大。
安装 MinGW-W64: 前往 MinGW-W64 GitHub 页面下载最新版本的安装程序,下载是…x86_64…exe的即可。 双击运行安装程序,按照提示完成安装,安装在C盘最好,且用户名不要是中文,否则经常会遇到无法解决或意想不到的问题,安装完成后勾选立即运行会弹出终端窗口,请不要退出,以供继续下一步安装。
安装完成弹出终端以后,输入下面的命令行以继续:
1 pacman -S --needed base-devel mingw-w64-ucrt-x86_64-toolchain安装过程中会询问是否继续和安装多少包体,输入回车或”y”即可继续,安装完成后,关闭界面,进入下载到的文件夹中,进入
...\msys64\ucrt64\bin
文件夹,复制该文件夹的路径。在Windows系统的搜索框中输入
编辑系统环境变量
,打开编辑系统环境变量的设置界面,在下方找到环境变量
一项,点击打开界面,选中并双击 Path变量 。进入Path后,点击右侧的新建,输入刚才复制的地址(需要绝对地址),确认并关闭,最后在主界面点击确认完成环境变量的配置。
为确认环境的配置成功,打开命令提示符(cmd),输入如下命令:
1
2
3 gcc --version
g++ --version
gdb --version如果出现相关信息,则表示安装成功。
安装完成后,即可以进入VS code进行编程与学习,本教材不包含软件使用教程,请自行查阅资料上手您要选择的编程软件进行学习。
本教学文档进行的是通用教学,即无视各种软件带来的特性差异,如果您在某个时刻发现自己看到的现象与本文档的记述不相符合,极有可能是您的电脑配置差异与使用的软件差异造成的。
2.2 C++编程环境的调试与文件编译原理
一个完整的C++编译过程总共包含以下四个过程:
- 编译预处理阶段,使用命令
g++ -E
执行 - 编译阶段,使用命令
g++ -S
执行 - 汇编阶段,使用命令
as
或者命令g++ -c
执行 - 链接阶段,使用命令
g++ xxx.o xxx.so xxx.a
执行
打开您在上一小节选择的编程软件,新建一个.cpp文件并命好名称(最好只包含字母与数字),如果您使用的是Visual Studio一类的项目或解决方案类型的IDE,可以选择“控制台应用”一项创建。创建好之后,复制如下代码到cpp文件中:
1 |
|
复制好后,保存并退出。
虽然现代集成开发软件自带一键调试编译的功能,您依然需要知道如何手动操作这一过程,以应对后面的学习。
2.2.1 预编译
C++是一种高级编程语言,需要再次强调的是,它虽然从C语言中来,但依然拥有与其相兼容的功能,预编译就是其中之一。
C++源代码需要经历几个步骤才能到达最后的成品文件,第一个步骤就是预编译。预编译是指将源代码文件中的某些文字转化成具有同等作用效果的文字(类似于扩句,让句子更详细完整有风度,只不过是把这一行为给电脑看而已),这一步旨在让一些语句所表达的意义更具体、更符合计算机的底层逻辑(没理解到也没关系,后续将深入讨论该点);或者将文件中的一些特殊标记提取出来,以备后面步骤的识别等。总之,预编译就是将源代码转换得更加清晰、完整,使之与电脑功能相对应。当然,预编译的作用很重要,如果没有这一步骤,后面的步骤将很难进行。
打开键入如下命令:
g++ -E [name].cpp [name].h -o [name].ii
,其中**[name]**表示文件名。