《C++程序设计》教案.doc_第1页
《C++程序设计》教案.doc_第2页
《C++程序设计》教案.doc_第3页
《C++程序设计》教案.doc_第4页
《C++程序设计》教案.doc_第5页
已阅读5页,还剩117页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C+面向对象程序设计教案C+程序设计教案说明:本教案在编写过程中参考了教学大纲中所列的参考文献,在此特向这些文献的作者表示感谢。在教案的撰写过程中,得到了信息工程学院领导和教师的支持与帮助,在此也向他们表示感谢。第一章 C+语言概述本章要点: 1、C+源程序的结构和开发过程 2、C+语言对C语言在非面向对象方面的增强1.1 C+语言的起源及特点1.1.1 从C到C+ C语言最初是美国贝尔实验室的戴尼斯M利奇(Dennis.M.Ritchie)在B语言的基础上开发出来的,并于1972年在PDP-11计算机上实现了最初的C语言。C最初用作UNIX操作系统的描述语言,但由于它运算符和数据结构丰富,程序执行效率高,语言简单灵活,可直接访问计算机的物理地址,有大量的库代码和较多的开发环境,具有良好的可读性和可移植性,支持结构化程序设计,所以很快广为流行,成为应用最广泛的程序设计语言之一。 然而,C语言仍存在一些局限: 1.C语言的类型检查机制相对较弱,使得程序中的一些错误不能在编译阶段由编译器检查出来。 2.C语言本身几乎没有支持代码重用的语言结构。 3.C语言不适合开发大型程序,当规模达到一定程度时,程序员就很难控制程序的复杂性。 4.C语言不支持面向对象的程序设计。 为了克服C语言的上述局限,1980年美国贝尔实验室的对C语言进行了扩充并命名为C+。1 1.2 C+的特点C+的特点主要表现在两方面:一是全面兼容C;二是支持面向对象的方法。1.C+完全包含C,是一个更好的C。保持了C的简洁、高效和直接访问计算机的物理地址等优点,并对C的类型系统进行了改革和扩充,比C更可靠。2.它与C完全兼容,使得许多C代码不经修改就可为C+使用,用C编写的众多库函数和实用软件可以直接用在C+中。 3.用C+编写的程序可读性更好,代码结构更合理,可直接在程序中映射问题空间的结构。 4.生成的代码的质量高,软件的可重用性、可扩充性、可维护性和可靠性等方面有更大提高,使得大中型程序的开发变得更容易。 5.支持面向对象的机制,可方便地构造出模拟现实问题的实体和操作。1.2 C+源程序的结构1.2.1 C+程序的一般格式 通过下面的实例简单说明C+程序的一般格式。 例1.1 计算两个整数的和。 / sum.cpp /本程序的文件名 # include /C+的预编译命令,其中的iostream.h是C+/定义的一个头文件,设置C+风格的I/O环境 int add(int a, int b) /函数原型的声明 int main() /主函数 int x,y,sum; /定义三个整型变量 cout”Enter two number:”x; /从键盘输入变量x的值 ciny; /从键盘输入变量y的值 sum=add(x,y); /调用函数add计算x+y的值并将其/赋给sum cout”The sum is:”sum”n”; /输出sum的值 return 0 int add(int a, int b) /定义add函数,函数值为整型 int c; /定义一个整型变量 c=a+b; /计算两个数的和 return c; /将C的值返回,通过add带回调用处 1.2.2 C+程序的结构特点 通过以上例子可以看出,C+程序的结构有以下特点: 1.C+程序通常由包括main()在内的一组函数组成,函数是构成C+程序的基本单位。其中名为main的函数称为主函数,可放在程序的前部、中部和后部,不论放在程序的什么部位,它总是第一个被执行的函数。因此,一个可运行的C+程序必须有主函数。其他函数都是被调用函数,它们可以是系统提供的库函数,也可以是用户自己编写的函数。用户自己编写的函数在使用前应给予“声明”。可以说,C+是函数式的语言,程序的全部操作都是由函数完成的。 2.C+的函数有函数的说明部分和函数体两部分组成。 函数说明部分 包括函数名、函数类型、函数参数(形式参数)及其类型。如例1.1中add()函数的说明部分为: int add (int a, int b) 函数类型 函数名 形参类型 形式参数 形参类型 形式参数 函数类型是函数返回值的类型,如int、float等。无返回值的函数是void类型。main()函数是由操作系统调用的函数,其返回值是void型或int型。当其返回值为int型时,可使用return语句从main()中返回一个值。例1.1中的返回值为零,意味着main()已被成功执行。函数参数可有可无,但函数后面的圆括号不能省略。 函数体 函数说明部分下面用花括号括起来的部分,它一般包括如下内容: 变量定义:如例1.1 main()中的int x,y,sum等。 执行部分:由若干语句组成,每条语句以分号结束。如例1.1 add函数中的”c=a+b;” 等。 在某些情况下,函数可以没有变量定义部分,甚至即可没有变量定义也可没有执行部分,此时,称该函数为空函数,它不执行任何操作,但合法。如: exem() 3.C+中的每条语句和变量定义必须以分号结束,即使是程序中的最后一条语句,也必须以分号结束,分号是C+的组成部分之一。正因为如此,可用任何格式书写C+程序,一行内可以写多条语句,一条语句也可分写在多行上。 应注意的问题: C源程序的扩展名是.c,而C+源程序的扩展名是.cpp。 常用的C+版本如Turbo C+、Borland C+都带有C和C+两种编译器,当源程序的扩展名是.c时,启动C编译器,当源程序的扩展名是.cpp时,启动C+编译器。1.2.3 C+程序的开发过程 1.程序开发工具 编制计算机程序使用的工具称为应用程序开发工具,也称为开发环境。一个完整的程序开发工具至少应具备如下功能: 源文件编辑功能 接受键盘输入,显示输入内容,允许用户对输入内容进行修改、编辑。 程序编译功能 必须有一个能把用户使用的高级语言程序变成机器语言程序的编译程序(也称为编译器或转换程序),该程序在编译的过程中具有发现程序语法错误的能力,该能力是评价编译程序的一个重要指标。 程序文件的连接功能 计算机程序由多个文件组成,它们可能是程序开发人员自己开发的,也可能是系统提供的,只有把它们按照程序的要求连接起来才能最终成为可执行文件。因此,开发工具必须具有程序文件的连接功能。 程序运行调试功能 应用程序中可能出现错误,开发工具必须具有程序的运行调试功能,并能及时反映调试信息,以便尽快修正错误。 程序文件管理功能 计算机程序由多个文件组成,开发工具应具有使用方便的浏览、创建、删除、改名等管理功能。 2.C+程序的开发过程 选择开发工具 C+开发工具很多,如Turbo C+、Borland C+、Visual C+6.0等。这里选用较为广泛的Visual C+6.0(以下简称VC6.0)。 用VC6.0建立Workspace 进入VC6.0后,选择File菜单的New命令,在New对话框中选择Projects选项卡,在该卡上选择Win32ConsoleApplication(控制台程序)工程选项,在Project name框中添入工程名称,最后按OK按钮。在以后的话框中选用默认设置,直到建立了工作空间为止。 建立并编辑程序使用File菜单的New命令,在New对话框中选择File选项卡,在该卡上选择SourceFile选项,在File框中添入文件名称,最后按OK按钮。此时,建立了一个扩展名为.cpp的空文件,可在此空文件上书写和编辑C+源文件。 编译源文件用工具栏中的编辑按钮编辑源文件。 连接用工具栏中的连接按钮连接文件。 运行用工具栏中的运行按钮运行文件。1.3 C+语言对C语言在非面向对象方面的增强 C+不但继承了传统C语言的精华,增加了面向对象的特征,还在非面向对象方面对C语言进行了增强。131 注释行 传统C语言提供的是块注释方式,其格式如下: /* explanation sentence */ C+中,除保留了C中的块注释方式外,又增加了更为方便的单行注释方式,其形式如下: / explanation sentence1.3.2 灵活的局部变量说明 传统C语言中,局部变量说明必须放在可执行代码的前面,数据说明语句和可执行语句的混合将引发编译错误。而C+中,允许在程序代码的任何地方对局部变量进行说明,所说明变量的作用域是从该变量说明的地方开始到该变量所在的最小分程序的末尾。如 for(int i=5; i可以处理从键盘上进行的标准输入,其使用格式如下: cin存放输入数据的变量名; 2.cout 是标准输出流,在程序中cout代表标准输出设备屏幕。使用cout并结合运算符可以处理标准输出即屏幕显示,其使用格式如下: cout 待输出的变量名或表达式; 3.运算符 运算符在C+中仍然保持C中“左移”和“右移”的功能,但当用于输入/输出时,通过重载扩充了他们的功能。重载后的运算符表示将从键盘上读取的数据传送给右面指定的变量,如:cinx;此时,从键盘输入的数值会自动转换为变量x的类型并存入x内。但应注意,变量x必须是基本数据类型,而不能是void类型。运算符允许连续输入一连串数据,例如:cinx y z;此时,它按书写顺序从键盘上提取所要求的数据并存入相应的变量中。应注意的是,连续输入的多个数据两两之间要用空白符(空格、会车或Tab键)隔开。 重载后的运算符表示将右面指定的变量的值显示在屏幕上。例如: couta;仍然要求变量a必须是基本数据类型,而不能是void类型。运算符允许连续输出一连串数据,也可以输出表达式的值。例如: cout x+ya和cout和cout也可用指定格式精心进行输入/输出。 C中常用n来实现换行,C+仍可使用它。同时,C+又增加了一个换行控制符endl,其作用与n一样。如下面的两条语句是等价的: cout ”x+y=”x+yn;cout ”x+y=”x+yendl; 例1.2 使用cin 或cout进行I/O操作的例。 # include void main() int age; char name20; cout“你好,请输入你的姓名和年龄:” name age; cout“你的姓名和年龄是:” name “ ” age endl; return 0; 1.3.4 结构、联合和枚举名作为类型名 C+中,结构名、联合名、枚举名都可直接作为类型名,再定义变量时,不用再在结构名、联合名、枚举名前面冠以struct、union、enum。例如,定义结构和枚举如下: struct string char *ptr; int length; ; enum bool FALSE,TRUE; 当定义变量时,C中必须写成: struct string str; enum bool done; 而在C+中,结构名string、枚举名bool都被直接作为类型名用,可以直接声明为: string str; bool done;1.3.5 无名联合 无名联合是C+提供的一种特殊联合,用来说明一组无标记名的、共享统一内存地址的数据项。如: union int i; float f; ;他声明了变量i和f具有相同的存储地址。无名联合通过使用其中数据项名直接存取,如可直接使用上面无名联合的变量i和f: i=20; f=15.0;1.3.6 强制类型转换 C中如果要把整型数据转换成浮点型数据,必须用下面的格式: int i=10; float f=(float)i; C+保留了这种强制类型转换方式,还提供了另一种方法,即把类型名作为函数名使用,这样就使类型的转换变成了函数的调用,不但方便,而且增强了可读性。使用这种方法,上面的语句就可改写为: int i=10; float f=float(i);1.3.7 const修饰符 C+除可用C中习惯使用的#define来定义常量外,还可使用const修饰符将一个标识符定以为常量,使该标识符的值在程序运行过程中不能以任何形式对其进行修改。例如: const int i=10;这时,标识符i被const声明为常量,它有类型,有地址,可用指针指向它,但不能修改它。 const可以和指针一起使用,有三种情况: 修饰指针所指向的变量,将该变量定义为常量。此时,指针变量的值可以改变,而指针所指向的变量的值不能改变。例如语句 const char *str=&c;声明了一个指针变量str,它指向变量c,但由于用const进行了修饰,所以,变量c变成了常量,其值不允许修改。而指针变量str的值可以修改。 将指针本身修饰为常指针,指针所指向的变量不受const修饰的影响,仍为变量。此时,指针变量的值不能改变,称为常指针,而指针所指向的变量的值可以改变。例如语句 char *const str=&c;声明了一个指针变量str,它指向变量c,但由于指针变量str用const进行了修饰,所以,变成了常量,其值不允许修改,而变量c的值可以修改。 将指针本身修饰为常指针,指针所指向的变量修饰为常量。此时,指针变量的值不能改变,被指针所指向的变量的值也不能改变。例如语句 const char *const str=&c;声明的指针变量str和指针所指向的变量c都被定义成常量,它们的值都不允许改变。 几点说明: 如果用const定义的是整型常量,则关键字int可以省略。 常量一旦被建立,在程序的任何地方都不能被修改。 与#define定义的常量不同,const定义的常量可以有自己的数据类型,从而使C+的编译器可进行更加严格的类型检查,具有良好的编译检测性。 const的作用与#define相似,但使用#define可能会带来程序的不安全性,如下面的程序:例1.3 使用#define可能会带来程序的不安全性的例#includemain()int a=1;#define T1 a+a;#define T2 T1-T1;cout”T2 is:”T2endl;return 0;初看程序,输出的结果是:T2 is: 0实际的输出结果是:T2 is: 2究其原因,是编译系统将语句:cout”T2 is:”T2endl;解释为:cout”T2 is:”a+a-a+aendl;如果用const取代上例中的两个#define语句,将不会引起这个错误。请看下例:例1.4 使用const会消除#define不安全性的例。#includemain()int a=1;const T1=a+a;const T2=T1-T1;cout”T2 is:”T2endl;return 0; 函数参数也可用const说明为常量,以保证实参在函数内部不被修改。 ANSI C标准也采用了const,但两者是有区别的,如下面的程序段在C+中是合法的,而在ANSI C中是不合法的:const int size=10;int chsize;另外,在ANSI C中const定义的常量是全局常量,而C+中const定义的常量要根据定义的位置来决定是局部的还是全局的。1.3.8 函数原型 C语言建议程序的编制者为程序中的每个函数建立原型,而C+则要求必须为每个函数建立原型,说明函数的返回值类型、函数名称、参数类型及个数。主要目的是在编译时检查调用函数是否与预先说明的原型一致,以维护程序的正确性。函数原型的一般格式为: 返回类型 函数名(参数表);参数表包括所用的参数和他们的类型,参数之间用逗号分开。 例1.5 函数原型声明的例。 #include void print(char *s); void main() print(“hello, lanzhou!”); void print(char *s) couts; 使用函数原型时应注意以下问题: 函数原型是一条语句,必须以分号结束。 函数原型的参数表中可以不包括参数的名字而只包括它们的类型,如语句 long aree(int,char); 是合法的。但函数定义中函数说明部分的参数必须给出名字,并且不能以分号结尾。 在程序中,函数原型要求出现在函数调用之前,但当一个函数的定义在前而调用在后时,可以不单独给出它的原型,此时的函数定义的说明部分就起到了函数原型的作用。 主函数不必说明原型,它被认为是一个自动说明原型的函数,且不存在被调用的问题。 C+的参数说明必须放在函数名后的括号内,不能放在函数说明部分与函数体之间,如下面的程序在编译时将会出错: #include void print(int,char); void main() print(“hello,china!”); void print(ch) char ch; /错误的参数说明方式 coutchendl; 原型中没有说明返回类型的函数(包括主函数main),C+默认它的返回类型为int,因此,下面的圆形说明在C+中是等价的: cat(int,char); /默认返回整型数 int cat(int,char); /指明返回整型数 如果一个函数没有返回值,则必须在函数原型中注明返回类型为void。当主函数没有返回值时,可以在main()前注明void,这样主函数中就不必有“return 0”之类的返回语句了。 如果原型中没有注明参数,C+假定给函数的参数表为空(void),因此,下面的原型说明在C+中是完全一样的: f(); /表示该函数不带任何参数 f(void); /表示该函数不带任何参数但在C中,上述两个原型说明是不同的: f(); /表示该函数的参数没有给出,它可能有多个参数 f(void); /表示该函数不带任何参数1.3.9 内联函数 C+提供了内联函数,在程序中调用内联函数时,编译器就用该函数的函数体中的代码替代函数调用表达式,这样,不但减少了函数调用时保留现场所用的开销,而且提高了程序的运行效率,同时消除了使用宏定义#define带来的不安全性(产生这个问题的原因是,C中宏定义#define的代码是被直接展开的,而C+的内联函数的代码是被替代的)。 要声明一个函数为内联函数,只要在函数说明的前面冠以关键字”inline”就行了。下面的程序中就定义了一个内联函数: #includeinline float circle(float r) /定义内联函数 return 3.1416*r*r; void main() cout” area of circle:” circle(3.0)endl; 使用内联函数应注意如下问题: 内联函数在调用前必须进行完整的定义,否则便一起将无法纸都应给用什么代码替代而出现错误。内联函数通常都出现在主函数之前。 当内联函数较长且调用较频繁时,将加大程序的长度。因此,通常将较短的函数定义为内联函数,而将较长的函数作为一般函数处理。1.3.10 带有缺省参数的函数 C+在允许在说明函数原型或函数定义时,为一个或多个参数指定缺省值,以后调用该函数时,若省略其中的某个参数,系统会自动以缺省值作为该参数的值。如一函数的原型说明如下: int func(int x=5,float y=2.3);则x与y的缺省值分别为5和2.3,下面的调用都是正确的: func(); /使用缺省值 func(10); /x使用实参值10,y使用缺省值2.3 func(3,4.5); / x和y分别使用实参值3,4.5 使用带有缺省参数的函数应注意如下问题: 当调用带有缺省参数的函数时,编译器按从左到右的顺序将实参传递给形参,因此,所有取缺省值的参数都必须出现在不取缺省值的参数的右边。也就是说,一旦开始定义取缺省值的参数,就不能再定义非缺省的参数,因此,下面的说明是错误的: int func(int x,float y=2.3,char k); 在函数调用时,若某个参数省略,则其后的参数都应省略而取缺省值,不允许某个参数省略后,再给其后的参数指定参数值。如下面的调用是错误的: func(10, ,a);1.3.11 函数的重载 在传统的C语言中,不允许函数同名,但在C+中,只要函数参数的类型不同,或参数的个数不同,或二者兼而有之,则两个或两个以上的函数可以使用相同的函数名。当两个或两个以上的函数使用同一个函数名时,称为函数重载,被重载的函数称为重载函数。下面是函数重载的例。 例:1.6 函数重载的例子。 #include int mul(int a, int b) return a*b; int mul(int a, int b, int c) return a*b*c; void main() int x=2,y=3,z=4; coutx*y=mul(x,y)endl; coutx*y*z=mul(x,y,z)endl; 程序的运行结果是: 2*3=6 2*3*4=24 这里强调的是: 重载函数必须在参数个数或参数类型上有所不同,不然的话,编译程序将无法确定调用哪个重载版本,即便是返回类型不同也不能区分。 一般而言,重载函数应执行相同的功能,例如,abc()函数返回一个数的绝对值,要重载成让他返回一个数的平方根是不可取的。1.3.12 作用域运算符 为了能对当前作用域之外的同名变量进行访问,C+提供了作用域运算符。通常情况下,如果有两个同名变量,一个是全局的,一个是局部的,则局部变量在其作用域内有较高的优先权。若要在局部变量的作用域内访问同名的全局变量,就必须在该全局变量前加上作用域运算符。请看下面的例子。例1.7 使用运算符的例。 #include int i; main() int i=2; i=10; cout”local variable i=”iendl; cout”globl variable i=”iendl; 该程序运行结果如下: local variable i=2; globl variable i=10;1.3.13 引用 引用是C+的新概念,它提供了一种能自动间接引用的指针。也就是说,比不使用间接引用运算符*,就可以得到一个引用值。引用可为变量(目标)起别名,主要用作函数的参数和函数的返回值。 1.引用的定义 引用的定义形式为: &引用名=目标名 其中,引用名是为引用型变量起的名字,必须遵守变量命名的规则。目标名可以是变量名,也可以是以后将要介绍的对象名。引用名前面的数据类型就是它所要引用的目标的数据类型。这里特别要指出的是,引用一旦建立,就以对应目标的内存单元地址作为自己的地址,并且不能再改变。当目标变化时,引用也随着变化,反之亦然。 例1.8 引用的例子。 #include void main() int i; int &j=i; i=10; cout”i=”i” j=”jendl; j=80; cout”i=”i” j=”jendl; cout”address of i:”&iendl; cout”address of j:”&jendl; 该程序运行结果如下: i=10 j=10 i=80 j=80 address of i:oxfff4 address of j:oxfff4由运行结果可以看出,i和j同步更新,并且使用同一个地址。此例的地址为oxfff4(注意:此地址视实际运行而有所不同)。 使用引用要注意如下事项: 定义引用时,必须立即对它进行初始化,不能定义完成后再赋值。下面的定义是错误的: int I; int &j; /错误 j=I; 为引用提供的初始值可以是一个变量或对象,也可以是一个引用。例如: int i=2; int &j=i; int &k=j; 引用不可重新赋值,也不可使其作为另一个变量的别名。例如: int i, k; int &j=i; j=&k; /错误 不能建立引用数组,不能建立指向引用的指针,也不能建立引用的引用,因此,下面的定义都是错误的: int &a3; int & *ptr; int &i; 当使用&运算符取一个引用的地址时,其值为所引用的变量的地址。例如: int a=5; int &b=a; int *p=&b;则p中保存的是变量a的地址。 2.引用参数 引用的一个主要用途是将引用作为函数的参数,这样,语法更简单,书写也更清楚。为此,先看一个个例子。 例1.9 采用按地址传递参数的例。 #include void swap(int *m, int *n) int temp; temp=*m; *m=*n; *n=temp; main() int a=1, b=2; cout”a=”a” b=”bendl; swap(&a, &b); cout”a=”a” b=”bendl; return o; 该程序运行结果如下: a=1 b=2 a=2 b=1如果将引用作为函数的参数,则程序的书写会变得清晰简单。 例1.7 采用引用传递参数的例。 #include void swap(int &m, int &n) int temp; temp=m; m=n; n=temp; main() int a=1, b=2; cout”a=”a” b=”bendl; swap(a, b); cout”a=”a” b=”bendl; return o; C+主张用引用传递取代地址传递。 3.引用返回值 引用的另一个用途是将函数说明为返回一个引用,这样,该函数将能用在赋值运算符的左边而对它进行赋值,一般情况下,函数是不能用在赋值运算符的左边的。 例1.10 将函数说明为返回一个引用的例。 #include int ch=1,2,3,4,5; int &index(int); /声明返回引用的函数 void main() index(2)=7; /将ch2重新赋值 coutindex(2)endl; int &index(int) return ch2; 该程序运行结果如下: 7 应该注意的是,再定义返回引用的函数时,不要返回对该函数内的局部变量的引用。因为局部变量的生存周期局限于函数内部,当函数返回时,它已经消失了,将返回一个无用的引用。如下面的函数返回就是一个无效的引用: int &func() int x; / return x;1.3.14 动态内存分配与运算符new和delete 1.动态内存分配和静态内存分配 静态内存分配是指在编译阶段就分配好存贮单元空间,在程序运行过程中,这些空间的大小是不可更改的,也无须对这些空间进行管理,编译时已将管理这些空间的代码加入到目标程序中,在作用域结束后,自动将空间归还系统。动态内存分配是指在程序语句中通过内存分配函数或内存分配运算符取得的存储空间,这样得到的空间的大小,编译器是不知道的,完全由动态运行中的程序的当时情况决定,这些空间在使用完毕后,必须由程序语句显示地将其归还系统。 2.运算符new new运算符用于动态分配一块内存空间,其使用形式为: 指针变量=new 其中:数据类型可以是标准数据类型,也可以是结构体类型、共用体类型、类类型等。new运算符返回一个指向所分配的存贮空间的第一个单元的指针,当没有足够的内存空间被分配时,将返回空指针0(NULL)。new能自动返回正确的指针类型,不必对返回指针进行类型转换。new分配的内存空间是连续的,可通过指针的移动访问所分配空间中的每个单元。new可以自动计算所要分配空间的大小,不必使用sizeof()来计算所需的字节数。 例1.11 用new动态分配内存。 #include main() int *p; p=new int; if (!p) cout”allocation failureendl; return 1; *p=10; cout*p; delete p; return 0; new还可以为数组动态分配内存空间,这时要在类型名后面追上数组大小,例如: int *ch=new int10;要为多维数组分配空间,必须提供所有维的大小,其中第一维的界值可以是任何合法的表达式。如: int i=3; int *ch=new inti42; new还可以将分配的对象初始化,但不能对动态分配给数组的存贮区进行初始化。如下面的语句是正确的: p=new int(100); 3.运算符delete delete运算符用于释放由new运算符分配的内存空间。由于内存空间有限,如果只取不还,系统就会很快因内存用完而崩溃。所以,使用delete运算符释放由new运算符分配的内存空间是程序员必须做的一项工作。凡是由new运算符分配的内存空间,一定要在使用完后用delete释放。delete运算符使用的形式为:delete 指针;或 delete 指针;其中的第二种形式用于释放为数组动态分配的内存空间。delete运算符后所跟的指针是由new运算符分配空间是返回的指针,也可以是空指针(NULL)。例如: int *p=new int; delete p; char *ch=new char10; delete ch; 使用delete运算符应注意如下问题: 由new运算符分配的内存空间,只许使用一次delete,不允许对同一块空间进行多次释放,否则会产生严重错误。 delete运算符只能释放由new运算符分配的动态内存空间,程序中的变量、数组等的存贮空间,不得用delete运算符去释放。 第二章 面向对象程序设计概述本章要点: 1.面向对象程序设计的基本思想; 2.对象、类、消息、抽象性、封装性、继承性、多态性的基本概念。2.1 面向对象的思想211 结构化程序设计 结构化程序设计是为了解决早期计算机程序的难于阅读、理解和调试,难于维护和扩充,以及开发周期长、不易控制程序的质量等问题而提出来的,它的产生和发展奠定了软件工程的基础。 结构化程序设计的基本思想是:自顶向下,逐步求精,将整个程序结构划分成若干个功能相对独立的模块,模块之间的联系尽可能简单;每个模块用顺序、选择、循环三种基本结构来实现;每个模块只有一个入口和一个出口。 结构化程序设计有很多优点:各模块可以分别编程,使程序易于阅读、理解、调试和修改;方便新功能模块的扩充;功能独立的模块可以组成子程序库,有利于实现软件复用等。所以,结构化程序设计方法出现以后,很快被人们接受并得到广泛应用。 结构化程序设计方法以解决问题的过程作为出发点,其方法是面向过程的。它把程序定义为“数据结构+算法”,程序中数据与处理这些数据的算法(过程)是分离的。这样,对不同的数据结构作相同的处理,或对相同的数据结构作不同的处理,都要使用不同的模块,从而降低了程序的可维护性和可复用性。同时,由于这种分离,导致了数据可能被多个模块使用和修改,难于保证数据的安全性和一致性。因此,对于小型程序和中等复杂程度的程序来说,它是一种较为有效的技术,但对于复杂的、大规模的软件的开发来说,它就不尽如人意了。通过上面的分析可以看出:结构化程序设计的核心思想是功能的分解,思想的特点是将数据结构与过程分离,着重点在过程。用这种方法开发的软件可维护性和可复用性差。2.1.2 面向对象程序设计 面向对象程序设计是在结构化程序设计的基础上发展起来的,它吸取了结构化程序设计中最为精华的部分,有人称它是“被结构化了的结构化程序设计”。 在面向对象程序设计中,对象是构成软件系统的基本单元,并从相同类型的对象中抽象出一种新型的数据类型类,对象只是类的实例。类的成员中不仅包含有描述类对象属性的数据,还包含有对这些数据进行处理的程序代码(这些程序代码被称为对象的行为或操作)。将对象的属性和行为放在一起作为一个整体的方法称为封装,它将对象的大部分行为的实现隐蔽起来,仅通过一个可控的接口与外界交互。 面向对象程序设计提供了类的继承性,可通过对一个被称为基类的类增添不同的特性来派生出多种被称为派生类的特殊类,从而使得类与类之间建立了层次结构关系,为软件复用提供了有效的途径。 面向对象程序设计支持多态性。多态性与继承性相结合,使不同结构的对象可以以各自不同的方式响应同一个消息。 软件系统中,对象与对象之间存在着一定的联系,这种联系通过消息的传递来实现。在面向对象程序设计中,消息表现为一个对象对另一个对象的行为的调用。通过上面的分析可以看出:面向对象程序设计的核心思想是数据的分解,着重点放在被操作的数据上而不是实现操作的过程上。它把数据及其操作作为一个整体对待,数据本身不能被外部过程直接存取。思想的特点是程序一般由类的定义和类的使用两部分组成,主程序中定义各个对象并规定它们之间传递消息的规律,程序中的一切操作都通过向对象发送消息来实现,对象接收到消息后,调用有关对象的行为来完成相应的操作。用这种方法开发的软件可维护性和可复用性高。 支持面向对象的程序设计语言很多,C+就是一种被广泛使用的、全面支持面向对象程序设计的程序设计语言。 2.1 面向对象程序设计的基本概念2.1.1 对象和类 一、对象和类 1.对象和类的概念 现实世界中的对象和类 现实世界中的对象是我们认识世界的基本单元,世界就是由这些基本单元对象组成的。如一个人、一辆车、一次购物、一次演出等等。对象及可以很简单,也可很复杂,复杂的对象可由若干个简单对象组成。对象是现实世界中的实体,具有以下特性: 每个对象都有一个用于与其他对象相区别的名字。 具有某些特征,称它为属性或状态。 有一组操作,每一个操作决定对象的一种行为即对象能干什么。 对象的状态只能被自身的行为所改变。 对象之间以消息传递的方式相互通信。 现实世界中的类是对一组具有共同属性和行为的对象的抽象。如人这类是由老人、小孩、男人、女人等个别的人构成,具体的某个人是人这个类的一个实例。类和对象是抽象和具体的关

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论