《C面向对象程序设计项目教程完整版教学课件整套教程电子讲义(最全最新).ppt》由会员分享,可在线阅读,更多相关《C面向对象程序设计项目教程完整版教学课件整套教程电子讲义(最全最新).ppt(589页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、项目一项目一项目二项目二任务一任务一 熟悉熟悉C+与与C在基本控制上的一些区别在基本控制上的一些区别任务二任务二 学习有关函数方面的区别学习有关函数方面的区别任务三任务三 掌握掌握C+中关于引用的灵活运用中关于引用的灵活运用任务四任务四 掌握掌握C+中管理动态内存空间的方法中管理动态内存空间的方法由由C到到C+ 用法更灵活、功能更强大用法更灵活、功能更强大任务说明任务说明预备知识预备知识任务一任务一 熟悉熟悉C+与与C在基本控制上的一些区别在基本控制上的一些区别 在本任务中我们来学习在本任务中我们来学习C+与与C在基本控制上的一些区别,主要在基本控制上的一些区别,主要包括输入包括输入/输出的实
2、现、强制数据类型转换方式以及新增了输出的实现、强制数据类型转换方式以及新增了bool类型。类型。一、用一、用I/O流实现输入流实现输入/输出输出二、新增强制类型转换方式二、新增强制类型转换方式三、新增三、新增bool类型类型一、用一、用I/O流实现输入流实现输入/输出输出 cin是输入流对象,是输入流对象,cout是输出流对象,它们是在编译系统中的是输出流对象,它们是在编译系统中的输入输入/输出流库中定义的,定义后系统会在内存中开辟一段缓冲区,输出流库中定义的,定义后系统会在内存中开辟一段缓冲区,用来暂存输入用来暂存输入/输出流的数据。使用它们时必须将头文件输出流的数据。使用它们时必须将头文件
3、“iostream.h”加入到本文件中,即在程序的开头使用预处理命令加入到本文件中,即在程序的开头使用预处理命令“#include ”。(一)输入语句(一)输入语句输入语句的一般格式为:输入语句的一般格式为:cin表达式表达式1表达式表达式2表达式表达式n; 在使用在使用cin语句时,通过键盘输入的数据应与变量定义的数语句时,通过键盘输入的数据应与变量定义的数据类型一致,并且输入数据的个数应与变量的个数相同。输入据类型一致,并且输入数据的个数应与变量的个数相同。输入完数据后键入回车,流提取操作符完数据后键入回车,流提取操作符“”便从输入流中提取出由便从输入流中提取出由空格、制表符和换行符间隔开
4、的数据赋给相应的变量。空格、制表符和换行符间隔开的数据赋给相应的变量。(二)输出语句(二)输出语句输出语句的一般格式为:输出语句的一般格式为:cout表达式表达式1表达式表达式2表达式表达式nendl; endl是是C+中行结束符,只能用于输出流中,其作用是中行结束符,只能用于输出流中,其作用是在执行换行操作的同时,将缓冲区内已有的数据全部输出,在执行换行操作的同时,将缓冲区内已有的数据全部输出,并清空缓冲区。并清空缓冲区。(三)输入(三)输入/输出的格式控制输出的格式控制常用的输入常用的输入/输出流格式控制符如表所示。输出流格式控制符如表所示。二、新增强制类型转换方式二、新增强制类型转换方式
5、强制转换数据类型的一般形式为:强制转换数据类型的一般形式为:(类型名)变量(类型名)变量 和和 (类型名)(表达式)(类型名)(表达式)也可以写成也可以写成类型名(变量)类型名(变量) 和和 类型名(表达式)类型名(表达式) 例如,下面将变量例如,下面将变量a强制转换成强制转换成int型,将型,将m与与n的和强制转的和强制转换成换成double型,将型,将8与与3取余的结果强制转换成取余的结果强制转换成char型。型。int(a)double(m+n)char(8%3) 当进行强制数据类型转换的对象是一个包含多项的表达式时,当进行强制数据类型转换的对象是一个包含多项的表达式时,必须将表达式用括
6、号括起。例如,将必须将表达式用括号括起。例如,将7/4的结果强制转换成的结果强制转换成double型,型,应该写成应该写成double(7/4) 此时由于此时由于7和和4均为整型,故均为整型,故7/4的结果为整型的结果为整型1,强制转换为双,强制转换为双精度型数据后,结果仍为精度型数据后,结果仍为1,而写成,而写成(double)7/4 则表示将则表示将7的数据类型强制转换为的数据类型强制转换为double型,再与型,再与4求商,结果求商,结果是双精度型数据是双精度型数据1.75。三、新增三、新增bool类型类型 bool(布尔型,也称逻辑型)只有两个值,即整数(布尔型,也称逻辑型)只有两个值
7、,即整数0(表示逻辑(表示逻辑假)和假)和1(表示逻辑真)。在(表示逻辑真)。在C+语言中还定义了这两个布尔型常量所语言中还定义了这两个布尔型常量所对应的符号常量对应的符号常量false和和true,false的值为的值为0,表示逻辑假,表示逻辑假,true的值为的值为1,表示逻辑真。,表示逻辑真。 由于逻辑值是整数由于逻辑值是整数0和和1,所以它也能够像其他整数一样出现在表,所以它也能够像其他整数一样出现在表达式里,参与各种整数运算。达式里,参与各种整数运算。【例【例2-3】 布尔常量应用示例。布尔常量应用示例。#include using namespace std; int main()
8、 cout布尔类型的符号常量布尔类型的符号常量true对应的逻辑值是:对应的逻辑值是:trueendl;cout布尔类型的符号常量布尔类型的符号常量false对应的逻辑值是:对应的逻辑值是:falseendl;return 0;程序运行结果如图所示。程序运行结果如图所示。任务实施任务实施输出杨辉三角输出杨辉三角案例说明案例说明杨辉三角是一个由数字排列成的三角形数表,如图所示。杨辉三角是一个由数字排列成的三角形数表,如图所示。 它描述的是两个未知数和的幂它描述的是两个未知数和的幂次方运算后的系数问题。例如,次方运算后的系数问题。例如,(xy)2x22xyy2,这样系数就是,这样系数就是1,2,1
9、,这就是杨辉三角的其中,这就是杨辉三角的其中一行。依次下去,一行。依次下去,(xy)3、(xy)4等的运算结果的各项系数就构成了等的运算结果的各项系数就构成了杨辉三角的其他各行。编写程序,杨辉三角的其他各行。编写程序,根据输入的行数(小于根据输入的行数(小于14)输出杨)输出杨辉三角。辉三角。案例分析案例分析杨辉三角每行的数字是有一定规律的:每一行数字的个数等于所杨辉三角每行的数字是有一定规律的:每一行数字的个数等于所在的行数,每行的第一个数字均为在的行数,每行的第一个数字均为1,其后数字为:前面数字,其后数字为:前面数字(数字(数字所在行号(自所在行号(自1起)数字所在行中的序号(自起)数字
10、所在行中的序号(自0起)起)/数字所在行中数字所在行中的序号。的序号。为了使输出的数字排列成如图所示的金字塔形状,需控制各行数为了使输出的数字排列成如图所示的金字塔形状,需控制各行数字之间空格的个数。每行第一个数字之前空格的个数依次递减字之间空格的个数。每行第一个数字之前空格的个数依次递减2,两个,两个数字之间的空格个数有三种情况:如果输出的数字是一个一位数,则数字之间的空格个数有三种情况:如果输出的数字是一个一位数,则在该数字后输出在该数字后输出3个空格;如果输出的数字是一个两位数,则在该数字个空格;如果输出的数字是一个两位数,则在该数字后输出后输出2个空格;如果输出的数字是一个三位数,则在
11、该数字后输出个空格;如果输出的数字是一个三位数,则在该数字后输出1个空格。个空格。根据以上规律,我们可以利用循环嵌套结构逐行逐个输出数字和根据以上规律,我们可以利用循环嵌套结构逐行逐个输出数字和空格。由于确定了行数,循环的次数也就跟着确定了,故我们使用的空格。由于确定了行数,循环的次数也就跟着确定了,故我们使用的是是for循环。循环。实施步骤实施步骤步骤步骤1 在在Visual C+中新建一个中新建一个C+ 源文件,根据分析编写代码如下:源文件,根据分析编写代码如下:#include void main() int n,r,c,m,j=0;coutm;while (m=14)/如果连续三次输入
12、的数字不符合要求,则退出程序如果连续三次输入的数字不符合要求,则退出程序 if (j=2) cout你的错误输入已达你的错误输入已达3次,你无权再输入!次,你无权再输入!endl;return;cout你输入的行数超出范围,请重新输入!你输入的行数超出范围,请重新输入!endl;coutm;j+;/累计输入次数累计输入次数for (n=0;n=m-1;n+)/逐行输出数字和空格逐行输出数字和空格 for(r=1;r15-n;r+)/*输出第一个数字之前的空格,为了打印出金输出第一个数字之前的空格,为了打印出金字塔形状,要保证各行依次递减字塔形状,要保证各行依次递减2个空格个空格*/cout ;
13、c=1;/第一个数字总为第一个数字总为1coutc ;/输出第一个数字以及输出第一个数字以及3个空格个空格for(r=1;r=n;r+) /输出各行的其他数字和空格输出各行的其他数字和空格 c=c*(n-r+1)/r;/计算应输出数字计算应输出数字if(c100)/根据数值大小确定数字后面的空格个数根据数值大小确定数字后面的空格个数if(c10)coutc ;/一位数的后面输出一位数的后面输出3个空格个空格elsecoutc ;/两位数的后面输出两位数的后面输出2个空格个空格elsecoutc ;/三位数的后面输出三位数的后面输出1个空格个空格coutendl;步骤步骤2 经编译、连接后,程序
14、运行结果如图所示。经编译、连接后,程序运行结果如图所示。任务二任务二 学习有关函数方面的区别学习有关函数方面的区别任务说明任务说明在本任务中,我们来学习在本任务中,我们来学习C+语言与语言与C语言在函数语法和使用方面的区别。语言在函数语法和使用方面的区别。预备知识预备知识一、局部变量随用随定义一、局部变量随用随定义二、作用域限定符二、作用域限定符:扩大全局变量的可见范围扩大全局变量的可见范围三、形式参数可带有默认值三、形式参数可带有默认值四、内联函数四、内联函数 在在C+中,允许变量定义语句在程序中的任何地方,只要在是中,允许变量定义语句在程序中的任何地方,只要在是使用它之前就可以;而使用它之
15、前就可以;而C语言中,必须要在函数开头部分。另外,语言中,必须要在函数开头部分。另外,C+允许重复定义变量,允许重复定义变量,C语言标准中是不允许的。语言标准中是不允许的。通常情况下,如果全局变量与局部变量同名,局部变量在其作用通常情况下,如果全局变量与局部变量同名,局部变量在其作用域内具有较高的优先权,将会屏蔽全局变量。在域内具有较高的优先权,将会屏蔽全局变量。在C+中,可以通过作中,可以通过作用域限定符用域限定符“:”访问被屏蔽的全局变量。访问被屏蔽的全局变量。二、作用域限定符二、作用域限定符:扩大全局变量的可见范围扩大全局变量的可见范围一、局部变量随用随定义一、局部变量随用随定义【例【例
16、2-4】 使用作用域限定符使用作用域限定符: 访问被屏蔽的全局变量。访问被屏蔽的全局变量。#include using namespace std;int v1=80;int main() int v1=8; coutv1; coutn您输入的您输入的v1值是值是v1endl;coutn全局变量全局变量v1的值是的值是:v1endl;return 0;程序运行结果如图所示。程序运行结果如图所示。三、形式参数可带有默认值三、形式参数可带有默认值通常情况下,在调用函数时要为函数的每个形参赋予一个相应的通常情况下,在调用函数时要为函数的每个形参赋予一个相应的实参值。但有时在主调函数中没有给出实参,或
17、者多次调用同一函数实参值。但有时在主调函数中没有给出实参,或者多次调用同一函数使用同样的实参时,给形参设置一个默认值,被调函数就可以按指定使用同样的实参时,给形参设置一个默认值,被调函数就可以按指定的默认值来执行。的默认值来执行。函数形参的默认值可以在函数原型的声明中或函数定义中指定。函数形参的默认值可以在函数原型的声明中或函数定义中指定。例如:例如:float area(float r=2.5);指定指定r的默认值为的默认值为2.5,在调用此函数时可以不必给出实参的值,即,在调用此函数时可以不必给出实参的值,即等价于调用等价于调用area(2.5)。如果函数中有多个形参,可以为每个形参指定一
18、个默认值,如果函数中有多个形参,可以为每个形参指定一个默认值,也可以只对部分形参指定默认值,指定默认值必须按照从右到左也可以只对部分形参指定默认值,指定默认值必须按照从右到左的顺序进行。即为某个参数指定默认值时,其后的参数都必须指的顺序进行。即为某个参数指定默认值时,其后的参数都必须指定默认值,否则已设默认值将被忽略。例如:定默认值,否则已设默认值将被忽略。例如:void f1(double a,float b=2.5,int c=1);/正确正确void f2(double a,float b=2.5,int c);/*不正确。由于不正确。由于c未指定默认值,故未指定默认值,故b的默认值无效
19、的默认值无效*/为函数中的形参设置了默认值后,实参的个数可以与形参的个为函数中的形参设置了默认值后,实参的个数可以与形参的个数不同。在进行函数调用时,实参与形参按照从左到右的顺序进行数不同。在进行函数调用时,实参与形参按照从左到右的顺序进行匹配,没有给出实参的,该形参就取指定的默认值。例如:匹配,没有给出实参的,该形参就取指定的默认值。例如:int sum(int a,int b, int c=5,int d=6);在此函数原型中指定了形参在此函数原型中指定了形参c和和d的默认值分别为的默认值分别为5和和6,若调用,若调用语句为:语句为:sum(3,2,1);则等价于执行语句:则等价于执行语句
20、:sum(3,2,1,6);四、内联函数四、内联函数定义内联函数的格式为:定义内联函数的格式为:inline 函数类型函数类型 函数名(形参列表)函数名(形参列表) 函数体函数体 ;一般只将规模很小(一般为一般只将规模很小(一般为5个语句以下)且使用频繁的函个语句以下)且使用频繁的函数声明为内联函数,并且内联函数内不能包括循环语句和数声明为内联函数,并且内联函数内不能包括循环语句和switch语句。语句。【例【例2-6】 内联函数应用示例。内联函数应用示例。#include inline int sum(int x,int y,int z);/对函数对函数sum原型的声明,声明为内联函数原型的
21、声明,声明为内联函数void main() int a,b,c,s;coutabc;s=sum(a,b,c); /求三个数的和求三个数的和coutsum is sendl;int sum(int x,int y,int z)/定义内联函数定义内联函数sum return x+y+z; 程序运行结果如图所示。程序运行结果如图所示。任务实施任务实施汉诺塔问题求解汉诺塔问题求解案例说明案例说明已知台上有已知台上有3根标号为根标号为A、B、C的柱子,在的柱子,在A柱子上放着若干柱子上放着若干个盘子,每一个都比下面的略小一些。现要把个盘子,每一个都比下面的略小一些。现要把A柱子上的盘子全柱子上的盘子全部
22、移到部移到C柱子上,要求是:一次只能移动一个盘子,移动过程中柱子上,要求是:一次只能移动一个盘子,移动过程中大盘子不能放在小盘子上面。大盘子不能放在小盘子上面。编写程序,输入编写程序,输入A柱子上盘子的数量,输出将盘子从柱子上盘子的数量,输出将盘子从A柱子移柱子移动到动到C柱子上时移动的步骤。柱子上时移动的步骤。案例分析案例分析汉诺塔问题是典型的递归调用问题。当汉诺塔问题是典型的递归调用问题。当n1时,直接将盘子时,直接将盘子从从A移动到移动到C即可。将即可。将n(n1)个盘子从)个盘子从A柱移动到柱移动到C柱可以分为柱可以分为三个步骤:三个步骤: 将将n-1个盘子借助个盘子借助C柱子移到柱子
23、移到B柱子;柱子; 将最后一个盘子从将最后一个盘子从A柱子移到柱子移到C柱子;柱子; 将将n-1个盘子从个盘子从B借助借助A移到移到C。计算移动次数的公式为计算移动次数的公式为2m-1,其中,其中m是盘子总数。是盘子总数。实施步骤实施步骤步骤步骤1 在在Visual C+中新建一个中新建一个C+ 源文件,根据分析编写代码如下:源文件,根据分析编写代码如下:#includevoid move(char one,char anoth) /将一个柱子上的盘子移动到另一个柱子将一个柱子上的盘子移动到另一个柱子 coutone anothendl; void hanoi(int n,char no1,c
24、har no2,char no3)/求解汉诺塔问题求解汉诺塔问题 if (n=1) move(no1,no3);/只有一个盘子时,从只有一个盘子时,从A移动到移动到Celse hanoi(n-1,no1,no3,no2);/将将n-1个盘子借助个盘子借助C从从A移动到移动到Bmove(no1,no3);/将最后一个盘子从将最后一个盘子从A移动到移动到Chanoi(n-1,no2,no1,no3);/将将n-1个盘子借助个盘子借助A从从B移动到移动到Cint times(int n)/计算移动次数计算移动次数 int i,times=1;for(i=1;i=n;i+)times*=2;retur
25、n times-1;void main() int m;coutm;cout当有当有m个盘子时,移动步骤依次为:个盘子时,移动步骤依次为:endl;hanoi(m,A,B,C);cout移动次数为移动次数为times(m)次次endl;步骤步骤2 经编译、连接后,程序运行结果如图所示。经编译、连接后,程序运行结果如图所示。任务三任务三 掌握掌握C+中关于引用的灵活运用中关于引用的灵活运用任务说明任务说明引用是引用是C+对对C的一个重要扩充,在本任务中我们就来学习引用。的一个重要扩充,在本任务中我们就来学习引用。一、引用的概念及使用一、引用的概念及使用预备知识预备知识二、引用作为形式参数二、引用
26、作为形式参数三、引用与指针的区别三、引用与指针的区别四、引用作为返回值四、引用作为返回值一、引用的概念及使用一、引用的概念及使用引用是指为变量起一个别名,声明引用型变量的一般形式为:引用是指为变量起一个别名,声明引用型变量的一般形式为:数据类型数据类型 &引用名变量名引用名变量名;例如,假设有一个变量例如,假设有一个变量a,若给它起一个别名,若给它起一个别名b,就可以这样,就可以这样来声明:来声明:int a;int &b=a;/声明声明b是是a的引用的引用声明引用时,声明引用时,b和和a表示相同的变量,它们具有相同的地址。换句表示相同的变量,它们具有相同的地址。换句话说,对话说,对b进行操作
27、也就是对进行操作也就是对a进行操作。进行操作。在声明一个引用型变量时,必须同时对其进行初始化。在声明一个引用型变量时,必须同时对其进行初始化。以下语句是不合法的:以下语句是不合法的:int a;int &b;b=a;【例【例2-7】 引用的简单应用。引用的简单应用。#include void main() int a=10;int &b=a;/声明声明b是是a的引用的引用a=a*a;couta bendl;b=b/2;coutb aendl;程序运行结果如图所示。程序运行结果如图所示。二、引用作为形式参数二、引用作为形式参数在在C语言中我们已经学了函数参数传递的两种方式:值传递和地语言中我们已
28、经学了函数参数传递的两种方式:值传递和地址传递。将引用作为函数的参数时,参数的传递方式为引用传递。址传递。将引用作为函数的参数时,参数的传递方式为引用传递。引用传递实际上传递的是变量的地址,这种方式节省了大量存储空引用传递实际上传递的是变量的地址,这种方式节省了大量存储空间,从而能够提高程序的执行效率。间,从而能够提高程序的执行效率。下面我们通过【例下面我们通过【例2-8】来比较值传递、地址传递和引用传递】来比较值传递、地址传递和引用传递这三种传递方式。这三种传递方式。【例【例2-8】 引用作为函数参数的应用示例。要求实现两个整型引用作为函数参数的应用示例。要求实现两个整型数据的交换。数据的交
29、换。#includevoid swap1(int x,int y)/参数的值传递参数的值传递 int temp;temp=x;x=y;y=temp;void swap2(int *x,int *y)/参数的地址传递参数的地址传递 int temp;temp=*x;*x=*y;*y=temp;void swap3(int &x,int &y) /参数的引用传递参数的引用传递 int temp;temp=x;x=y;y=temp;void main( ) int a,b;coutab;/输入输入a、b两变量的值两变量的值swap1(a,b);cout值传递的结果:值传递的结果:a bendl;sw
30、ap2(&a,&b);cout地址传递的结果:地址传递的结果:a bendl;swap3(a,b);cout引用传递的结果:引用传递的结果:a bendl;程序运行结果如图所示。程序运行结果如图所示。三、引用与指针的区别三、引用与指针的区别 引用是一个变量的别名,本身不单独分配自己的内存空间,引用是一个变量的别名,本身不单独分配自己的内存空间,而指针有自己的内存空间。而指针有自己的内存空间。 引用访问一个变量是直接访问,而指针是间接访问。引用访问一个变量是直接访问,而指针是间接访问。 引用在开始的时候就绑定到了一个内存空间,所以开始必须引用在开始的时候就绑定到了一个内存空间,所以开始必须赋初值
31、,而指针可以先定义后赋值。赋初值,而指针可以先定义后赋值。【例【例2-9】 引用与指针对比应用示例。引用与指针对比应用示例。#includevoid main( ) int i = 3,j = 4; couti=ij=jendl;int &x = i;/定义引用定义引用couti=i;j=j;x=xendl;couti的地址的地址&i;j的地址的地址&j;x的地址的地址&xendl;x = j;couti=i;j=j;x=xendl;couti的地址的地址&i;j的地址的地址&j;x的地址的地址&xendl;程序运行结果如图所示。程序运行结果如图所示。int *y;/定义指针定义指针couty
32、的地址的地址¥dl;y = &j;couti=i;j=j;y=yendl;couti的地址的地址&i;j的地址的地址&j;y的地址的地址¥dl;四、引用作为返回值四、引用作为返回值以引用返回函数值时,定义函数时需要在函数名前加以引用返回函数值时,定义函数时需要在函数名前加&,定义,定义函数的格式一般如下:函数的格式一般如下:类型标识符类型标识符 &函数名(形参列表及类型说明)函数名(形参列表及类型说明)函数体函数体1通过引用返回函数值的最大好处是,在内存中不产生通过引用返回函数值的最大好处是,在内存中不产生被返回值的副本。被返回值的副本。【例【例2-10】 定义两个函数:一个以变量
33、方式返回函数值,一个以引用定义两个函数:一个以变量方式返回函数值,一个以引用方式返回函数值。方式返回函数值。#includefloat temp;/定义全局变量定义全局变量tempfloat fn1(float r);/声明函数声明函数fn1float &fn2(float r);/声明函数声明函数fn2float fn1(float r)/定义函数定义函数fn1,以返回值的方法返回函数值,以返回值的方法返回函数值 temp=r*r*3.14; return temp;float &fn2(float r)/定义函数定义函数fn2,以引用方式返回函数值,以引用方式返回函数值 temp=r*r*
34、3.14; return temp;void main()/主函数主函数 float a=fn1(10.0); float b=fn2(10.0); coutaendlbendl;程序运行结果如图所示。程序运行结果如图所示。从上图中我们可以看出,两种方式的运行结果是相同的,但是它从上图中我们可以看出,两种方式的运行结果是相同的,但是它们在内存中的活动情况却是不相同的,下面我们对照图示进行说明。们在内存中的活动情况却是不相同的,下面我们对照图示进行说明。函数函数fn1()是一般的函数返回值方式:返回全局变量是一般的函数返回值方式:返回全局变量temp值时,值时,C+创建临时变量并将创建临时变量并
35、将temp的值的值314复制给该临时变量,返回到主函复制给该临时变量,返回到主函数后,赋值语句数后,赋值语句a=fnl(10.0)把临时变量的值把临时变量的值314复制给复制给a,其内存情况,其内存情况如图所示。如图所示。函数函数fn2()以引用方式返回返回值,不产生副本,所以,直接以引用方式返回返回值,不产生副本,所以,直接将变量将变量temp返回给主函数,这样避免了临时变量的产生。这种方返回给主函数,这样避免了临时变量的产生。这种方式提高了程序执行效率和空间利用率,其内存情况如图所示。式提高了程序执行效率和空间利用率,其内存情况如图所示。2返回引用的函数可以作为左值。返回引用的函数可以作为
36、左值。下面我们通过一个案例来了解这种使用方法。下面我们通过一个案例来了解这种使用方法。【例【例2-11】 将返回引用的函数值作为赋值表达式的左值。将返回引用的函数值作为赋值表达式的左值。#include int &put(int n);int vals10;int error=-1;void main() put(0)=10; /以以put(0)函数值作为左值,等价于函数值作为左值,等价于vals0=10; put(9)=20; /以以put(9)函数值作为左值,等价于函数值作为左值,等价于vals9=20; coutvals0endl; coutvals9=0 & n=9 ) return
37、valsn; else coutsubscript error; return error; 程序运行结果如图所示。程序运行结果如图所示。引用作为返回值时,要注意以下两点:引用作为返回值时,要注意以下两点:(1)不能返回局部变量的引用)不能返回局部变量的引用(2)不能返回函数内部)不能返回函数内部new分配的内存的引用分配的内存的引用案例说明案例说明任务实施任务实施通过引用操作数组通过引用操作数组创建两个数组,输入数组元素后将数组值输出,然后将两数组合并创建两个数组,输入数组元素后将数组值输出,然后将两数组合并为一个数组并输出。为一个数组并输出。实施步骤实施步骤步骤步骤1 在在Visual C
38、+中新建一个中新建一个C+ 源文件,编写代码如下:源文件,编写代码如下:#include#include#include#define LIST_INIT_SIZE 100/ 数组初始化元素个数数组初始化元素个数#define LISTINCREMENT 10/ 数组元素个数递增长度数组元素个数递增长度#define Status int#define ElemType int#define OK 1#define ERROR 0#define OVERFLOW -2typedef struct ElemType *elem;int length;/ 数组中实际存放的元素个数数组中实际存放的元
39、素个数int listsize;/ 数组长度,可容纳的最大元素个数数组长度,可容纳的最大元素个数 SqList ;Status InitList_Sq(SqList &L) / 构造一个空的数组构造一个空的数组L L.elem = (ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType); if (!L.elem) return ERROR;/ 存储分配失败存储分配失败 L.length = 0;/ 数组实际长度为数组实际长度为0 L.listsize = LIST_INIT_SIZE;/ 初始存储容量初始存储容量 return OK;Status
40、InputList_Sq(SqList &L) / 向数组向数组L中输入中输入n个元素个元素 int i; printf(nInput %d numbers:,L.length); for(i=0;iL.length;i+) scanf(%d,&L.elemi); printf(nInput Success!:); return OK;Status OutputList_Sq(SqList L) / 输出数组输出数组L中的所有元素中的所有元素 int i; printf(nThere Are %d numbers :, L.length); for(i=0;i L.length;i+) pri
41、ntf(%d , L.elemi); printf(nOutput Success!:); return OK;void MergeList_Sq(SqList La, SqList Lb, SqList &Lc) / 归并归并La和和Lb得到新的顺序线性表得到新的顺序线性表Lc ElemType *pa,*pb,*pc,*pa_last,*pb_last; pa = La.elem; pb = Lb.elem; Lc.listsize = Lc.length = La.length+Lb.length; pc = Lc.elem = (ElemType *)malloc(Lc.listsiz
42、e*sizeof(ElemType); if (!Lc.elem) exit(OVERFLOW);/ 存储分配失败存储分配失败 pa_last = La.elem+La.length-1; pb_last = Lb.elem+Lb.length-1; while (pa = pa_last & pb = pb_last) / 归并归并 if (*pa = *pb) *pc+ = *pa+; else *pc+ = *pb+; while (pa = pa_last) *pc+ = *pa+;/ 插入插入La的剩余元素的剩余元素 while (pb = pb_last) *pc+ = *pb+;
43、/ 插入插入Lb的剩余元素的剩余元素 void main()/ 主函数主函数 SqList La,Lb,Lc; InitList_Sq(La); InitList_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)
44、; / 将数组将数组La与与Lb合并合并 printf(nC=merge(A,B):); OutputList_Sq(Lc);步骤步骤2 经编译、连接后,程序运行结果如图所示。经编译、连接后,程序运行结果如图所示。任务四任务四 掌握掌握C+中管理动态内存空间的方法中管理动态内存空间的方法任务说明任务说明在本任务中我们来学习使用在本任务中我们来学习使用C+应用程序的结构、应用程序的结构、C+程序的开程序的开发过程、发过程、C+开发环境开发环境Visual C+ 6.0的使用。的使用。预备知识预备知识在在C+语言中,语言中,new和和delete可用来实现动态内存空间的管理。可用来实现动态内存空间
45、的管理。一、用一、用new申请动态内存空间申请动态内存空间二、用二、用delete释放动态内存空间释放动态内存空间new运算符的操作数是一个数据类型,其作用是为变量分配内存运算符的操作数是一个数据类型,其作用是为变量分配内存空间,并返回指向该变量的指针。空间,并返回指向该变量的指针。new运算符使用的一般格式为:运算符使用的一般格式为:一、用一、用new申请动态内存空间申请动态内存空间指针变量指针变量new 数据类型数据类型 (初值初值)其中,初值也可以不给出。例如:其中,初值也可以不给出。例如:int *p;/定义了一个指向整型变量的指针定义了一个指向整型变量的指针p=new int(5);
46、/*为一个整型变量分配内存空间,为一个整型变量分配内存空间,p指向该指向该变量的首地址,将该整型变量初始化为变量的首地址,将该整型变量初始化为5*/new运算符还可以为多个变量分配存储空间。例如:运算符还可以为多个变量分配存储空间。例如:int *p;/定义了一个指向整型变量的指针定义了一个指向整型变量的指针p=new int 8;/*为为8个整型变量分配内存空间,个整型变量分配内存空间,p指向第一个指向第一个整型变量的首地址整型变量的首地址*/for(int i=0;i8;i+)/为为p指向的指向的8个整型变量赋值个整型变量赋值pi=i;二、用二、用delete释放动态内存空间释放动态内存空
47、间当当new分配的空间使用完之后,必须用分配的空间使用完之后,必须用delete运算符释放这些空运算符释放这些空间。间。delete运算符的一般格式为:运算符的一般格式为:delete 指针变量指针变量其中,指针变量是指用其中,指针变量是指用new运算符申请分配的内存地址。当用运算符申请分配的内存地址。当用delete释放为多个变量分配的地址时,其格式为:释放为多个变量分配的地址时,其格式为:delete 指针变量指针变量其中其中中不需要填写变量的个数。例如:中不需要填写变量的个数。例如:int *p=new int a8;delete p;任务实施任务实施new、delete的基本使用方法的
48、基本使用方法案例说明案例说明在本任务中,我们使用在本任务中,我们使用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.1415f); /初始值为初始值为3.1
49、415 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!项目三项目三任务一任务一 初识类与对象初识类与对象
50、任务二任务二 深入学习类与对象的相关知识深入学习类与对象的相关知识类与对象类与对象 抽象与实体的完美结合抽象与实体的完美结合任务说明任务说明预备知识预备知识任务一任务一 初识类与对象初识类与对象类(类(Class)是具有相同属性和行为的一组对象的集合,是对属于该类)是具有相同属性和行为的一组对象的集合,是对属于该类的全部对象的统一抽象描述。类是面向对象中最为重要的概念之一,利用的全部对象的统一抽象描述。类是面向对象中最为重要的概念之一,利用类可以实现数据的封装、隐藏、继承和派生,类可以实现数据的封装、隐藏、继承和派生,C+中许多复杂的程序都是用中许多复杂的程序都是用类来实现的。使用类时,用户不