C 面向对象程序设计项目教程完整版教学课件 整套教程电子讲义(最全最新).ppt

上传人:春哥&#****71; 文档编号:4268815 上传时间:2021-07-16 格式:PPT 页数:589 大小:6.39MB
返回 下载 相关 举报
C 面向对象程序设计项目教程完整版教学课件 整套教程电子讲义(最全最新).ppt_第1页
第1页 / 共589页
C 面向对象程序设计项目教程完整版教学课件 整套教程电子讲义(最全最新).ppt_第2页
第2页 / 共589页
点击查看更多>>
资源描述

《C 面向对象程序设计项目教程完整版教学课件 整套教程电子讲义(最全最新).ppt》由会员分享,可在线阅读,更多相关《C 面向对象程序设计项目教程完整版教学课件 整套教程电子讲义(最全最新).ppt(589页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、项目一,任务一 体会面向对象与面向过程的不同思维方式,任务二 创建简单的C+应用程序,打开C+面向对象程序设计之门,任务说明,任务一 体会面向对象与面向过程的不同思维方式,在本任务中我们来学习面向对象程序设计思想以及其与面向过程的不同。,预备知识,一、什么是面向对象的程序设计思想,二、面向对象与面向过程比较,一、什么是面向对象的程序设计思想,其基本出发点是尽可能按照人类认识世界的方法和思维方式来分析和解决问题。客观世界是由许多具体的事物或者事件、抽象的概念和规则等组成的,因此,人们研究的对象事、物、概念都统称为“对象”。面向对象的设计方法是以对象作为最基本的元素,以对象作为分析问题、解决问题的

2、核心。,下面我们了解几个面向对象程序设计中涉及的基本概念。,1对象,2类,3封装,4继承,5多态,面向对象程序设计方法的优势可以归纳为以下几点:,二、面向对象与面向过程比较,(1)程序的开发效率高,(2)程序代码的可重用性高,(3)程序易于维护,任务实施 运用面向对象和面向过程两种思想解决同一问题,案例说明,本任务中我们将分别使用面向过程和面向对象的程序设计方法设计两个功能完全相同的程序(根据矩形的长和宽求其周长和面积),并结合任务内容说明两种程序设计思想的异同。,实施步骤,1以面向过程的程序设计方式思考,步骤1 以面向过程的思想来解决问题,步骤如下:,(1)确定所求长方形的长和宽。 (2)确

3、定计算长方形的周长和面积的公式并计算。 (3)输出计算结果。,步骤2 根据解题思路编写代码,如【例1-1】所示。,【例1-1】 以面向过程程序设计思想编码。,/1-1.cpp #include /包含头文件iostream.h using namespace std;/使用标准命名空间 void main()/主程序 int perimeter,area;/声明周长与面积变量 int length=20,width=10;/声明长、宽变量并赋初值 perimeter=2*(length+width);/求周长 area=length*width;/求面积 coutperimeter=perim

4、eterendl;/输出结果 coutarea=areaendl; ,2以面向对象的程序设计方式思考,步骤1 以面向对象的思想来解决问题,步骤如下:,(1)将长方形类的共性,即两个基本属性(长和宽)和两个行为(求周长和求面积)抽取出来,设计一个长方形类。 (2)根据长方形类创建一个对象。 (3)通过调用对象的行为求出其周长和面积。,步骤2 根据解题思路编写代码,如【例1-2】所示。,【例1-2】 以面向对象程序设计思想编码。,/1-2.cpp #include /包含头文件iostream.h using namespace std;/使用标准命名空间 class Rectangle/定义长方

5、形类 public: Rectangle(float w=0,float l=0)width=w;length=l; /定义构造函数,完成创建对象时的初始化工作,即为长和宽赋初值 void GetArea()coutarea=width*length endl;/定义求面积方法 void GetPerim()coutperimeter=2*(width+length)endl;/定义求周长方法 private: float width,length; /外界不可访问的私有成员 ;,void main() Rectangle a(10,20);/定义长方形类的一个变量a,即实例化一个 /特殊的长

6、方形对象a,它的长是20,宽是10 a.GetPerim();/调用a对象的两个方法 a.GetArea(); ,任务二 创建简单的C+应用程序,任务说明,在本任务中我们来学习C+应用程序的结构、C+程序的开发过程以及C+开发环境Visual C+ 6.0的使用。,预备知识,一、认识C+程序,二、C+程序的开发过程,三、Visual C+ 6.0集成开发环境简介,四、Visual C+ 6.0的排错与调试功能,1一个C+程序,一、认识C+程序,#include /包含头文件iostream.h #include /包含头文件string.h,字符串 using namespace std;/使

7、用标准命名空间 /= int main() string greeting=hello world!; /定义一个字符串对象变量,并赋初值 couthello world!n; /在屏幕上输出字符串“hello world!”并换行 coutwelcome to C+!endl; /在屏幕上输出“welcome to C+!”并换行 coutgreetingendl; /在屏幕上输出字符串变量greeting的内容并换行 return 0;/程序结束 ,2C+程序的构成,(1)一个C+程序可以由一个或多个源程序单元构成,每个源程序单元可被看成一个文件。【例1-3】中的例子仅由一个源程序单元构成

8、。,(2)在一个源程序单元中,一般包括以下组成部分:, 预处理命令。, 全局声明部分。, 函数。,3C+程序的书写形式,(1)C+的书写格式比较自由,一行内可以写几个语句,一个语句也可以写在多行。,(2)在程序中添加必要的注释,也是成为一个优秀程序员所必需的。编译系统在编译代码时会将注释内容忽略。一般情况下,内容较少的简单注释用“/”,而跨行的注释则用“/*/”。,二、C+程序的开发过程,1编写程序,2编译程序,3连接目标文件,4运行程序,总体而言,C+程序的整个开发过程可用图所示的流程图表示。其中,实线表示操作流程,虚线表示文件的输入/输出。,三、Visual C+ 6.0集成开发环境简介,

9、本书选用了使用较为广泛的Visual C+ 6.0作为C+程序的开发环境,图所示为Visual C+ 6.0的集成开发环境界面。,四、Visual C+ 6.0的排错与调试功能,第一步 设置断点,第二步 开始调试程序,第三步 单步运行,单步调试程序时,可以在Variables窗口和Watch窗口中察看变量值的变化,这两个窗口的作用如下:, 在Variables窗口中会自动显示当前运行程序中所有变量的值。随着单步调试的进行,我们会看到变量i的值逐渐递增。, 如果本地变量比较多,Variables窗口就会比较混乱,此时可以直接在代码中选中需要监控的变量,将其拖放到Watch列表,该变量的值会被显示

10、出来。,任务实施创建并运行自己的第一个C+程序,案例说明,编写和调试一个简单的C+程序,以熟悉Visual C+ 6.0的程序编写、编译、连接和调试方法。,实施步骤,1创建源程序,步骤1 启动Visual C+ 6.0,打开“文件”下拉菜单,选择“新建”菜单项,将打开如图所示的“新建”对话框。,步骤2 如图1-14所示,选择“文件”选项卡,在左侧文件类型列表中选择“C+ Source File”选项,表示创建一个C+源程序。,/实训1-1 #include using namespace std; int main() coutWelcome to C+ World!n; coutMy Fri

11、end!endl; return 0; ,2编译连接,将代码输入编辑区后,需要对程序进行编译连接,以发现源程序中是否存在错误。,步骤1 执行“组建”“编译实训1-1.cpp”菜单命令,系统将显示图所示对话框,询问是否在创建源文件的目录下建立一个活动工程和一个工作空间。,步骤2 单击“是”按钮,将创建一个与C+源程序同名的工作区(对应文件为“实训1-1.dsw”)和一个工程(对应文件为“实训1-1.dsp”),系统开始编译。编译结束后,将在输出窗口输出编译信息,如图所示。,步骤3 编译信息显示“实训1-1.obj - 0 error(s), 0 warning(s)”,表示编译程序时没有错误和警

12、告。为此,继续执行“组建”“组建实训1-1.exe”菜单命令,对生成的目标程序进行连接,以生成可执行程序,如图所示。,3调试运行,编译连接通过后,执行“组建”“执行实训1-1.exe”菜单命令,或者直接按【Ctrl+F5】组合键,运行生成的程序,将出现图所示画面。结果正确无误,按任意键返回。,至此,一个完整的C+程序从建立到运行就完成了。,项目拓展,熟悉Visual C+工作区与工程的使用,C+程序唯有放入某个工作区和工程,才能被编译和连接。,为了便于读者更好地使用Visual C+,我们首先对工作区、工程等概念进行一些简要说明。,(1)在Visual C+中,工作区用来管理工程,而工程用来管

13、理C+源程序(*.cpp)、C+头文件(*.h)、资源文件等。因此,如果我们开发的程序比较庞大的话,应首先创建工作区,然后创建工程,最后利用工程管理C+源程序、头文件等。,(2)我们既可以为在工作区新建工程,或者在工程中新建C+程序、头文件,也可以将现有工程添加到工作区中,或者将现有C+源程序、头文件等添加到工程中。,(3)Visual C+的编译是针对工程中的C+程序的,而连接是针对工程的。通过选择“组建”菜单中的“组建”,可以对工程中的程序统一进行编译和连接。,(4)每个工作区和工程都与某个文件夹相对应,并且工作区文件的扩展名为.dsw,工程文件的扩展名为.dsp。,(5)创建工程时,如果

14、系统尚未创建工作区,则系统会自动创建一个与工程同名的工作区,并以此名称在指定文件夹中创建一个新文件夹,以存放相关文件。,(6)要想编辑C+源程序或头文件等,最好打开工作区文件,如此一来,我们可以直接对C+源程序、头文件等进行修改、编译和连接。,(7)如果创建的工程是一个Win32 Console Application(Win32控制台应用程序),则必须在工程中的某个C+程序中包含main()函数,以设置应用程序的入口。此外,每个工程中只能有一个main()函数,否则,将无法连接目标文件。,Thank you!,项目二,任务一 熟悉C+与C在基本控制上的一些区别,任务二 学习有关函数方面的区别

15、,任务三 掌握C+中关于引用的灵活运用,任务四 掌握C+中管理动态内存空间的方法,由C到C+ 用法更灵活、功能更强大,任务说明,预备知识,任务一 熟悉C+与C在基本控制上的一些区别,在本任务中我们来学习C+与C在基本控制上的一些区别,主要包括输入/输出的实现、强制数据类型转换方式以及新增了bool类型。,一、用I/O流实现输入/输出,二、新增强制类型转换方式,三、新增bool类型,一、用I/O流实现输入/输出,cin是输入流对象,cout是输出流对象,它们是在编译系统中的输入/输出流库中定义的,定义后系统会在内存中开辟一段缓冲区,用来暂存输入/输出流的数据。使用它们时必须将头文件“iostre

16、am.h”加入到本文件中,即在程序的开头使用预处理命令“#include ”。,(一)输入语句,输入语句的一般格式为:,cin表达式1表达式2表达式n;,在使用cin语句时,通过键盘输入的数据应与变量定义的数据类型一致,并且输入数据的个数应与变量的个数相同。输入完数据后键入回车,流提取操作符“”便从输入流中提取出由空格、制表符和换行符间隔开的数据赋给相应的变量。,(二)输出语句,输出语句的一般格式为:,cout表达式1表达式2表达式nendl;,endl是C+中行结束符,只能用于输出流中,其作用是在执行换行操作的同时,将缓冲区内已有的数据全部输出,并清空缓冲区。,(三)输入/输出的格式控制,常

17、用的输入/输出流格式控制符如表所示。,二、新增强制类型转换方式,强制转换数据类型的一般形式为:,(类型名)变量 和 (类型名)(表达式),也可以写成,类型名(变量) 和 类型名(表达式),例如,下面将变量a强制转换成int型,将m与n的和强制转换成double型,将8与3取余的结果强制转换成char型。,int(a) double(m+n) char(8%3),当进行强制数据类型转换的对象是一个包含多项的表达式时,必须将表达式用括号括起。例如,将7/4的结果强制转换成double型,应该写成,double(7/4),此时由于7和4均为整型,故7/4的结果为整型1,强制转换为双精度型数据后,结果

18、仍为1,而写成,(double)7/4,则表示将7的数据类型强制转换为double型,再与4求商,结果是双精度型数据1.75。,三、新增bool类型,bool(布尔型,也称逻辑型)只有两个值,即整数0(表示逻辑假)和1(表示逻辑真)。在C+语言中还定义了这两个布尔型常量所对应的符号常量false和true,false的值为0,表示逻辑假,true的值为1,表示逻辑真。,由于逻辑值是整数0和1,所以它也能够像其他整数一样出现在表达式里,参与各种整数运算。,【例2-3】 布尔常量应用示例。,#include using namespace std; int main() cout布尔类型的符号常量

19、true对应的逻辑值是:trueendl; cout布尔类型的符号常量false对应的逻辑值是:falseendl; return 0; ,程序运行结果如图所示。,任务实施输出杨辉三角,案例说明,杨辉三角是一个由数字排列成的三角形数表,如图所示。,它描述的是两个未知数和的幂次方运算后的系数问题。例如,(xy)2x22xyy2,这样系数就是1,2,1,这就是杨辉三角的其中一行。依次下去,(xy)3、(xy)4等的运算结果的各项系数就构成了杨辉三角的其他各行。编写程序,根据输入的行数(小于14)输出杨辉三角。,案例分析,杨辉三角每行的数字是有一定规律的:每一行数字的个数等于所在的行数,每行的第一个

20、数字均为1,其后数字为:前面数字(数字所在行号(自1起)数字所在行中的序号(自0起)/数字所在行中的序号。,为了使输出的数字排列成如图所示的金字塔形状,需控制各行数字之间空格的个数。每行第一个数字之前空格的个数依次递减2,两个数字之间的空格个数有三种情况:如果输出的数字是一个一位数,则在该数字后输出3个空格;如果输出的数字是一个两位数,则在该数字后输出2个空格;如果输出的数字是一个三位数,则在该数字后输出1个空格。,根据以上规律,我们可以利用循环嵌套结构逐行逐个输出数字和空格。由于确定了行数,循环的次数也就跟着确定了,故我们使用的是for循环。,实施步骤,步骤1 在Visual C+中新建一个

21、C+ 源文件,根据分析编写代码如下:,#include void main() int n,r,c,m,j=0; coutm;,while (m=14)/如果连续三次输入的数字不符合要求,则退出程序 if (j=2) coutm; j+;/累计输入次数 ,for (n=0;n=m-1;n+)/逐行输出数字和空格 for(r=1;r15-n;r+)/*输出第一个数字之前的空格,为了打印出金 字塔形状,要保证各行依次递减2个空格*/ cout ; c=1;/第一个数字总为1 coutc ;/输出第一个数字以及3个空格 for(r=1;r=n;r+)/输出各行的其他数字和空格 c=c*(n-r+1)

22、/r;/计算应输出数字 if(c100)/根据数值大小确定数字后面的空格个数 if(c10) coutc ;/一位数的后面输出3个空格 else coutc ;/两位数的后面输出2个空格 else coutc ;/三位数的后面输出1个空格 coutendl;,步骤2 经编译、连接后,程序运行结果如图所示。,任务二 学习有关函数方面的区别,任务说明,在本任务中,我们来学习C+语言与C语言在函数语法和使用方面的区别。,预备知识,一、局部变量随用随定义,二、作用域限定符:扩大全局变量的可见范围,三、形式参数可带有默认值,四、内联函数,在C+中,允许变量定义语句在程序中的任何地方,只要在是使用它之前就

23、可以;而C语言中,必须要在函数开头部分。另外,C+允许重复定义变量,C语言标准中是不允许的。,通常情况下,如果全局变量与局部变量同名,局部变量在其作用域内具有较高的优先权,将会屏蔽全局变量。在C+中,可以通过作用域限定符“:”访问被屏蔽的全局变量。,二、作用域限定符:扩大全局变量的可见范围,一、局部变量随用随定义,【例2-4】 使用作用域限定符: 访问被屏蔽的全局变量。,#include using namespace std; int v1=80; int main() int v1=8; coutv1; coutn您输入的v1值是v1endl; coutn全局变量v1的值是:v1endl;

24、 return 0; ,程序运行结果如图所示。,三、形式参数可带有默认值,通常情况下,在调用函数时要为函数的每个形参赋予一个相应的实参值。但有时在主调函数中没有给出实参,或者多次调用同一函数使用同样的实参时,给形参设置一个默认值,被调函数就可以按指定的默认值来执行。,函数形参的默认值可以在函数原型的声明中或函数定义中指定。例如:,float area(float r=2.5);,指定r的默认值为2.5,在调用此函数时可以不必给出实参的值,即等价于调用area(2.5)。,如果函数中有多个形参,可以为每个形参指定一个默认值,也可以只对部分形参指定默认值,指定默认值必须按照从右到左的顺序进行。即为

25、某个参数指定默认值时,其后的参数都必须指定默认值,否则已设默认值将被忽略。例如:,void f1(double a,float b=2.5,int c=1); /正确 void f2(double a,float b=2.5,int c); /*不正确。由于c未指定默认值,故b的默认值无效*/,为函数中的形参设置了默认值后,实参的个数可以与形参的个数不同。在进行函数调用时,实参与形参按照从左到右的顺序进行匹配,没有给出实参的,该形参就取指定的默认值。例如:,int sum(int a,int b, int c=5,int d=6);,在此函数原型中指定了形参c和d的默认值分别为5和6,若调用语

26、句为:,sum(3,2,1);,则等价于执行语句:,sum(3,2,1,6);,四、内联函数,定义内联函数的格式为:,inline 函数类型 函数名(形参列表) 函数体 ;,一般只将规模很小(一般为5个语句以下)且使用频繁的函数声明为内联函数,并且内联函数内不能包括循环语句和switch语句。,【例2-6】 内联函数应用示例。,#include inline int sum(int x,int y,int z);/对函数sum原型的声明,声明为内联函数 void main() int a,b,c,s; coutabc; s=sum(a,b,c); /求三个数的和 coutsum is send

27、l; int sum(int x,int y,int z)/定义内联函数sum return x+y+z; ,程序运行结果如图所示。,任务实施汉诺塔问题求解,案例说明,已知台上有3根标号为A、B、C的柱子,在A柱子上放着若干个盘子,每一个都比下面的略小一些。现要把A柱子上的盘子全部移到C柱子上,要求是:一次只能移动一个盘子,移动过程中大盘子不能放在小盘子上面。 编写程序,输入A柱子上盘子的数量,输出将盘子从A柱子移动到C柱子上时移动的步骤。,案例分析,汉诺塔问题是典型的递归调用问题。当n1时,直接将盘子从A移动到C即可。将n(n1)个盘子从A柱移动到C柱可以分为三个步骤:, 将n-1个盘子借助

28、C柱子移到B柱子; 将最后一个盘子从A柱子移到C柱子; 将n-1个盘子从B借助A移到C。,计算移动次数的公式为2m-1,其中m是盘子总数。,实施步骤,步骤1 在Visual C+中新建一个C+ 源文件,根据分析编写代码如下:,#include void move(char one,char anoth) /将一个柱子上的盘子移动到另一个柱子 coutone anothendl; void hanoi(int n,char no1,char no2,char no3)/求解汉诺塔问题 if (n=1) move(no1,no3);/只有一个盘子时,从A移动到C else hanoi(n-1,no

29、1,no3,no2);/将n-1个盘子借助C从A移动到B move(no1,no3);/将最后一个盘子从A移动到C hanoi(n-1,no2,no1,no3);/将n-1个盘子借助A从B移动到C ,int times(int n)/计算移动次数 int i,times=1; for(i=1;im; cout当有m个盘子时,移动步骤依次为:endl; hanoi(m,A,B,C); cout移动次数为times(m)次endl; ,步骤2 经编译、连接后,程序运行结果如图所示。,任务三 掌握C+中关于引用的灵活运用,任务说明,引用是C+对C的一个重要扩充,在本任务中我们就来学习引用。,一、引用

30、的概念及使用,预备知识,二、引用作为形式参数,三、引用与指针的区别,四、引用作为返回值,一、引用的概念及使用,引用是指为变量起一个别名,声明引用型变量的一般形式为:,数据类型 ,例如,假设有一个变量a,若给它起一个别名b,就可以这样来声明:,int a; int /声明b是a的引用,声明引用时,b和a表示相同的变量,它们具有相同的地址。换句话说,对b进行操作也就是对a进行操作。,在声明一个引用型变量时,必须同时对其进行初始化。以下语句是不合法的:,int a; int ,【例2-7】 引用的简单应用。,#include void main() int a=10; int ,程序运行结果如图所示

31、。,二、引用作为形式参数,在C语言中我们已经学了函数参数传递的两种方式:值传递和地址传递。将引用作为函数的参数时,参数的传递方式为引用传递。引用传递实际上传递的是变量的地址,这种方式节省了大量存储空间,从而能够提高程序的执行效率。,下面我们通过【例2-8】来比较值传递、地址传递和引用传递这三种传递方式。,【例2-8】 引用作为函数参数的应用示例。要求实现两个整型数据的交换。,#include void swap1(int x,int y)/参数的值传递 int temp; temp=x; x=y; y=temp; void swap2(int *x,int *y)/参数的地址传递 int te

32、mp; temp=*x; *x=*y; *y=temp; ,void swap3(int ,void main( ) int a,b; coutab;/输入a、b两变量的值 swap1(a,b); cout值传递的结果:a bendl; swap2( ,程序运行结果如图所示。,三、引用与指针的区别, 引用是一个变量的别名,本身不单独分配自己的内存空间,而指针有自己的内存空间。, 引用访问一个变量是直接访问,而指针是间接访问。, 引用在开始的时候就绑定到了一个内存空间,所以开始必须赋初值,而指针可以先定义后赋值。,【例2-9】 引用与指针对比应用示例。,#include void main( )

33、 int i = 3,j = 4; couti=ij=jendl; int ,程序运行结果如图所示。,int *y;/定义指针 couty的地址 ,四、引用作为返回值,以引用返回函数值时,定义函数时需要在函数名前加/定义全局变量temp float fn1(float r);/声明函数fn1 float ,void main()/主函数 float a=fn1(10.0); float b=fn2(10.0); coutaendlbendl; ,程序运行结果如图所示。,从上图中我们可以看出,两种方式的运行结果是相同的,但是它们在内存中的活动情况却是不相同的,下面我们对照图示进行说明。,函数fn

34、1()是一般的函数返回值方式:返回全局变量temp值时,C+创建临时变量并将temp的值314复制给该临时变量,返回到主函数后,赋值语句a=fnl(10.0)把临时变量的值314复制给a,其内存情况如图所示。,函数fn2()以引用方式返回返回值,不产生副本,所以,直接将变量temp返回给主函数,这样避免了临时变量的产生。这种方式提高了程序执行效率和空间利用率,其内存情况如图所示。,2返回引用的函数可以作为左值。,下面我们通过一个案例来了解这种使用方法。,【例2-11】 将返回引用的函数值作为赋值表达式的左值。,#include int ,int ,程序运行结果如图所示。,引用作为返回值时,要注

35、意以下两点:,(1)不能返回局部变量的引用,(2)不能返回函数内部new分配的内存的引用,案例说明,任务实施通过引用操作数组,创建两个数组,输入数组元素后将数组值输出,然后将两数组合并为一个数组并输出。,实施步骤,步骤1 在Visual C+中新建一个C+ 源文件,编写代码如下:,#include #include #include #define LIST_INIT_SIZE 100/ 数组初始化元素个数 #define LISTINCREMENT 10/ 数组元素个数递增长度 #define Status int #define ElemType int #define OK 1 #def

36、ine ERROR 0 #define OVERFLOW -2,typedef struct ElemType *elem; int length;/ 数组中实际存放的元素个数 int listsize;/ 数组长度,可容纳的最大元素个数 SqList ; Status InitList_Sq(SqList ,Status InputList_Sq(SqList ,void MergeList_Sq(SqList La, SqList Lb, SqList / 插入Lb的剩余元素 ,void main()/ 主函数 SqList La,Lb,Lc; InitList_Sq(La); InitL

37、ist_Sq(Lb); InitList_Sq(Lc); La.length=5; Lb.length=4; printf(nInput array A); InputList_Sq(La); / 输入数组La OutputList_Sq(La); printf(nInput array B); InputList_Sq(Lb); / 输入数组Lb OutputList_Sq(Lb); MergeList_Sq(La,Lb,Lc); / 将数组La与Lb合并 printf(nC=merge(A,B):); OutputList_Sq(Lc);,步骤2 经编译、连接后,程序运行结果如图所示。,任

38、务四 掌握C+中管理动态内存空间的方法,任务说明,在本任务中我们来学习使用C+应用程序的结构、C+程序的开发过程、C+开发环境Visual C+ 6.0的使用。,预备知识,在C+语言中,new和delete可用来实现动态内存空间的管理。,一、用new申请动态内存空间,二、用delete释放动态内存空间,new运算符的操作数是一个数据类型,其作用是为变量分配内存空间,并返回指向该变量的指针。new运算符使用的一般格式为:,一、用new申请动态内存空间,指针变量new 数据类型 (初值),其中,初值也可以不给出。例如:,int *p;/定义了一个指向整型变量的指针 p=new int(5);/*为

39、一个整型变量分配内存空间,p指向该变量的首地址,将该整型变量初始化为5*/,new运算符还可以为多个变量分配存储空间。例如:,int *p;/定义了一个指向整型变量的指针 p=new int 8;/*为8个整型变量分配内存空间,p指向第一个整型变量的首地址*/ for(int i=0;i8;i+)/为p指向的8个整型变量赋值 pi=i;,二、用delete释放动态内存空间,当new分配的空间使用完之后,必须用delete运算符释放这些空间。delete运算符的一般格式为:,delete 指针变量,其中,指针变量是指用new运算符申请分配的内存地址。当用delete释放为多个变量分配的地址时,其

40、格式为:,delete 指针变量,其中中不需要填写变量的个数。例如:,int *p=new int a8; delete p;,任务实施new、delete的基本使用方法,案例说明,在本任务中,我们使用new和delete操作符对内存进行一些基本操作。,实施步骤,步骤1 在Visual C+中新建一个C+ 源文件,编写代码如下:,#include using namespace std; int main ( ) /基本数据类型 int *i = new int; /没有初始值 int *j = new int(100); /初始值为100 float *f = new float(3.141

41、5f); /初始值为3.1415 cout i = *i endl; cout j = *j endl; cout f = *f endl; /数组 int *iArr = new int3;,for (int k=0; k3; k+) iArrk = (k+1)*10; cout k : iArrk endl; /释放内存 delete i; delete j; delete f; delete iArr;/释放数组空间 return 0; ,步骤2 编译、连接程序,程序运行结果如图所示。,Thank you!,项目三,任务一 初识类与对象,任务二 深入学习类与对象的相关知识,类与对象 抽象

42、与实体的完美结合,任务说明,预备知识,任务一 初识类与对象,类(Class)是具有相同属性和行为的一组对象的集合,是对属于该类的全部对象的统一抽象描述。类是面向对象中最为重要的概念之一,利用类可以实现数据的封装、隐藏、继承和派生,C+中许多复杂的程序都是用类来实现的。使用类时,用户不需要了解类的具体实现,只需要通过外部接口,以特定的访问权限来使用类的成员即可。,一、类的声明及类成员的访问,二、类成员函数的定义,三、对象成员的定义与引用,四、构造函数与析构函数,一、类的声明及类成员的访问,类也是一种数据类型,与结构体类型不同的是,类中除了包含数据以外,还包含对这些数据操作的函数,它将数据和操作封

43、装在一起。,声明类的一般形式为:,class 类名 public: 公有数据成员; 公有成员函数; private: 私有数据成员; 私有成员函数; protected: 保护数据成员; 保护成员函数; 9;,二、类成员函数的定义,C+中,类成员的访问属性有以下三种:,(1)public(公有的),公有的成员用public来声明,这类成员既可以被本类中的成员函数引用,也可以被任何外部函数引用。它是类与外界的接口。,(2)private(私有的),私有的成员用private来声明,这类成员只能被本类中的成员函数所引用。,(3)protected(保护的),受保护的成员用protected来声明,

44、这类成员只能被本类及本类的派生类中成员函数引用(本书将在项目四中详细讲述类的继承与派生)。,三、对象成员的定义与引用,在类的声明中声明了类的数据成员和成员函数的原型之后,还要通过对类的成员函数进行定义来实现成员函数的功能,即成员函数的实现。成员函数的定义方法有以下3种。,(1)在类内直接定义成员函数,C+中可以直接将成员函数定义在类的内部。,(2)在类外定义成员函数,在类外定义成员函数的一般形式为:,返回类型 类名:成员函数名(参数列表) 函数体 ,“:”为作用域限定符,用来标识该成员函数所属的类。,(3)在类外定义成内联函数,在类外定义成内联函数的一般形式为:,inline 返回类型 类名:

45、成员函数名(参数列表) 函数体 ,【例3-1】 声明一个时钟类,定义该类中的几个成员函数。,#include class Clock/定义时钟类Clock public:/公有成员 void SetTime(int h=0,int m=0,int s=0);/成员函数 void ShowTime()/在类内定义成员函数ShowTime() couthour:minute:secondendl; private:/私有成员 int hour,minute,second; ; /数据成员 void Clock:SetTime(int h,int m,int s)/在类外定义成员函数SetTime(

46、) hour=h; minute=m; second=s;,void main()/主函数 Clock myClock;/定义对象myClock coutfirst time set and output:endl; myClock.SetTime();/调用成员函数 myClock.ShowTime(); coutsecond time set and output:endl; myClock.SetTime(8,30,45); myClock.ShowTime(); ,程序运行结果如图所示。,四、构造函数与析构函数,(一)构造函数,1构造函数概述,构造函数是一种特殊的成员函数,它的主要功能

47、是为对象分配存储空间,以及为类的成员变量赋初值。构造函数可以在类中定义,也可以在类中声明、在类外定义。定义构造函数的一般形式为:,类名: 构造函数名(参数列表) 函数体 ,构造函数名必须与类名相同,构造函数可以有任意类型的参数,但不能有任何返回值和返回类型。构造函数不需要用户来调用,而是在创建对象时自动被调用,且只调用一次。如果是在类中定义,则省略类名和作用域限定符。,如果在定义类时没有定义任何构造函数,编译系统会自动为这个类生成一个默认的构造函数。这个默认的构造函数没有参数且函数体是空的,它不执行任何初始化操作。,【例3-2】 定义一个复数类的构造函数。,#include class Com

48、plex/类Complex的声明 public:/定义共有成员 Complex()/在类内定义构造函数 cout不带参数的构造函数被调用!endl; real=0; imag=0; ,void show()/定义成员函数 cout(real,imag); private:/定义私有成员 double real,imag; ; void main() Complex com;/创建一个对象 com.show();/调用成员函数show ,程序运行结果如图所示。,2带参数的构造函数,对于不带参数的构造函数,当定义该类的对象时,所有对象都具有相同的初值。但在实际应用中,用户往往希望对不同的对象赋予不同的初值,这时就需要使用带参数的构造函数。,定义对象的一般形式为:,类名 对象名(实参1,实参2,实参n),【例3-3】 在【例3-2】基础上添加带参数的构造函数。,#include class Com

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 大学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com