C++ Primer Plus学习(一)

本文是作者学习C++的初步记录,主要介绍了C++的基础——C语言,包括C的三个特点:过程性编程、结构化编程和自顶向下的编程思想。此外,还探讨了C++的特性,如面向对象编程和泛型编程,并简述了C++的标准和程序创建过程。

C++初学

本文将是自己学习C++系列博客的开始,该系列以C++ Primer Plus为蓝本进行学习和记录,希望通过博客这个桥梁,展示自己的一些学习的成果。当然,我作为技术小白,肯定博客里会有错,如果各位技术大佬发现了错误,欢迎指正,我一定会及时修正,这样也能更快速的提升自己,让技术传播的更远。加油!!!

最初的概念:计算机程序的任务

计算机程序 要处理两个概念:数据算法:
1.数据
C++ Primer Plus中,数据是程序使用和处理的信息,假如我们的程序任务目标是做一个蛋糕,那么数据就是蛋糕的原料:

黄油500g
鸡蛋5个
50g

2. 算法
算法 就是程序所使用的方法了。
针对某一个具体的任务,当我们确定使用某个算法之后,程序就按照算法所描述的步骤,以一定顺序使用和处理数据来完成具体的任务目标。还是以做蛋糕来说,做蛋糕的 算法 过程大概是下面这样(有可能步骤的顺序是可以改变的):

步骤操作
把黄油打成蓬松状态
打入鸡蛋继续搅拌
加糖继续搅拌
烘烤约0.5h

总结来说:计算机中的 程序 = 数据 + 算法,换做做蛋糕的话,如图1.1图1.1

1.1 C++的基础——C语言

C++是C的超集,因此在对C++进行介绍之前,我们先来简单了解一些C的概念。

1.1.1 C的特点

简单来说,C的特点有三个(参考C++ Primer Plus):过程性编程、结构化编程、自顶向下的程序设计思想

①:C的过程性编程

过程性编程 强调 算法,算法我们已经在上面介绍过了,即程序所使用的方法。在 过程性编程 的概念定义中,对于一个特定的任务,一般包含2个步骤:首先构思程序要使用的操作,然后再通过编程语言来实现这些操作。如下顺序:

构思算法
某个编程语言
特定任务
算法1到算法m
实现算法1到算法m所要执行的操作

因此,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++ 在解决某个任务时 执行的操作看出端倪:

CC++
先构思要执行的操作(构思采用哪种算法先构建对应于问题本质的数据
类与对象

类是一种 规范,它定义了新的 数据格式,而 对象 是根据这种规范构建的特定的 数据结构
类具备一些功能:

  1. 定义了对象可以使用的 特征
  2. 定义针对这些特征可执行的操作

类规定哪些数据来描述对象
假如我们用类来描述某公司的人员特征,我们希望从:姓名、职位、工资、特长等方面来描述一个职工,因此类需要规定这些数据对一个具体的对象进行描述。如下图图1,2
类定义对数据进行的操作——类的方法
而针对类内定义的数据执行的操作,表示对数据进行进行的 动作。以一个画图程序为例,假如我们先定义一个矩形的类,要描述矩形类,我们需要规定矩形的坐标、长宽、边的粗细和样式、内部填充颜色和图案等 数据 来进行描述;针对矩形对象可能会有 移动、旋转、改变颜色、复制和剪切 等操作,这些操作通过 类的方法 来实现。

那么,当使用程序绘制矩形时,该程序会根据类定义创建一个对象,这个对象具备描述矩形特征的所有数据,当我们希望对这个矩形对象进行移动、旋转等操作时,就使用类方法来对矩形数据进行修改。

OOP对象编程小总结
编程方式描述特点
OOP编程在这里插入图片描述自底向上
过程化编程在这里插入图片描述自顶向下
OOP编程的其他特性

其他特性包括:信息隐藏、多态继承(后面再作介绍)

1.2.2 C++与泛型编程

泛型编程(generic programming):目标与OOP编程一样——都是 使重用代码和抽象通用概念的技术更简单。这么说,OOP编程是一种通用概念的抽象:因为我们定义的是一类对象所具有的共有特点。不同的是:

  • 泛型编程 强调 独立于特定数据类型
  • OOP是用于管理大型任务的工具,而 泛型编程 提供常见任务(数据的排序和合并链表)的工具。

书中例子解释说,对于C++中有很多数据类型——如整数、小数、字符、字符串、用户定义以及多种数据类型组合的符合结构。常规的数据排序方法,应该针对不同的数据类型分别编写排序的函数,而 泛型编程 只需要编写一个泛型(不是针对特定类型数据的)函数,就能完成各类数据的排序。在C++中,模板提供了完成泛型编程的机制

C++特性小结

  1. C++特性除了下面的几个特性,同时 保留了C的过程性编程
  2. OOP编程
    • 强调数据, 构造与问题本质对应的数据结构,让语言满足问题需求
    • ——一种规范(描述某一类对象的数据;定义对数据的操作)
    • 对象
    • 自底向上
    • 方便管理大型项目的工具
  3. 泛型编程
    • 强调独立于特定数据
    • 与OOP一样,方便程序重用和通用概念抽象
    • 提供常见任务(数据排序、合并链表)的工具, 由C++中的模板实现

1.3 C++标准

C++标准是为了保证在不同的操作系统中(如Red Hat或者Windows,书中形象的说Windows和红帽系统像是计算机语言的两个“方言"),C++的程序能运行获得相同的结果而设定的,分别有下面这几个:

  1. 1998年,C++98——对C++语言进行了扩展,添加了模板、标准模板库(STL)、异常、运行阶段类型识别(RTTI)等;
  2. 2003年, C++03——没有改变语言特性,做了一些修订;
  3. 2011年, C++11,也被称为C++0X(本书讲的好像不多)
  4. 现在应该还有更新的,这里先不做介绍

1.4 C++程序创建过程

  1. 编写源代码——文本编辑器,按照C++的代码规范编写程序
  2. 编译源代码——编译器(翻译官)将C++的源代码翻译成机器语言。这么做是因为C++是一种高级语言,它更加符合人的语言行为,但是在计算机中所有的数据、指令都是以二进制形式存在的,即一大串0或1的二进制数的组合。我反正是不会用0或者1的二进制数字编写代码。因此对于我们习惯使用的C++等高级语言,需要用编译器翻译成计算机能立马明白的机器语言;编译如果没有发生错误,会获得 目标代码
    3.链接目标代码和其他代码——其他代码包括 库代码启动代码链接获得 可执行代码
    在这里插入图片描述

1.4.1 创建源代码

可以通过不同的方式创建源代码

  1. 集成开发环境(IDE)
    可完成源代码编辑、编译、链接全部操作
  2. 对于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

  • 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可执行文件”=在这里插入图片描述

  • IDE的一些选项的含义:

    • compiler:编译当前打开的源代码文件
    • Make和Build:编译项目中所有源代码文件,当某个文件被修改时,只有被修改的文件会被重新编译
    • Buile ALL:重新编译所有源代码文件
    • Link:将编译获得的目标代码文件文件与所需的库代码组合
    • Run或者Execute:运行程序,如果没有执行 编译和链接,Run会自行执行编译链接
    • Debug:步进方式运行程序。
  • 其他注意事项:

    • 编译可能出现的问题:
      • 违反语言规则,编译将发生错误,同时IDE会指出出现错误的行,但是具体的错误会出现不同错误信息,有时,错误在所指行之前;有时一个错误会发生一连串错误信息。
        需要注意的是:改正错误应当从第一个错误开始。并且如果所指行找不到错误,就查看前一行,直到找到错误。
      • 编译器不完全的构建程序——出现混乱,显示无法改正的、无意义的错误信息。有时候可以通过Build ALL来解决

    • 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可以尝试解决,但有时候不灵)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值