easy-cpp系列简明C++教程(第一章)-创新互联

简明C++基础教程 前言

构思了很久的easy-cpp系列博客教程,现在终于有动力开始写了,也是想再回顾一下当初自己学习C++的过程,也是想以初学者的角度回顾一下自己当时踩过的坑,同时也给各位初学者避避雷。目前是先打算结合自己大学的教材和自己看过的一些C++相关的书籍资料,写一写自己对一些概念的理解,再穿插一些自己当时写代码时出的一些错误、踩过的坑以及解决办法。本人资质尚浅,文章中难免出现一些错误,欢迎各位佬批评指正。

创新互联建站专业网站设计、成都网站建设,集网站策划、网站设计、网站制作于一体,网站seo、网站优化、网站营销、软文平台等专业人才根据搜索规律编程设计,让网站在运行后,在搜索中有好的表现,专业设计制作为您带来效益的网站!让网站建设为您创造效益。第一章 预备知识 1.1 程序设计语言 1.1.1 程序设计语言与计算机程序

程序设计语言也被称为编程语言、计算机语言,是用来完成程序设计的一种用于与交流或交互的人造语言。更通俗的来讲,程序设计语言是由人类设计的用来与计算机进行交流的一种工具。它是计算机能够理解和识别人类用户的操作意图的一种交互体系,是计算机可编程的具体体现,也是程序设计的具体实现方式。程序设计语言按照特定的规则组织计算机指令,使计算机能够按照人类意愿进行各种运算处理。而按照程序设计语言的规则组织起来的一组计算机指令被称为计算机程序。简单来说,计算机程序是由一条条有序指令组成的,指挥计算机完成一个操作的有序步骤。

1.1.2 高级语言与低级语言

随着计算机科学的发展,程序设计语言也在不断地变化。随着时间的发展,一共出现了三种类型的程序设计语言:机器语言、汇编语言和高级语言。

最早的程序设计语言是机器语言。机器语言是一种二进制语言,它直接使用二进制代码表达指令,每一条二进制代码表示一个功能,是计算机硬件不需要转化就可以直接识别和执行的一种程序设计语言。不同计算机结构的机器语言不同。

直接使用机器语言进行编程十分复杂,且二进制的代码难以阅读、理解和修改,因此人们在机器语言的基础上创造了汇编语言。汇编语言使用符号(助记符)来代替二进制代码,助记符与二进制代码一一对应。用汇编语言编写出的程序称为汇编源程序。汇编语言的出现,在计算机发展的早期帮助程序员提高了编程效率。与机器语言类似,不同计算机结构的汇编指令不同。

虽然汇编语言的出现为程序设计人员提供了很大的方便,但是直接使用汇编语言进行编程依然是一件繁冗的工作:它需要程序设计人员了解计算机硬件的细节,而且由于不同计算机结构的汇编指令不同,要将汇编源程序移植到另一种计算机上,就必须用不同的汇编指令重新编写程序(可移植性差)。在这种情况下,高级语言运应而生。高级语言是接近于自然语言的一种程序设计语言,高级语言致力于解决问题而不是像机器语言、汇编语言一样针对特定计算机硬件。高级语言可移植性好,同一种高级语言在不同计算机上的表达方式是一致的,代码只与编程语言有关,高级语言使用一种称为“编译器”或“解释器”的特殊程序将高级语言翻译成特定的计算机的内部语言,这样一来就可以通过不同的编译器在不同平台上使用高级语言。用高级语言编写的程序称为源程序。

由于机器语言与汇编语言都直接操作计算机硬件,并基于此根据特定计算机结构设计,因此他们被统称为低级语言。低级语言与高级语言的区别在于,高级语言更接近人类使用的自然语言,而且可移植性好,可以更容易地描述计算问题并利用计算机解决计算问题。

1.1.3 通用编程语言与专用编程语言

通用编程语言指能够用于编写多种用途的程序的编程语言(相对于专用编程语言而言),这类编程语言的语法中没有专门用于特定应用的特定程序元素。而专用编程语言则一般指应用于某一特殊领域的编程语言,这类语言的语法中通常包含有专门用于特定应用的程序元素,此外一些不含针对特定应用的程序元素的编程语言由于其应用领域较为狭窄,也被认为是专用语言。

在目前常见的编程语言中:C、C++、C#、Python、Go、Java等是通用编程语言,HTML、MATLAB、PHP、SQL、Verilog、JavaScript等是专用语言。

1.1.4 解释与编译

高级语言按执行方式的不同分为两类:静态语言与脚本语言。通过这两类高级语言编写的程序在计算机中有不同的执行过程:静态语言采用编译执行,脚本语言采用解释执行。但无论程序采用那种执行方式,用户使用程序的方法都可以是一致的。

编译是指将程序源代码一次性转换成目标代码的过程。这个过程通常由被称为编译器(Compiler)的执行编译过程的计算机程序来完成。通常,源代码是高级语言代码,目标代码是机器代码(二进制指令),编译器将高级语言源代码编译成机器语言目标代码,目标代码将被计算机执行。

解释是指将源代码逐条转换成目标代码同时逐条运行目标代码的过程。解释的过程是由根据源代码的行数和执行方式,逐条地提取源代码的内容将其转换为目标代码并同时运行的计算机程序——解释器来执行的。在解释的过程中,高级语言和数据被一同输入给解释器,然后输出运行结果。

解释和编译的区别在于:编译是一次性地翻译源代码,一旦程序被编译得到目标代码后,再次执行程序时就不必再次进行编译。而解释在每次运行时都需要解释器对源代码进行解释,即每次运行时都同时需要源代码与解释器。对于静态语言来讲,由于编译只进行一次,所以程序的执行速度与编译过程的速度无关,目标代码的运行速度才是关键。因此,编译器上一般都尽可能多地集成优化技术,使生成的目标代码具备更好的运行效率。而对于脚本语言而言,由于程序在解释的过程中运行,故程序的运行速度与解释器解释的速度息息相关。因此,解释器上一般不会集成太多的优化技术,以防消耗时间,影响程序的运行效率。解释的执行性能虽然略低,但是它却可以很好的支持跨硬件或操作系统平台,而且对于源代码的保留也对日后的升级维护提供了方便,非常适合一些非性能关键的程序运行场景。

执行方式优点
编译对于相同源代码,编译可以应用更多的优化过程,生成的目标代码执行速度更快。对于目标代码不需要编译器就可以执行,在同类型的计算机操作系统上使用灵活
解释解释执行需要保留原代码,为日后的程序纠错与维护提供方便。而且只要存在解释器,源代码就可以在任意操作系统上执行,可移植性好

在常见的编程语言中:C、C++、Java等都属于采用编译执行的静态语言。JavaScript、PHP、Python等都属于采用解释执行的脚本语言。

1.2 C++概述 1.2.1 C++简史

1970年代,贝尔实验室的D.M.Ritchie致力于开发UNIX操作系统,他需要一种简洁,能生成快速、高效的程序,并且能够有效控制硬件的语言来完成这项工作。Ritchie希望这种语言能将低级语言的效率、硬件访问能力和高级语言的简洁性、通用性和可移植性融合在一起。于是他在B语言的基础上保留了它简练、更接近硬件等特点,设计出了C语言。1980年代贝尔实验室的Bjarne Stroutstrup提出了C++语言。C++语言是C语言的扩充:C语言是一种过程性语言(有关过程性语言的相关概念会在后文阐述),C++在C的基础上增添了面向对象编程、泛型编程的新特性,同时C++保留了C高效灵活、可移植性好、易于理解等优点,克服了C语言类型检查不严格、程序较大时难以查找和排除错误等缺点。Bjarne Stroutstrup为C++加入了新的特性,但并没有对C语言的组件进行多大的改动,因此,理论上C++是C的超集,任何有效的C程序都是有效的C++程序,C++可以使用已有的C库(库是编程模块的集合,可以从程序中调用它们)。C++语言诞生后,几经修改完善,于1998年颁布了ISO/MSIC++语言标准,目前C++语言仍在不断完善。下面我们将大致了解C++的各种特性。

1.2.2 过程性编程思想与结构化编程技术

C++在C的基础上增添了新的编程理念,在了解C++的新特性之前,我们先来看一下C所遵循的旧的编程理念。

首先我们来看一下计算机语言一般都要处理的两个概念——数据和算法。简单来讲,数据就是程序要处理和使用的信息,而算法就是程序处理和使用信息时所用的方法。数据与算法共同构成了程序。

C语言在问世时属于过程性语言,过程性语言在编程中强调的是算法方面。过程化编程首先需要确定程序应采取哪些操作,然后再使用编程语言来实现操作,最后程序按照一系列流程生成特定的结果。

然而,随着程序规模的扩大,过程化编程会产生一些不可避免的问题:由于程序经常使用分支语句,有许多旧式程序的执行路径非常混乱,这对程序的阅读与理解造成了极大的困难。为解决这种问题,人们开发了一种更有序的编程方法——结构化编程。C具有使用这种编程方法的特性。结构化编程,顾名思义,就是把程序的分支限制为一小组行为良好的结构,用各种行为良好的结构来代替传统的分支,避免混乱的路径。结构化的程序由一些简单、有层次的程序流程框架组成,基本可分为顺序、选择与循环。C语言的词汇表中也包含有这些结构。

结构化编程带来的一个新原则是:自顶向下的设计。其理念是将大型的程序分解成小型的易于管理的任务,如果任务仍然过大,就继续将其分解为更小、更简单、更易于编写的结构。C语言中鼓励使用这种方法,C中程序员可以通过编写函数(程序单元)来表示各个任务模块。结构化编程技术反映了过程性的编程思想。

1.2.3 面对对象编程和泛型编程

接下来,我们来了解一下,C++在C的基础上新增加的特性——面对对象编程和结构化编程。

C++支持面对对象的程序设计方法,这种设计方法简称OOP(Object Oriented Programming)。OOP是对结构化设计以及模块化、数据抽象等方法的发展。与强调算法的过程性编程不同,OOP强调数据。OOP所关注的不是解决问题的过程,而是问题本身。

在进一步了解OOP的编程方法之前,我们首先要明确一下类和对象的概念。在C++中,类是一种规范,它描述了某种新数据的格式,而对象则是根据这种规范构造的特定数据结构。通俗的来讲,客观世界中的任何事物都可以称之为对象,对象是某种特性和某种功能的事物,把具有共同特征(属性)和操作(方法)的对象抽象出来便形成了类。对象是类的具体化,是某一个类的一个实例,例如:我们抽象出一个长方形的类,这个类中有长方形的各种属性(长、宽)还有对长方形的操作(求面积、求周长),之后我们定义了一个具体的长为2宽为4的长方形,这个具体的长方形就是我们这个长方形的类的一个对象。面对对象的程序主要就是由类和对象建立起来的。

OOP程序设计方法首先需要设计类,通常,类规定了可以用来表示对象的数据以及可以对这些数据所执行的操作,它们准确的表达了程序要处理的东西。之后我们就可以设计一个使用类的对象的程序,程序将根据类的定义创建一个对象,该对象保存了所有的用来表示它的数据值,程序也可以通过类中的方法来对对象进行操作。这种从类(低级组织)到程序(高级组织)的处理过程被称为自下向上的编程。

OOP程序主要是由类和对象建立起来的,具有封装性、继承性、和多态性的特点。

  • 封装:封装是一种信息隐藏技术,通过封装将数据和其有关的行为隐藏起来,而将一部分行为作为对外的接口。在OOP的程序概念中,把数据和与这些数据有关的操作结合在一起形成一个有机的整体,称为封装。C++中封装是由类实现的。
  • 继承:继承,顾名思义,它使某个类除了具有特定的属性和方法外,还可以继承其他类的属性和方法。继承是OOP中最重要的特征,C++提供的类的继承机制允许我们在保持原有类的基础上,通过继承进行扩充为新的类。
  • 多态:多态性是指不同的对象接受到不同的消息时会产生不同的动作。C++支持两种多态性,一种是程序编译时的静态多态性,一种是程序运行时的动态多态性。静态多态性通过函数重载实现,动态多态性通过虚函数机制实现(这两种方式会在以后的文章中进行讲解)。
    封装可以保护数据,避免其遭受不适当的访问;继承可以让我们使用旧类派生出新类;多态让我们可以为运算符和函数创建多个定义,然后通过程序上下文来确定使用哪个定义。OOP将重点放在了表达概念上,而不是任务的过程上。

此外,OOP方法有助于创建可重用的代码。这也体现了C++真正的优点之一:可以方便的重用和修改现有的代码。

C++还支持另外的一种编程模式:泛型编程。它与OOP的目标类似,都是希望可以让重用代码和抽象通用概念的技术更加简洁。不过泛型编程与OOP的区别在于:OOP强调编程的数据方面,而泛型编程强调的的却是要独立于特定的数据类型。泛型具有在多种数据类型上皆可操作的含义,这点与模板类似,它指的是创建独立于类型的代码。泛型编程需要对语言进行扩展,以便只编写一个泛型(不是特定类型的)函数就能将其用于各种实际类型。C++也提供了完成这种任务的机制。

C++融合了传统的过程性方法、OOP和泛型编程的理念,OOP赋予了C++高级抽象的能力,C语言的部分则为C++提供了低级的硬件访问,赋予了C++紧密联系硬件的能力。C++所强调的实用价值成就了C++的广泛传播。

1.3 C++程序开发概述 1.3.1 C++程序开发过程

一个C++程序通常由程序开发环境、C++语言和C++标注库组成。在C++程序开发环境下,一个C++程序的开发通常可以大致分为编辑(edit)、预处理(preprocess)、编译(compile)、链接(link)、装入(load)、执行(execute)六个阶段。一般在开发环境中,除编辑源代码需要我们自己完成外,其余的步骤都可以通过计算机程序自动完成。

  • 编辑:使用编辑程序编辑修改程序,将其保存在文件中,这个文件即为程序的源代码(文件拓展名一般为.cpp)
  • 预处理、编译:这两个步骤通过编译程序来完成。预处理阶段处理各种预处理命令,并生成一个临时C++源代码文件,交由编译阶段进行语法检查和语义分析。编译阶段将源代码文件翻译生成目标代码(Object Code)文件(文件拓展名一般为.obj)。
  • 链接:连接阶段将目标代码和其他代码连接起来。连接程序将目标程序(可能有多个,一个.cpp文件生成一个)与C++标准库的代码拼装成一个完整的可执行文件(文件拓展名一般为.exe)
  • 装入:装入程序将可执行文件存入计算机主存,并为程序的执行做好一切准备。
1.3.1 各阶段常见错误

在上述各阶段中都可能出现错误,其中语法错误最为常见,但同时语法错误也最容易修改和排除。这类错误可以由编译器找出并给予提示。程序运行期间也可能会出现导致程序终止执行的致命错误,这类错误通过分析程序流程也比较容易排除。还有最难排除的两类错误——程序的逻辑错误和非致命性错误,这两类错误需要仔细查看程序,并利用相关方法和技巧予以排除。

总结:

本章介绍了入门学习C++语言的一些预备知识、C++语言的3种特性与C++程序开发的大致流程。程序设计语言主要分为两类:针对特定硬件的低级语言和可以跨平台运行和可移植性较好的高级语言,C++语言是一种高级语言。C++与通过解释执行的脚本语言不同,C++属于静态语言,在运行过程中需要编译器将源代码转换为机器代码。C++在C结构化编程的基础上新增添了OPP和泛型编程的新特性。由于C++是C的拓展,有效的C程序也是有效的C++程序,C++也可以使用C库,这也使得C++不仅具有高级抽象的能力还具有低级硬件访问能力。此外C++的新特性还有助于提高模块化和创建可重用代码,节省了编程时间,提高了编程效率与可靠性。C++程序的开发一般要经过6个阶段,我们在开发环境下,可以在编辑器中编写C++语言程序,并保存为源代码文件,它们通过编译程序进行预处理与编译生成机器代码组成的目标文件,最后通过链接生成计算机可以执行的可执行文件。C++的种种新特性使得C++至今仍然在被广泛的使用。

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


网站栏目:easy-cpp系列简明C++教程(第一章)-创新互联
网页URL:http://azwzsj.com/article/idejc.html