C++基础
C++初学
本文将是自己学习C++系列博客的开始,该系列以C++ Primer Plus为蓝本进行学习和记录,希望通过博客这个桥梁,展示自己的一些学习的成果。当然,我作为技术小白,肯定博客里会有错,如果各位技术大佬发现了错误,欢迎指正,我一定会及时修正,这样也能更快速的提升自己,让技术传播的更远。加油!!!
最初的概念:计算机程序的任务
计算机程序 要处理两个概念:数据和算法:
1.数据
在C++ Primer Plus中,数据是程序使用和处理的信息,假如我们的程序任务目标是做一个蛋糕,那么数据就是蛋糕的原料:
| 黄油 | 500g |
|---|---|
| 鸡蛋 | 5个 |
| 糖 | 50g |
| … | … |
2. 算法
而 算法 就是程序所使用的方法了。
针对某一个具体的任务,当我们确定使用某个算法之后,程序就按照算法所描述的步骤,以一定顺序使用和处理数据来完成具体的任务目标。还是以做蛋糕来说,做蛋糕的 算法 过程大概是下面这样(有可能步骤的顺序是可以改变的):
| 步骤 | 操作 |
|---|---|
| ① | 把黄油打成蓬松状态 |
| ② | 打入鸡蛋继续搅拌 |
| ③ | 加糖继续搅拌 |
| ④ | 烘烤约0.5h |
| … | … |
总结来说:计算机中的 程序 = 数据 + 算法,换做做蛋糕的话,如图1.1
1.1 C++的基础——C语言
C++是C的超集,因此在对C++进行介绍之前,我们先来简单了解一些C的概念。
1.1.1 C的特点
简单来说,C的特点有三个(参考C++ Primer Plus):过程性编程、结构化编程、自顶向下的程序设计思想
①:C的过程性编程
过程性编程 强调 算法,算法我们已经在上面介绍过了,即程序所使用的方法。在 过程性编程 的概念定义中,对于一个特定的任务,一般包含2个步骤:首先构思程序要使用的操作,然后再通过编程语言来实现这些操作。如下顺序:
因此,C语言作为一种过程性语言一般也按照这样的方式解决复杂的任务。
②:C的结构化编程
早期编程语言如 BASIC 和 FORTRAN等在处理复杂任务时,容易发生分支语句逻辑混乱,当程序规模变大时,程序的可读性和可维护性十分低。因此C语言在设计初衷,希望能缓解这种尴尬。C语言被设计成具备结构化编程的能力。具体来说就是将一些指令(如分支所要执行的指令)限定在行为良好的结构中(PS:这里行为良好还不清楚是什么意思,感觉像是指令的逻辑可以比较明确、逻辑十分清晰的表现出来的意思),使代码的可读性和可维护性大大提升。在C语言中,常见的这类结构就是我们比较熟悉的for循环、while语句、do while 和 if else 语句。
③:C语言自顶向下的编程思想
C语言的设计者希望C语言能比较方便的管理大型的任务。因此,C语言在处理复杂的、大型的任务时,通过将 大任务 分解成 小任务 来实现,小任务 可以继续分解,直到程序被分解成易于管理、编写的模块。而在C语言中,这些小的模块,常常被程序单元(函数)来实现。
C的简单回顾
C语言三特点:
| C语言 | 特点 |
|---|---|
| 过程化编程 | 强调算法 |
| 结构化编程 | 限定某指令为行为良好的结构:for循环、while、if else等 |
| 自顶向下设计思想 | 大任务分解成小的程序单元——函数 |
1.2 C++特性
C++完全具备C的特点,但同时C++还添加了一些其他的特性。其中很重要的两部分为:面向对象的编程 和 泛化编程。
1.2.1 OOP(面向对象编程)
C++的面向对象的编程方式是希望提高C语言对大型项目的管理能力,它强调的不是算法, 而是 数据 。因此在针对某一任务时,面向对象的编程 首先 试图让语言满足任务的需求,即 先构建与任务本质特性相对应的数据结构。
我们可以通过比较 C语言 和 C++ 在解决某个任务时 先 执行的操作看出端倪:
| C | C++ |
|---|---|
| 先构思要执行的操作(先构思采用哪种算法) | 先构建对应于问题本质的数据 |
类与对象
类是一种 规范,它定义了新的 数据格式,而 对象 是根据这种规范构建的特定的 数据结构。
类具备一些功能:
- 定义了对象可以使用的 特征;
- 定义针对这些特征可执行的操作;
类规定哪些数据来描述对象
假如我们用类来描述某公司的人员特征,我们希望从:姓名、职位、工资、特长等方面来描述一个职工,因此类需要规定这些数据对一个具体的对象进行描述。如下图
类定义对数据进行的操作——类的方法
而针对类内定义的数据执行的操作,表示对数据进行进行的 动作。以一个画图程序为例,假如我们先定义一个矩形的类,要描述矩形类,我们需要规定矩形的坐标、长宽、边的粗细和样式、内部填充颜色和图案等 数据 来进行描述;针对矩形对象可能会有 移动、旋转、改变颜色、复制和剪切 等操作,这些操作通过 类的方法 来实现。
那么,当使用程序绘制矩形时,该程序会根据类定义创建一个对象,这个对象具备描述矩形特征的所有数据,当我们希望对这个矩形对象进行移动、旋转等操作时,就使用类方法来对矩形数据进行修改。
OOP对象编程小总结
| 编程方式 | 描述 | 特点 |
|---|---|---|
| OOP编程 | ![]() | 自底向上 |
| 过程化编程 | ![]() | 自顶向下 |
OOP编程的其他特性
其他特性包括:信息隐藏、多态、继承(后面再作介绍)
1.2.2 C++与泛型编程
泛型编程(generic programming):目标与OOP编程一样——都是 使重用代码和抽象通用概念的技术更简单。这么说,OOP编程是一种通用概念的抽象:因为我们定义的是一类对象所具有的共有特点。不同的是:
- 泛型编程 强调 独立于特定数据类型
- OOP是用于管理大型任务的工具,而 泛型编程 提供常见任务(数据的排序和合并链表)的工具。
书中例子解释说,对于C++中有很多数据类型——如整数、小数、字符、字符串、用户定义以及多种数据类型组合的符合结构。常规的数据排序方法,应该针对不同的数据类型分别编写排序的函数,而 泛型编程 只需要编写一个泛型(不是针对特定类型数据的)函数,就能完成各类数据的排序。在C++中,模板提供了完成泛型编程的机制。
C++特性小结
- C++特性除了下面的几个特性,同时 保留了C的过程性编程
- OOP编程
- 强调数据, 构造与问题本质对应的数据结构,让语言满足问题需求
- 类——一种规范(描述某一类对象的数据;定义对数据的操作)
- 对象
- 自底向上
- 方便管理大型项目的工具
- 泛型编程
- 强调独立于特定数据
- 与OOP一样,方便程序重用和通用概念抽象
- 提供常见任务(数据排序、合并链表)的工具, 由C++中的模板实现
1.3 C++标准
C++标准是为了保证在不同的操作系统中(如Red Hat或者Windows,书中形象的说Windows和红帽系统像是计算机语言的两个“方言"),C++的程序能运行获得相同的结果而设定的,分别有下面这几个:
- 1998年,C++98——对C++语言进行了扩展,添加了模板、标准模板库(STL)、异常、运行阶段类型识别(RTTI)等;
- 2003年, C++03——没有改变语言特性,做了一些修订;
- 2011年, C++11,也被称为C++0X(本书讲的好像不多)
- 现在应该还有更新的,这里先不做介绍
1.4 C++程序创建过程
- 编写源代码——文本编辑器,按照C++的代码规范编写程序
- 编译源代码——编译器(翻译官)将C++的源代码翻译成机器语言。这么做是因为C++是一种高级语言,它更加符合人的语言行为,但是在计算机中所有的数据、指令都是以二进制形式存在的,即一大串0或1的二进制数的组合。我反正是不会用0或者1的二进制数字编写代码。因此对于我们习惯使用的C++等高级语言,需要用编译器翻译成计算机能立马明白的机器语言;编译如果没有发生错误,会获得 目标代码
3.链接目标代码和其他代码——其他代码包括 库代码 和 启动代码,链接获得 可执行代码

1.4.1 创建源代码
可以通过不同的方式创建源代码
- 集成开发环境(IDE)
可完成源代码编辑、编译、链接全部操作 - 对于UNIX和Linux的 GUN C++,由于其只能进行编译和链接,因此需要专门的文本编辑软件编辑源代码,在Linux上可以使用 vi
源文件命名
源文件需要后缀正确的后缀名,在不同的操作平台上,C++的源文件的后缀名会有一些区别:

不同操作平台下的编译与链接
- UNIX系统的编译、链接
UNIX系统使用CC指令来对源代码文件进行编译,如果我们假设源代码文件为:spiffy.C(使用“.C“后缀与UNXI系统下c语言的源代码文件后缀“.c”区别) - 编译:CC spiffy.C
CC spiffy.C 这一指令会spiffy.C进行编译,对如果编译没有发生错误,CC spiffy.C指令将获得名为spiffy.o的目标文件 - 链接
然后,编译器自动将目标文件传递给系统的 链接程序,链接程序会将目标文件与库文件和启动文件进行链接,默认生成a.out 可执行文件。如果只编译一个源代码文件,中间过程的目标文件将被删除(因为没有用了),因此上面的 CC spiffy.C生成可执行文件 a.out 后,将删除spiffy.o文件(但是,当一次编译多个源代码文件时,将不会删除目标文件)。- 对于多个源代码文件,如果修改了某个源文件,如修改了my.C文件,需要用下面的指令重新编译:
CC my.C precious.o
- 对于多个源代码文件,如果修改了某个源文件,如修改了my.C文件,需要用下面的指令重新编译:
-
Linux系统下的编译链接
Linux操作系统下使用 g++编译器 编译原代码文件,其来自于 Free software Foundation 的 GNU C++编译器,我们现在更常见的是 GCC。 g++的编译连接过程与标准的UNIX编译器CC很像。 -
编译和链接
g++编译指令:g++ spiffy.cxx.
有些版本可能要求链接C++库:g++ spiffy.cxx -lg++;
编译多个文件: g++ my.cxx precious.cxx
将产生a.out的可执行文件和两个目标代码文件my.o和precious.o。
如果编译后,修改了my.cxx源文件,同样需要重新编译:g++ my.cxx precious.o -
Windows操作系统下的项目创建过程:
-
Windows下支持很多种编译方式,g++的编译同样支持。但比较常见的是使用一些IDE,如Microfoft Visual C++系列,VSCode应该也可以。
-
值得注意的
- C++ Primer Plus书中推荐创建项目时,寻找IDE的“控制台”、“字符模式”、“DOS可执行文件”=

- C++ Primer Plus书中推荐创建项目时,寻找IDE的“控制台”、“字符模式”、“DOS可执行文件”=
-
IDE的一些选项的含义:
- compiler:编译当前打开的源代码文件
- Make和Build:编译项目中所有源代码文件,当某个文件被修改时,只有被修改的文件会被重新编译
- Buile ALL:重新编译所有源代码文件
- Link:将编译获得的目标代码文件文件与所需的库代码组合
- Run或者Execute:运行程序,如果没有执行 编译和链接,Run会自行执行编译链接
- Debug:步进方式运行程序。
-
其他注意事项:
- 编译可能出现的问题:
- 违反语言规则,编译将发生错误,同时IDE会指出出现错误的行,但是具体的错误会出现不同错误信息,有时,错误在所指行之前;有时一个错误会发生一连串错误信息。
需要注意的是:改正错误应当从第一个错误开始。并且如果所指行找不到错误,就查看前一行,直到找到错误。 - 编译器不完全的构建程序——出现混乱,显示无法改正的、无意义的错误信息。有时候可以通过Build ALL来解决。
- 违反语言规则,编译将发生错误,同时IDE会指出出现错误的行,但是具体的错误会出现不同错误信息,有时,错误在所指行之前;有时一个错误会发生一连串错误信息。
- IDE的辅助窗口:

- 编译可能出现的问题:
C++初学知识总结
C++特性

C++标准:C++98、C++03、C++11等
C++的程序创建过程:编译(编译器:CC、g++、IDE)→目标代码文件、链接(链接程序、 库代码+启动代码)→可执行文件
C++编译或重新编译多个源代码文件:
- CC my.C precious.C
- g++ my.cxx precious.cxx
- CC my.C precious.o
- g++ my.cxx precious.o
编译问题:语言特性错误、程序构建不全(Build All可以尝试解决,但有时候不灵)
本文是作者学习C++的初步记录,主要介绍了C++的基础——C语言,包括C的三个特点:过程性编程、结构化编程和自顶向下的编程思想。此外,还探讨了C++的特性,如面向对象编程和泛型编程,并简述了C++的标准和程序创建过程。


1552

被折叠的 条评论
为什么被折叠?



