书稿1.docx
《书稿1.docx》由会员分享,可在线阅读,更多相关《书稿1.docx(75页珍藏版)》请在冰豆网上搜索。
![书稿1.docx](https://file1.bdocx.com/fileroot1/2022-11/25/edb814ed-0c00-4633-a505-3a95e42c775e/edb814ed-0c00-4633-a505-3a95e42c775e1.gif)
书稿1
第一章C++概论(一级标题)
C++是一种应用广泛的面向对象程序设计语言,C++是由C发展而来,它保留了C语言的所有优点,即可以用于面向过程的结构化程序设计,又可以实现面向对象程序设计。
本章主要讲述C++的特点和语法、C++程序的实现过程和VisualC++集成开发环境。
1.1C++语言特点(二级标题)
在具体讲述C++语言的特点之前,先来了解一下什么是程序和程序设计语言。
1.1.1程序和程序设计语言(三级标题)
自1946年世界上第一台电子计算机问世以来,计算机科学及其应用得到了迅猛的发展,计算机已被广泛地应用于人类生产、生活的各个领域,成为人们日常工作、生活、娱乐的一种现代化工具,计算机已将人类带入了一个崭新的信息技术时代。
对于当代大学生而言,掌握一门计算机程序设计语言是十分必要的。
那么什么是计算机呢,对大多数人来说对计算机可能并不陌生,但是对不熟悉计算机的人来说就会感到它很神秘。
其实,计算机只不过是一种具有内部存储能力、在程序的控制下自动工作的电子设备。
一台计算机由硬件系统和软件系统两大部分,硬件是物质基础,而软件可以说是计算机的灵活,没有安装软件的计算机只能是一台“裸机”,什么也干不了,有了软件才能成为一台真正的“电脑”。
而所有软件都是用计算机语言编写的。
人们将需要计算机做的工作写成一定形式的计算机能够识别的指令,并把它存储在计算机内部的存储器中,当人们给出指令后,它就会按照指令操作顺序自动工作。
人们把这种可以连续执行的一条条指令的集合称为程序,而程序是用程序设计语言来编写的。
程序设计语言按照语言级别可以分为低级语言和高级语言。
低级语言有机器语言和汇编语言。
高级语言则主要有过程式语言(如C、Basic以及Pascal等)、面向对象语言(如C++、Java等)、应用式语言(如Lisp)以及基于规则的语言(如Prolog)等。
1.机器语言
机器语言是计算机硬件可以直接识别的语言,它完全用0和1组成的代码表示,也是最低层的程序设计语言。
用机器语言编写的程序中,每一条机器指令都是二进制形式的指令代码。
机器语言是面向机器的,不同的计算机硬件(主要是CPU)其机器语言是不同的,因此,针对一种计算机所编写的机器语言程序不能在另一种计算机上运行。
有了机器语言,人们就可以用机器语言编写程序,然后输入计算机,计算机就可以通过运行程序来体现人们的意图,计算或处理相应的问题。
2.汇编语言
由于机器语言是面向具体机器的,所以其程序缺乏通用性,编写程序的过程繁琐复杂,易出错,错了又不易查找和修改,编出的程序可读性差。
繁杂的机器代码程序很难记忆,未受过专门训练的人又不易掌握,这严重阻碍了计算机的应用和发展。
于是,人们又在机器语言的基础上研制了汇编语言。
汇编语言采用符号(称为指令助记符)表示指令,比机器语言的指令代码易于记忆。
用汇编语言编写的程序(又称源程序)经汇编器加工处理后,就可转换成在计算机上可以直接执行的机器语言程序。
汇编语言实质上是机器语言的符号化形式,仍属面向机器的一种低级语言。
3.高级语言
由于汇编语言也依赖于计算机的硬件体系,且助记符量大难以记忆,于是人们又发明了更加易用的所谓高级语言。
这种语言其语法和结构更类似普通英文,且通用性好,不必对计算机的指令系统有深入的了解就可以编写程序。
采用高级语言编写的程序在不同型号的计算机上只需做某些微小的改动便可运行,对这些高级语言程序只要采用对应计算机上的编译程序重新编译,即把由高级语言编写的源程序转换成机器能够接受的机器语言程序,这些程序就可以在不同的机器上运行。
这种具有翻译功能的程序称为编译程序,每一种高级语言都有与之对应的编译程序。
1.1.2C++语言的特点(三级标题)
C++语言于20世纪80年代由贝尔实验室设计并实现,它是在C语言的基础上发展起来的,既支持传统的面向过程的程序设计,又支持面向对象的程序设计。
C语言是在B语言的基础上由美国Bell试验室的Dennis.M.Ritchie于1972年设计实现的,改进了B语言的缺陷,其设计目标是即保持BCPL和B的精练性及接近硬件的特点,并且增加了这些语言的通用性。
由于C语言简洁,功能强大,运行速度快,一直是非常重要的程序设计语言之一。
较之其他高级的语言,C语言的特点主要表现在:
(1)功能强,应用广泛;
(2)语句简洁,表达能力强;(3)运算符丰富;(4)数据结构丰富,具有现代化语言的各种数据结构;(5)具有结构化的控制语句;(6)程序设计自由度大;(7)C语言允许直接访问物理地址,能够进行位操作,能够实现汇编语言的大部分功能,可以直接对硬件进行操作,既有高级语言的功能,又有低级语言的功能;(8)生成目标代码质量高,程序执行效率高;(9)可移植性好。
除了上述优点之外,C语言也有它的局限性:
(1)C语言的类型检查机制相对较弱,有些错误不能在编译阶段检查出来;(2)C语言本身几乎没有支持代码重用的语言结构(3)当程序的规模达到一定的程度时,程序员就很难控制程序的复杂性。
与C语言不同,C++是一种广泛使用的面向对象的程序设计语言,C++语言包括了C的所有特征、属性和优点(如高效、灵活性),同时改进了C的一些不足,并且支持面向对象的程序设计。
C++语言的特点:
(1)保持与C兼容;
(2)可读性更好,代码结构更合理;
(3)生成代码的质量高;
(4)可重用性、可扩充性、可维护性和可靠性有所提高;
(5)支持面向对象的机制
C++语言中与面向对象有关的特征是:
(1)类和数据封装
C++支持数据封装,将数据和对该数据的操作的函数封装在一起作为一种数据类型,称为类。
同时提供一种对数据访问严格控制的机制,封装体通过操作接口与外界交换信息。
(2)结构作为一种特殊的类
在C语言中可以定义结构体,但是这种结构只包含数据,而不包含函数。
C++中的类是数据和函数的封装体,在C++中结构可以作为一种特殊的类。
(3)构造函数和析构函数
构造函数是类内和类同名的成员函数,创建对象时对类的数据成员进行初始化。
析构函数的功能是用来释放对象。
(4)私有、保护和公有成员
C++类中可以定义三种不同访问控制权限的数据成员。
它们分别是私有(private)、保护(protected)和公有(public)成员。
私有成员只有类本身定义的函数才能访问,而类外的其它函数不可以访问。
保护成员只有派生类可以访问,而在类外不可以访问的成员。
公有成员是在类外也可以访问的成员,是该类与外界的接口。
(5)对象和消息
对象是类的实例,对象之间通过消息来实现合作,共同完成某一任务。
每个对象根据收到消息的性质来决定需要采取的行动,以响应这个消息。
(6)友元类和友元函数
类中的私有成员是不允许类外的任何函数访问的。
但是友元打破了类的这一限制,破坏了类的封装性,它可以访问类的私有成员。
友元可以是类外定义的整个类,称为友元类,也可以是类外的函数,称为友元函数。
(7)运算符和函数名重载
函数名重载和运算符重载都属于多态,多态是指相同的语言结构可以代表不同类型的实体,或者对不同类型实体进行操作。
C++允许相同的运算符或标识符代表多个不同实现的函数,这就称标识符或运算符重载,用户可以根据需要定义标识符重载或运算符重载。
(8)派生类,继承性
一个类可以根据需要生成派生类,派生类继承了基类的所有方法,同时还可以定义新的不包含在父类中的方法。
派生类包含从父类继承过来的数据成员和自己特有的数据成员。
(9)虚拟函数,多态性,动态联编
C++可以定义虚函数,通过虚函数实现动态联编。
动态联编是多态的一个重要特征。
多态性形成由父类和它们的子类组成的一个树型结构。
在这个树中的每一个子类可接收一个或多个具有相同名字的消息。
当一个消息被这个树中的一个类的一个对象接收时,这个对象动态地决定给予子类对象的消息的某种用法。
多态中的这一特性允许使用高级抽象。
1.2C++程序的实现(二级标题)
图1.1C++程序的实现过程
一般把由高级语言编写的程序称为源程序,这种程序不能在机器上直接运行,只有把它转换为由二进制代码表示的目标程序后,才能在机器上运行。
与其他高级语言一样,C++程序的实现要经过编辑、编译、组建和运行几个步骤,其过程如图1.1所示。
1.编辑
编辑是将编写好的C++源程序输入到计算机中,并生成磁盘文件的过程。
C++程序的编辑可以利用计算机软件所提供的某种编辑器进行编辑,然后将C++程序的源代码存放到磁盘文件中,磁盘文件的扩展名是.CPP。
在实际应用中,所选用的C++编译器本身都提供编辑器的功能,使用所选用的C++编译器中的编辑器来编写C++源程序是十分方便的。
例如,MicrosoftVisualC++6.0版本就提供编辑功能,将C++程序输入后,指定文件名便可存入磁盘文件。
然后,选用编译菜单项,便可编译执行。
其他的C++编译器也都有编辑功能,可用它来进行源程序编辑,不必再去选用其他编辑软件。
编辑器所采用的编辑方法都大致相同,采用全屏幕编辑方法。
插入、覆盖、删除等简单操作都与Word相同或相近,也有块操作功能。
例如,删除块、复制块、移动块都可以通过编辑菜单中的菜单项进行。
2.编译
C++是以编译方式实现的高级语言。
C++程序的实现,必须要使用某种C++语言的编译器对程序进行编译。
编译器的功能是将程序的源代码转换成为机器代码的形式,称为目标代码。
源程序进行编译时,首先要经过预处理过程,如果源程序中有预处理命令,则先执行这些预处理命令,执行后再进行后面的编译过程。
如果程序中没有预处理命令,就直接进行后面的编译过程。
C++编译过程主要是进行词法分析和语法分析的过程,又称源程序分析。
这阶段基本与机器硬件无关,主要进行的是对程序的语法结构进行分析,发现不符合要求的语法错误,并及时报告给用户,显示在屏幕上。
在这个过程中还要生成一个符号表。
最终生成目标代码程序,完成编译阶段的任务。
整个编译过程主要完成以下工作:
(1)词法分析。
主要是对由字符组成的单词进行词法分析,检查这些单词使用的是否正确,删除程序中的冗余成份。
单词是程序使用的基本符号,是最小的程序单元。
按照C++所使用的词法规则逐一检查,并登记造册。
发现错误,及时显示错误信息。
(2)语法分析。
语法又称文法,主要是指构造程序的格式。
分析时按该语言中使用的文法规则来分析检查每条语句是否有错误的逻辑结构,如发现有错误,便及时通报用户。
(3)符号表。
符号表又称字典。
它用来映射程序中的各种符号及它们的属性,例如,某个变量的类型、所占内存的大小和所分配的内存的相对位置等。
该表是在进行词法分析和语法分析时生成的,它在生成中间代码和可执行的机器代码时使用。
(4)错误处理程序。
在进行词法分析和语法分析过程中将所遇到的语法错误交给该程序处理,该程序根据所出现的错误的性质分为警告错和致命错显示给用户,并且尽可能指出出错的原因,供用户修改程序时参考。
(5)生成目标代码。
将词法分析和语法分析的结果以及使用符号表中的信息,由中间代码进而生成机器可以执行的指令代码,又称为目标代码。
将这些代码以.OBJ为扩展名存在磁盘文件中,称为目标代码文件。
这种文件中的代码机器可以识别,但是计算机并不能直接执行,还需要对它进行组建,才能生成可执行文件。
3.组建
编译后的目标代码文件还不能由计算机直接执行。
因为编译器对每个源文件分别进行编译,如果一个程序有多个源文件,编译后这些源文件的目标代码文件还分布在不同的地方,因此需要把它们组建到一块。
即使该程序只有一个源文件,这个源文件生成的目标代码文件还需要系统提供的库文件中的一些代码,因此,也需要把它们组建起来。
总之,基于上述原因,将用户程序生成的多个目标代码文件和系统提供库文件中某些代码组建在一起还是十分必要的。
这种组建工作由编译系统中的组建程序(又称组建器)来完成。
组建器将由编译器生成的目标代码文件和库中的某些文件组建处理,生成一个可执行文件,可执行文件的扩展名为.EXE,因此,有人又称它为EXE文件。
库文件的扩展名为.LIB。
4.运行
一个C++的源程序经过编译和组建后生成了可执行文件。
运行可执行文件的方法很多,一般在编译系统下有运行功能,通过选择菜单项便可实现。
也可以在MS-DOS系统下,在DOS提示符后,直接输入可执行文件名,按回车键即可执行。
有时需要给出可执行文件的全名,包含路径名,扩展名一般省略。
如果需要参数,还应在命令行中命令字的后面输入所需要的参数。
程序被运行后,一般在屏幕上显示出运行结果。
用户可以根据运行结果来判断程序是否还有算法错误。
一个程序编好后,在生成可执行文件之前需要改正编译和组建时出现的一切致命错和警告错,这样才可能生成无错的可执行文件。
在程序中存在警告错时,也会生成可执行文件,但是一般要求改正警告错后再去运行可执行文件。
有的警告错会造成结果的错误。
1.3C++程序结构的特点(二级标题)
本节通过几个例子让大家对C++程序的结构有一个大体上的认识,以使读者对C++语言程序的构成有一个初步的了解。
1.3.1一个简单的C++语言程序(三级标题)
首先介绍一个简单的C++程序,使读者对C++程序有一个大概的了解。
下面的例子虽然简单,但反映了一般C++程序的特点以及基本的组成。
例1.1编写一个C++程序,其功能是显示字符串"thisismyfirstC++program."。
其C++程序如下:
#include//包含头文件iostream.h
usingnamespacestd;//使用命名空间std
intmain()//主函数
{
cout<<“ThisismyfirstC++program.\n”;//输出一行字符
return0;
}
这个程序的运行结果是在显示器屏幕的当前光标位置处显示句子:
ThisismyfirstC++program.
程序的第一行:
#include通常称为命令行,命令行必须用符号“#”开头,一对尖括号中的iostream是系统提供的文件名,全称是iostream.h,文件中包含着有关输入输出函数的信息;调用不同的标准库函数,应包含不同的头文件,随着课程的深入,将在以后的章节中陆续介绍相关的头文件。
第二行语句usingnamespacestd;的功能是在使用系统库时使用命名空间std;
第三行中main是主函数名,其后的一对圆括号中间可以是空的,但是这一对圆括号不能省略,main()是主函数的起始行,一个C++程序可以包含任意多个不同名的函数,但是必须有而且只有一个主函数,一个C++程序总是从主函数开始执行。
主函数后面由一对花括号{}括起来的部分是主函数体,其中的语句是实现程序的具体功能。
函数体用左花括号“{”开始,右花括号“}”结束。
期间可以有定义部分和执行部分,定义部分主要是对要用到的变量进行说明,执行部分主要是实现程序的具体功能,执行部分的语句称为可执行语句,必须放在说明部分之后,语句的数量不限,程序中的这些语句向计算机系统发出操作命令。
C++的每一条定义语句和执行语句都要以分号“;”作为结束,分号是C++语句的一部分。
在程序中可以对程序进行注释,编译器在对程序进行编译时忽略注释的内容。
注释有两种方法,第一种方法为行注释,以“//”开始到本行结束的任何内容均为注释。
第二种为块注释或段注释,用符合“/*”和“*/”括起来的内容为注释,“/*”和“*/”必须成对出现,“/”和“*”之间不能有空格。
注释可以用中文,也可以用西文。
注释可以出现在程序中任何需要的地方,注释部分对程序的运行不起作用,使用注释的目的只是使程序员可以在源程序中插入一些说明解释性的内容。
在注释中可以说明变量的含义,程序段的功能,主要是帮助人们阅读程序。
1.3.2C++程序结构及书写格式(三级标题)
下面再举几个例子让大家熟悉C++程序的结构与书写格式
例1.2输入矩形的两条边,求矩形的面积。
程序如下:
#include
voidmain()
{
doublea,b,area;
a=1.2;
b=1.5;
area=a*b;
cout<<"a="<}
程序的运行结果为:
a=1.2b=1.5area=1.8
以上程序中main()后一对花括号括起来的部分称为函数体,其中,程序的第4行为函数的说明部分;第5到8行是函数的执行部分。
第8行为输出语句,功能是输出a,b和area的值。
例1.3从键盘输入一个直角三角形两边a和b的长度,求其斜边长度。
程序如下:
#include
#include
usingnamespacestd;
voidtriangle(doublex,doubley)
{doublez;
z=sqrt(x*x+y*y);
cout<<"hypotenuse="<}
voidmain()
{doublea,b;
cout<<"inputaandb:
";
cin>>a>>b;
triangle(a,b);
}
程序运行结果为:
inputaandb:
34
hypotenuse=5
这个程序包含了两个函数:
一个是用于计算直角三角形斜边长度的函数triangle(),一个是主函数main()。
主函数中首先要求从键盘输入两直角边a和b的值,然后调用计算斜边长度的函数triangle()。
从上面几个例子可以看出每个程序都包含命令行,它们都以“#”开头,其作用是提供标准的库函数,用户自定义类库和函数。
每个程序都有一个main()函数,它是程序的入口,每个程序都从这里开始执行。
除了main()函数外,还可以定义其他的函数,整个C++程序可以说是由若干函数组成。
每个程序都包含对变量和函数的说明,同时还有输入和输出功能。
一个C++程序的一般格式如下:
#include<……>//命令行
函数原型//程序中用到的函数的说明
全局数据定义//程序中用到的全局数据的定义
voidmain()
{
…//main()函数体,由多条语句组成
}
函数定义//程序中用到的函数的具体实现
其中函数原型给出了函数的说明,包括函数返回值类型、函数名和参数;函数的定义部分给出了函数的具体实现。
一个C++程序并不一定严格按照上述要求来写,有些部分可以没有。
1.4VC++6.0主窗口(二级标题)
VisualC++6.0集成开发环境是一个功能强大的程序开发环境,开发环境主窗口由标题栏、菜单栏、工具栏、项目工作区、主工作区、输出窗口和状态栏组成,如图1.2所示。
图1.2VisualC++6.0集成开发环境
(1)标题栏位于主窗口顶端。
标题栏显示应用程序项目名称和当前打开的文件名称。
(2)菜单栏位于标题栏下方,包含集成开发环境中所有功能命令。
图1.3项目工作区面板
(3)工具栏位于菜单栏的下方,提供了实现集成开发环境某些命令的快捷方式。
命令以图标的形式出现在工具栏中,要执行某个命令只需按下相应的图标按钮即可。
(4)工具栏下方左侧是当前工程的项目工作区,包含三个标题面板,如图1.3所示。
从左到右依次为类视图(ClassView)资源视图(ResourceView)和文件视图(FileView),可以通过单击下方的标签进行面板的切换。
类视图面板中显示程序中所定义的C++类,通过此面板可以针对类、类成员进行快速定位、编辑,还可以添加新类,创建函数或声明方法等。
资源视图面板显示程序中所用到的资源文件,包括菜单、工具栏、图标、位图、对话框等,通过该面板还可以添加或删除资源文件。
文件视图面板中显示项目之间的关系,以及包含在项目工作区中的文件,这里给出各项目文件间的逻辑关系,当双击某一项时,将会以对应的方式打开该项目。
程序代码文件将在代码编辑窗口中打开,资源文件将在对应的资源编辑器中打开。
当需要对资源文件进行编辑时,可以通过在资源面板中双击所需要编辑的对象,打开相应的资源编辑器进行编辑。
通过这些不同的视图,可以从不同角度对程序中相关内容进行查看和编辑。
例如,在类视图面板中可以通过双击某一项打开代码编辑窗口进行查看/编辑;在文件视图面板中双击某一代码文件名称,也可以打开代码编辑窗口进行查看/编辑。
不过,在类面板中打开时是直接定位光标到双击的项所在行,而在文件视图面板中打开时是定位到所打开的文件当前编辑位置。
(5)项目工作区的右侧是VisualC++6.0集成开发环境的主工作区,当在项目工作区中双击某一项时,将在这里以相应的工具打开显示该项的内容。
例如,在文件视图中双击某一代码文件名称项时,将在主工作区打开代码编辑窗口进行编辑;而在资源视图面板中双击某一项时,则将在该区域打开相应的资源编辑器以供编辑。
(6)在项目窗口的下方是输出窗口,这里用于显示程序编译、组建、调试等过程中的输出内容。
(7)VisualC++6.0集成开发环境的最下方是状态栏。
根据当前工作的不同,状态栏中将显示出相应的信息,如光标位置、插入/改写方式等。
1.5C++上机过程(二级标题)
前面已经说过一个C++程序的实现需要经过编辑、编译、组建和运行几个步骤,下面以VisualC++6.0为环境介绍C++的上机过程。
1.源程序的输入
用户在纸上写好的C++程序,只有输入到计算机内经过处理后才能运行,这样首先就要输入源程序到计算机,建立源程序文件。
(1)启动VisualC++6.0开发环境
从“开始”菜单中选择“程序”,然后选择“MicrosoftVisualStudio6.0”,再选择“MicrosoftVisualC++6.0”,显示VisualC++6.0开发环境主窗口。
如图1.2所示。
VisualC++6.0开发环境主窗口也可以通过直接双击Windows桌面上的“MicrosoftVisualC++6.0”图标来启动。
(2)创建C++文件
在主窗口的菜单栏,单击File菜单项,然后选择New(新建)命令,显示New(新建)对话框,如图1.4所示。
图1.4新建对话框
单击New对话框的Files(文件)标签,在New对话框的Files选项卡中选择C++SourceFile一项,并在右边的File(文件)文本框中填入文件名称,如test1,可以省略文件的扩展名.CPP;同时在Location文本框中输入希望保存文件的目录名,如图1.5所示。
图1.5新建对话框(输入文件名和目录名)
单击OK(确定)按钮,完成新建C++源程序文件,返回VisualC++6.0主窗口(这时可以在编缉窗口输入源程序)。
接下来在编辑窗口中输入源程序,源程序输入完成并检查无误后,应将它保持在磁盘文件中,其过程是:
在菜单栏中选择“File”(文件)命令,再在下拉菜单中选择“Save”(保存)命令。
2.编译
用户输入源程序后,计算机还不能立即执行,还必须对源文件进行编译。
对C++源程序进行编译的操作过程是:
单击主菜单中的“Build”(构建),在下拉菜单中选择“Compile<文件名>”命令,如图1.6所示。
图1.6选择编译菜单
如果是第一次编译该文件,VC会弹出一个如图1.7所示的对话框,询问是否建立一个项目工作区,单击“是”按钮即可。
图1.7是否建立一个项目工作区
这时系统开始对当