c++精通ppt8
合集下载
幻灯片C语言程序设计视频教程第8章课件

幻灯片C语言程序设计视频教程第8章
8.4.3 对被调用函数的声明和函数 原型
在一个函数中调用另一个函数需要具备的条件如下 。 (1)首先被调用的函数必须是已经存在的函数(是库函数或用户自 己定义的函数)。但光有这一条件还不够。 (2)如果使用库函数,还应该在本文件开头用#include命令将调用 有关库函数时所需用到的信息“包含”到本文件中去。 (3)如果使用用户自己定义的函数,而该函数的位置在调用它的 函数(即主调函数)的后面(在同一个文件中),应该在主调函数中 对被调用的函数作声明。
幻灯片C语言程序设计视频教程第8章
8.3.2 函数的返回值
通过函数调用使主调函数能得到一个确定的值,这就是函 数的返回值。 (1)函数的返回值是通过函数中的return语句获得的。return语句 将被调用函数中的一个确定值带回主调函数中去。 (2)函数值的类型。既然函数有返回值,这个值当然应属于某一 个确定的类型,应当在定义函数时指定函数值的类型。 (3)在定义函数时指定的函数类型一般应该和return语句中的表达 式类型一致。如果函数值的类型和return语句中表达式的值不一 致,则以函数类型为准。对数值型数据,可以自动进行类型转 换。即函数类型决定返回值的类型。
[例8.7]有5个人坐在一起,问第5个人多少岁?他说比第 4个人大2岁。问第4个人岁数,他说比第3个人大2岁。 问第3个人,又说比第2个人大2岁。问第2个人,说比第 1个人大2岁。最后问第1个人,他说是10岁。请问第5个 人多大
10 n1 ag(ne) ag(ne1)2 n1
幻灯片C语言程序设计视频教程第8章
此外数组名也可以作实参和形参传递的是数组首元素的地871数组元素作函数实参由于实参可以是表达式而数组元素可以是表达式的组成部分因此数组元素当然可以作为函数的实参与用变量作实参一样是单向传递即值传送方式
8.4.3 对被调用函数的声明和函数 原型
在一个函数中调用另一个函数需要具备的条件如下 。 (1)首先被调用的函数必须是已经存在的函数(是库函数或用户自 己定义的函数)。但光有这一条件还不够。 (2)如果使用库函数,还应该在本文件开头用#include命令将调用 有关库函数时所需用到的信息“包含”到本文件中去。 (3)如果使用用户自己定义的函数,而该函数的位置在调用它的 函数(即主调函数)的后面(在同一个文件中),应该在主调函数中 对被调用的函数作声明。
幻灯片C语言程序设计视频教程第8章
8.3.2 函数的返回值
通过函数调用使主调函数能得到一个确定的值,这就是函 数的返回值。 (1)函数的返回值是通过函数中的return语句获得的。return语句 将被调用函数中的一个确定值带回主调函数中去。 (2)函数值的类型。既然函数有返回值,这个值当然应属于某一 个确定的类型,应当在定义函数时指定函数值的类型。 (3)在定义函数时指定的函数类型一般应该和return语句中的表达 式类型一致。如果函数值的类型和return语句中表达式的值不一 致,则以函数类型为准。对数值型数据,可以自动进行类型转 换。即函数类型决定返回值的类型。
[例8.7]有5个人坐在一起,问第5个人多少岁?他说比第 4个人大2岁。问第4个人岁数,他说比第3个人大2岁。 问第3个人,又说比第2个人大2岁。问第2个人,说比第 1个人大2岁。最后问第1个人,他说是10岁。请问第5个 人多大
10 n1 ag(ne) ag(ne1)2 n1
幻灯片C语言程序设计视频教程第8章
此外数组名也可以作实参和形参传递的是数组首元素的地871数组元素作函数实参由于实参可以是表达式而数组元素可以是表达式的组成部分因此数组元素当然可以作为函数的实参与用变量作实参一样是单向传递即值传送方式
11803_谭浩强《C程序设计》课件第8章PPT课件

03
如何处理文件读写错误?
2024/1/27
04
在进行文件读写操作时,需要判断返回值是否成功,如果 失败则需要使用perror()等函数输出错误信息。
05
如何实现文件的追加写入?
06
在使用fopen()函数打开文件时,使用追加模式"a"或"a+" 可以实现文件的追加写入。
29
拓展延伸:高级文件操作技术探讨
文本文件的读写操作
使用fscanf()、fprintf()等函数进行文 本文件的读写操作。
2024/1/27
文本文件的打开与关闭
使用fopen()函数打开文本文件,使 用fclose()函数关闭文本文件。
文本文件的定位与修改
使用fseek()、ftell()等函数进行文本 文件的定位与修改。
24
二进制文件操作实例
学习要求
认真听讲,理解文件操作的基本概念 和原理;多动手实践,通过编写程序 加深对文件操作的理解和掌握;注意 细节和规范,养成良好的编程习惯。
6
02
文件类型与指针
2024/1/27
7
标准文件类型
2024/1/27
文本文件
存储字符数据,每个字符对应一个ASCII码,Байду номын сангаас于阅读和编辑。
二进制文件
存储二进制数据,适用于非字符数据或需要高效存储和读取的场 景。
write
将指定的数据块写入到指定的文件描述符中(低级I/O函数)。
2024/1/27
14
04
随机访问文件内容
2024/1/27
15
文件定位函数
01
fseek()
用于设置文件位置指针,可以实 现在文件中的任意位置进行读写 操作。
如何处理文件读写错误?
2024/1/27
04
在进行文件读写操作时,需要判断返回值是否成功,如果 失败则需要使用perror()等函数输出错误信息。
05
如何实现文件的追加写入?
06
在使用fopen()函数打开文件时,使用追加模式"a"或"a+" 可以实现文件的追加写入。
29
拓展延伸:高级文件操作技术探讨
文本文件的读写操作
使用fscanf()、fprintf()等函数进行文 本文件的读写操作。
2024/1/27
文本文件的打开与关闭
使用fopen()函数打开文本文件,使 用fclose()函数关闭文本文件。
文本文件的定位与修改
使用fseek()、ftell()等函数进行文本 文件的定位与修改。
24
二进制文件操作实例
学习要求
认真听讲,理解文件操作的基本概念 和原理;多动手实践,通过编写程序 加深对文件操作的理解和掌握;注意 细节和规范,养成良好的编程习惯。
6
02
文件类型与指针
2024/1/27
7
标准文件类型
2024/1/27
文本文件
存储字符数据,每个字符对应一个ASCII码,Байду номын сангаас于阅读和编辑。
二进制文件
存储二进制数据,适用于非字符数据或需要高效存储和读取的场 景。
write
将指定的数据块写入到指定的文件描述符中(低级I/O函数)。
2024/1/27
14
04
随机访问文件内容
2024/1/27
15
文件定位函数
01
fseek()
用于设置文件位置指针,可以实 现在文件中的任意位置进行读写 操作。
C语言详细教程(完整版)ppt课件

. C Programming Language
教学目的:掌握“文化基础”中的相关概 念,明确学习方法,了解C语言基本知识。
教学要求:明确本课程的目标及学习方法, 复习“文化基础”中与C语言相关的知识: 数制、编码、计算机系统组成,了解算法 的概念及表示、C语言及标识符、C语言基 本结构。
学时:2学时
输出AVER的值
.
A
C Programming Language
结束
[例1.2] 输出一个数的绝对值。
开始 输入 X
输入 X N X>=0吗? Y
N X>=0吗? Y
输出 -X 输出 X
输出 -X
输出 X
结束
. C Programming Language
[例1.3] 输入10个 数,把其 中的正数 输出。
程序语言发展现状程序语言发展现状programminglanguage三翻译方式三翻译方式高级语言源程序高级语言源程序目标程序目标程序codecode翻译翻译programminglanguage用高级语言用高级语言书写的源程序书写的源程序用高级语言用高级语言书写的源程序书写的源程序机器指令机器指令程序程序机器指令机器指令程序程序函数函数库库函数函数库库编译程序编译程序编译编译用用高级语言高级语言书写的书写的源程序源程序用高级语言高级语言书写的书写的源程序源程序执行结果执行结果执行结果执行结果解释程序解释程序函数函数库库函数函数库库解释并解释并执行执行programminglanguage用计算机解决问题的基本过程
. C Programming Language
1.1 引言 1.2 算法和程序设计初步 1.3 C语言简介 1.4 集成开发环境TurboC 2.0简介
教学目的:掌握“文化基础”中的相关概 念,明确学习方法,了解C语言基本知识。
教学要求:明确本课程的目标及学习方法, 复习“文化基础”中与C语言相关的知识: 数制、编码、计算机系统组成,了解算法 的概念及表示、C语言及标识符、C语言基 本结构。
学时:2学时
输出AVER的值
.
A
C Programming Language
结束
[例1.2] 输出一个数的绝对值。
开始 输入 X
输入 X N X>=0吗? Y
N X>=0吗? Y
输出 -X 输出 X
输出 -X
输出 X
结束
. C Programming Language
[例1.3] 输入10个 数,把其 中的正数 输出。
程序语言发展现状程序语言发展现状programminglanguage三翻译方式三翻译方式高级语言源程序高级语言源程序目标程序目标程序codecode翻译翻译programminglanguage用高级语言用高级语言书写的源程序书写的源程序用高级语言用高级语言书写的源程序书写的源程序机器指令机器指令程序程序机器指令机器指令程序程序函数函数库库函数函数库库编译程序编译程序编译编译用用高级语言高级语言书写的书写的源程序源程序用高级语言高级语言书写的书写的源程序源程序执行结果执行结果执行结果执行结果解释程序解释程序函数函数库库函数函数库库解释并解释并执行执行programminglanguage用计算机解决问题的基本过程
. C Programming Language
1.1 引言 1.2 算法和程序设计初步 1.3 C语言简介 1.4 集成开发环境TurboC 2.0简介
C程序设计第四版课件第8章善于利用指针

通过指针访问数组元素
使用指针访问数组元素
01
通过指针可以访问数组中的元素,即通过解引用指针来获取元
素的值。
指针的算术运算
02
可以通过对指针进行算术运算来访问数组中的相邻元素。
指向元素的指针变量
03
可以定义一个指向数组中某个元素的指针变量,通过该变量可
以访问该元素。
指针与字符串
1 2
字符串常量的指针
通过二级指针,可以方便地操 作二维数组和多维数组,实现 更加灵活的数据处理。
THANKS
感谢观看
指针的声明与初始化
声明指针变量时,需要在变量名前加 上星号(*)。
未初始化的指针变量可能指向任何位 置,因此使用前应确保指针已被正确 初始化。
初始化指针变量时,需要将其设置为 某个变量的地址。
指针的赋值与运算
可以将一个变量的地址赋值给指 针变量。
可以对指针进行加法或减法运算 ,以改变指针所指向的内存地址
指针数组可以用来存储多个变量 的地址,通过数组索引访问不同 的地址,实现动态内存分配和字
符串处理等功能。
例如,char *arr[10] 表示一个包 含10个字符指针的数组,每个指
针可以指向一个字符串。
二级指针
二级指针是指向指针的指针, 用于间接地访问和修改变量的 值。
二级指针在处理动态内存分配 、函数参数传递和多维数组等 场景中非常有用。
05
指针的高级应用
指向指针的指针
指向指针的指针是指一个指针变量,它存储的是另一个指针变量的地址,而不是变 量的值。
通过指向指针的指针,可以间接地访问和修改变量的值,增加了对内存地址操作的 灵活性。
指向指针的指针在处理动态内存分配、函数参数传递和多维数组等场景中非常有用 。
谭浩强《C程序设计》课件第8章-讲义

在C++中,所谓多态性(polymorphism)是指: 由继 承而产生的相关的不同的类,其对象对同一消息会 作出不同的响应。多态性是面向对象程序设计的一 个重要特征,能增加程序的灵活性。
8.1.2 面向对象程序设计的特点
传统的面向过程程序设计是围绕功能进行的,用一 个函数实现一个功能。所有的数据都是公用的,一 个函数可以使用任何一组数据,而一组数据又能被 多个函数所使用(见图8.3)。
图8.3
面向对象程序设计采取的是另外一种思路。它面对 的是一个个对象。实际上,每一组数据都是有特定 的用途的,是某种操作的对象。也就是说,一组操 作调用一组数据。
程序设计者的任务包括两个方面: 一是设计所需的
各种类和对象,即决定把哪些数据和操作封装在一 起;二是考虑怎样向有关对象发送消息,以完成所 需的任务。这时他如同一个总调度,不断地向各个 对象发出命令,让这些对象活动起来(或者说激活这 些对象),完成自己职责范围内的工作。各个对象的 操作完成了,整体任务也就完成了。显然,对一个 大型任务来说,面向对象程序设计方法是十分有效 的,它能大大降低程序设计人员的工作难度,减少 出错机会。
精品
谭浩强《C程序设计》课 第8章
第8章 类和对象
8.1 面向对象程序设计方法概述 8.2 类的声明和对象的定义 8.3 类的成员函数 8.4 对象成员的引用 8.5 类的封装性和信息隐蔽 8.6 类和对象的简单应用举例
8.1 面向对象程序设计方法概述
到目前为止,我们介绍的是C++在面向过程的程序设 计中的应用。对于规模比较小的程序,编程者可以 直接编写出一个面向过程的程序,详细地描述每一 瞬时的数据结构及对其的操作过程。但是当程序规 模较大时,就显得力不从心了。C++就是为了解决编 写大程序过程中的困难而产生的。
8.1.2 面向对象程序设计的特点
传统的面向过程程序设计是围绕功能进行的,用一 个函数实现一个功能。所有的数据都是公用的,一 个函数可以使用任何一组数据,而一组数据又能被 多个函数所使用(见图8.3)。
图8.3
面向对象程序设计采取的是另外一种思路。它面对 的是一个个对象。实际上,每一组数据都是有特定 的用途的,是某种操作的对象。也就是说,一组操 作调用一组数据。
程序设计者的任务包括两个方面: 一是设计所需的
各种类和对象,即决定把哪些数据和操作封装在一 起;二是考虑怎样向有关对象发送消息,以完成所 需的任务。这时他如同一个总调度,不断地向各个 对象发出命令,让这些对象活动起来(或者说激活这 些对象),完成自己职责范围内的工作。各个对象的 操作完成了,整体任务也就完成了。显然,对一个 大型任务来说,面向对象程序设计方法是十分有效 的,它能大大降低程序设计人员的工作难度,减少 出错机会。
精品
谭浩强《C程序设计》课 第8章
第8章 类和对象
8.1 面向对象程序设计方法概述 8.2 类的声明和对象的定义 8.3 类的成员函数 8.4 对象成员的引用 8.5 类的封装性和信息隐蔽 8.6 类和对象的简单应用举例
8.1 面向对象程序设计方法概述
到目前为止,我们介绍的是C++在面向过程的程序设 计中的应用。对于规模比较小的程序,编程者可以 直接编写出一个面向过程的程序,详细地描述每一 瞬时的数据结构及对其的操作过程。但是当程序规 模较大时,就显得力不从心了。C++就是为了解决编 写大程序过程中的困难而产生的。
C语言-8-二维数组 PPT课件

#include <stdio.h> main() { int a[3][4],max, i, j,ai,aj ;
for (i=0;i<3;i++) for (j=0;j<4;j++) scanf(“%d”,&a[i][j]);
max=a[0][0]; ai=aj=0; for (i=0;i<3;i++)
问题1: int b[3][2];
问题2: float a[2][2][2];
二维数组的特殊性
将二维数组也可看作一种特殊 的一维数组;则一维数组的数组 元素又是一个一维数组的数组名。
如有定义,int a[2][4];
数组名 a 可看作由a[0]、a[1] 两个元素组成的一维数组。而数 组元素a[0],a[1]又是包含四个数 组元素的一维数组的数组名。
for(j=0;j<5;j++)
0 1 1 2 34 1 02 2 34 2 01 3 34
if(j!=i) a[i][j]=j; } for(i=0;i<5;i++)
3 01 2 44 4 01 2 35
{ for(j=0;j<5;j++)
printf("%2d",a[i][j]);
printf("\n");}
#include <stdio.h> main() { int a[10][10],i,j, k;
a[0][0]=1; for(i=1;i<10;i++) { a[i][0]=1;a[i][i]=1;
for(j=1;j<i;j++) a[i][j]=a[i-1][j-1]+a[i-1][j]; }
for (i=0;i<3;i++) for (j=0;j<4;j++) scanf(“%d”,&a[i][j]);
max=a[0][0]; ai=aj=0; for (i=0;i<3;i++)
问题1: int b[3][2];
问题2: float a[2][2][2];
二维数组的特殊性
将二维数组也可看作一种特殊 的一维数组;则一维数组的数组 元素又是一个一维数组的数组名。
如有定义,int a[2][4];
数组名 a 可看作由a[0]、a[1] 两个元素组成的一维数组。而数 组元素a[0],a[1]又是包含四个数 组元素的一维数组的数组名。
for(j=0;j<5;j++)
0 1 1 2 34 1 02 2 34 2 01 3 34
if(j!=i) a[i][j]=j; } for(i=0;i<5;i++)
3 01 2 44 4 01 2 35
{ for(j=0;j<5;j++)
printf("%2d",a[i][j]);
printf("\n");}
#include <stdio.h> main() { int a[10][10],i,j, k;
a[0][0]=1; for(i=1;i<10;i++) { a[i][0]=1;a[i][i]=1;
for(j=1;j<i;j++) a[i][j]=a[i-1][j-1]+a[i-1][j]; }
C语言程序设计教程第8章75页PPT
39、没有不老的誓言,没有不变的承 诺,踏 上旅途 ,义无 反顾。 40、对时间的价值没有没有深切认识 的人, 决不会 坚韧掉进坑里。——黑格尔 32、希望的灯一旦熄灭,生活刹那间变成了一片黑暗。——普列姆昌德 33、希望是人生的乳母。——科策布 34、形成天才的决定因素应该是勤奋。——郭沫若 35、学到很多东西的诀窍,就是一下子不要学很多。——洛克
C语言程序设计教程第8章
36、“不可能”这个字(法语是一个字 ),只 在愚人 的字典 中找得 到。--拿 破仑。 37、不要生气要争气,不要看破要突 破,不 要嫉妒 要欣赏 ,不要 托延要 积极, 不要心 动要行 动。 38、勤奋,机会,乐观是成功的三要 素。(注 意:传 统观念 认为勤 奋和机 会是成 功的要 素,但 是经过 统计学 和成功 人士的 分析得 出,乐 观是成 功的第 三要素 。
C语言程序设计教程第8章
36、“不可能”这个字(法语是一个字 ),只 在愚人 的字典 中找得 到。--拿 破仑。 37、不要生气要争气,不要看破要突 破,不 要嫉妒 要欣赏 ,不要 托延要 积极, 不要心 动要行 动。 38、勤奋,机会,乐观是成功的三要 素。(注 意:传 统观念 认为勤 奋和机 会是成 功的要 素,但 是经过 统计学 和成功 人士的 分析得 出,乐 观是成 功的第 三要素 。
[精品]C语言第8章的课件93页PPT
1、不要轻言放弃,否则对不起自己。
2、要冒一次险!整个生命就是一场冒险。走得最远的人,常是愿意 去做,并愿意去冒险的人。“稳妥”之船,从未能从岸边走远。-戴尔.卡耐基。
梦 境
3、人生就像一杯没有加糖的咖啡,喝起来是苦涩的,回味起来却有 久久不会退去的余香。
[精品]C语言第8章的课件 4、守业的最好办法就是不断的发展。 5、当爱不能完美,我宁愿选择无悔,不管来生多么美丽,我不愿失 去今生对你的记忆,我不求天长地久的美景,我只要生生世世的轮 回里有你。
Hale Waihona Puke 谢谢你的阅读❖ 知识就是财富 ❖ 丰富你的人生
71、既然我已经踏上这条道路,那么,任何东西都不应妨碍我沿着这条路走下去。——康德 72、家庭成为快乐的种子在外也不致成为障碍物但在旅行之际却是夜间的伴侣。——西塞罗 73、坚持意志伟大的事业需要始终不渝的精神。——伏尔泰 74、路漫漫其修道远,吾将上下而求索。——屈原 75、内外相应,言行相称。——韩非
2、要冒一次险!整个生命就是一场冒险。走得最远的人,常是愿意 去做,并愿意去冒险的人。“稳妥”之船,从未能从岸边走远。-戴尔.卡耐基。
梦 境
3、人生就像一杯没有加糖的咖啡,喝起来是苦涩的,回味起来却有 久久不会退去的余香。
[精品]C语言第8章的课件 4、守业的最好办法就是不断的发展。 5、当爱不能完美,我宁愿选择无悔,不管来生多么美丽,我不愿失 去今生对你的记忆,我不求天长地久的美景,我只要生生世世的轮 回里有你。
Hale Waihona Puke 谢谢你的阅读❖ 知识就是财富 ❖ 丰富你的人生
71、既然我已经踏上这条道路,那么,任何东西都不应妨碍我沿着这条路走下去。——康德 72、家庭成为快乐的种子在外也不致成为障碍物但在旅行之际却是夜间的伴侣。——西塞罗 73、坚持意志伟大的事业需要始终不渝的精神。——伏尔泰 74、路漫漫其修道远,吾将上下而求索。——屈原 75、内外相应,言行相称。——韩非
C+程序设计课件第8章
3
参数传递
了解如何将函数指针作为参数传递给其他函数。
指针和结构体
学习如何在结构体中使用指针。掌握指针和结构体的关系,以及如何通过指针访问和修改结构体的成员。
结构体指针
了解如何声明和使用结构体 指针。
访问和修改
通过指针访问和修改结构体 的成员。
高级技巧
探索在结构体中使用指针的 高级技巧和应用。
深入了解如何使用指针查找和比 较字符串。
字符串艺术
探索使用指针进行字符串处理的 高级技巧和应用。
函数指针和回调函数
介绍函数指针和回调函数的概念和用法。学习如何声明、定义和使用函数指针,以及如何将函数指针作 为参数传递给其他函数。
1
函数指针
深入研究函数指针的概念和用法。
2
回调函数
探索回调函数的概念和实际应用。
1
动态内存分配
探索动态内存分配的概念和原理。
2
new和delete
学习使用new和delete运算符进行动态内存的分配和释放。
3
内存泄漏
了解内存泄漏研究常量指针和指针常量的概念和用法。了解指针和常量之间的关系,以及如何声明和使用 常量指针和指针常量。
常量指针
学习如何声明和使用常量指针。
指针常量
了解如何声明和使用指针常量。
关系和应用
深入探讨指针和常量之间的关系和应用。
指针和C字符串
研究指针在C字符串操作中的作用。掌握使用指针处理字符串的常见技巧和方法,如字符串的复制、连接、查 找和比较。
字符串操作
学习使用指针进行字符串操作的 基本技巧和方法。
查找和比较
C+程序设计课件第8章
深入学习C++指针的基本概念,包括指针和数组、指针和函数,以及常见的 指针应用,为进一步的学习打下坚实的基础。
C好的课件第八章C好的课件
return(z);
}
❖说明: 实参必须有确定的值 形参必须指定类型 形参与实参类型一致,个数相同
若形参与实参类型不一致,自动按形参类型转 换———函数调用转换
形参在函数被调用前不占内存;函数调用时为形参 分配内存;调用结束,内存释放
例 计算x的立方
#include <stdio.h> float cube(float x) { return(x*x*x); } main() { float a, product;
参数(实际参数) 例 printf(“%d”,max(a,b));
m=max(a,max(b,c));
调用方式
❖函数语句:函数调用可单独成为一个语句 例 output(); ;
printf(“Hello,World!\n”); ❖函数表达式: 调用函数后的返回值可参加表达式的计
算,这时要求被调函数带返回值。 例 sum=add(a,b);
}
函数体
例 例有参有函参数函(数现(代现风代格风)格)
intimntamx例(ainxt(i空xn,t函yx),数int y)
例或{pripn无rtisn参tatfr(函(“)*数*{}**zr{}e*=int*xuzrt*e>r=iznnt*{yxu;dt(*?>rzuz*}nx)ym;\;(:?nyzmx”);;):yy;(;
{floflao{taatdfalddo(daf(ltofalao,tbax;t,flfoloaat)t;y)/*function declaration*/
{flofalot aiant,btz,c;c;; scza=nxfs+(c"ya%;nff,(%"%f"f,,&%af,"&,&b)a;,&b);
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
35
C++语言程序设计
清华大学 郑莉
7
C++语言程序设计
清华大学 郑莉
两种形式
运 算 符 重 载
重载为类成员函数。 重载为非成员函数(通常为友元函 数)。
8
C++语言程序设计
清华大学 郑莉
运算符函数
运 算 符 重 载
声明形式 函数类型 operator 运算符(形参) { ...... } 重载为类成员函数时 参数个数=原操作数个数-1(后置++、--除外) 重载为友元函数时 参数个数=原操作数个数, 且至少应该有一个自定义类型的形参。
12
complex complex:: operator +(complex c2) //重载函数实现 { complex c; c.real=c2.real+real; c.imag=c2.imag+imag; return complex(c.real,c.imag); }
13
complex complex:: operator -(complex c2) //重载函数实现 { complex c; c.real=real-c2.real; c.imag=imag-c2.imag; return complex(c.real,c.imag); }
21
//后置单目运算符重载 Clock Clock::operator ++(int) { //注意形参表中的整型参数 Clock old=*this; ++(*this); return old; }
22
//其它成员函数的实现略 int main() { Clock myClock(23,59,59); cout<<"First time output:"; myClock.ShowTime(); cout<<"Show myClock++:"; (myClock++).ShowTime(); cout<<"Show ++myClock:"; (++myClock).ShowTime(); }
28
complex operator +(complex c1,complex c2) //运算符重载友元函数实现 { } complex operator -(complex c1,complex c2) //运算符重载友元函数实现 { return complex(c1.real-c2.real, c1.imag-c2.imag); } // 其他函数和主函数同例8-1
29
return complex(c2.real+c1.real, c2.imag+c1.imag);
C++语言程序设计
清华大学 郑莉
静态绑定与动态绑定
绑定
– 程序自身彼此关联的过程,确定程序中的 操作调用与执行该操作的代码间的关系。
静态绑定
– 绑定过程出现在编译阶段,用对象名或者 类名来限定要调用的函数。
23
程序运行结果为:
First time output: 23:59:59 Show myClock++: 23:59:59 Show ++myClock: 0:0:1
24
C++语言程序设计
清华大学 郑莉
运算符非成员函数的设计
运 算 符 重 载
如果需要重载一个运算符,使之能够 用于操作某类对象的私有成员,可以 此将运算符重载为该类的非成员(通 常为友元)函数。 函数的形参代表依自左至右次序排列 的各操作数。 后置单目运算符 ++和--的重载函数, 形参列表中要增加一个int,但不必写 形参名。
– 函数重载 – 运算符重载 – 虚函数
3
C++语言程序设计
清华大学 郑莉
问题举例——复数的运算
运 算 符 重 载
class complex //复数类定义 { public: complex(double r=0.0,double i=0.0) //构造函数 { real=r; imag=i; } void display(); //显示复数的值 private: double real; double imag; };
26
C++语言程序设计
清华大学 郑莉
例8-3
运 算 符 重 载
将+、-(双目)重载为复数类的友元 函数。
两个操作数都是复数类的对象。
27
#include<iostream> using namespace std; class complex //复数类定义 { public: //外部接口 complex(double r=0.0,double i=0.0) { real=r; imag=i; } //构造函数 friend complex operator + (complex c1,complex c2); //运算符+重载为友元函数 friend complex operator - (complex c1,complex c2); //运算符-重载为友元函数 void display(); //显示复数的值 private: //私有数据成员 double real; double imag; };
C++语言程序设计
第八章 多态性
清华大学 郑 莉
1
C++语言程序设计
清华大学 郑莉
本章主要内容
多态性 运算符重载 虚函数 纯虚函数 抽象类
2
C++语言程序设计
清华大学 郑莉
多态性的概念
多态性是面向对象程序设计的重要特 征之一。 多态性是指发出同样的消息被不同类 型的对象接收时有可能导致完全不同 的行为。 多态的实现:
9
C++语言程序设计
清华大学 郑莉
运算符成员函数的设计
运 算 符 重 载
双目运算符 B
– 如果要重载 B 为类成员函数,使之能够实
现表达式 oprd1 B oprd2,其中 oprd1 为A
类对象,则 B 应被重载为 A 类的成员函数, 形参类型应该是 oprd2 所属的类型。 – 经重载后,表达式 oprd1 B oprd2 相当于 oprd1.operator B(oprd2)
20
Clock& Clock::operator ++() //前置单目运算符重载函数 { Second++; if(Second>=60) { Second=Second-60; Minute++; if(Minute>=60) { Minute=Minute-60; Hour++; Hour=Hour%24; } } return *this; }
4
C++语言程序设计
清华大学 郑莉
问题举例——复数的运算
运 算 符 重 载
用“+”、“-”能够实现复数的加减运 算吗?
实现复数加减运算的方法
——重载“+”、“-”运算符
5
C++语言程序设计
清华大学 郑莉
运算符重载的实质
运 算 符 重 载
运算符重载是对已有的运算符赋予多重含义 必要性
– C++中预定义的运算符其运算对象只能是基本数 据类型,而不适用于用户自定义类型(如类)
14
void complex::display() { cout<<"("<<real<<","<<imag<<")"<<endl; }
int main() //主函数 { complex c1(5,4),c2(2,10),c3; //声明复数类的对象 cout<<"c1="; c1.display(); cout<<"c2="; c2.display(); c3=c1-c2; //使用重载运算符完成复数减法 cout<<"c3=c1-c2="; c3.display(); c3=c1+c2; //使用重载运算符完成复数加法 cout<<"c3=c1+c2="; c3.display(); }
25
C++语言程序设计
清华大学 郑莉
运算符友元函数的设计
运 算 符 重 载
双目运算符 B重载后, 表达式oprd1 B oprd2 等同于operator B(oprd1,oprd2 ) 前置单目运算符 B重载后, 表达式 B oprd 等同于operator B(oprd ) 后置单目运算符 ++和--重载后, 表达式 oprd B 等同于operator B(oprd,0 )
动态绑定
– 绑定过程工作在程序运行时执行,在程序 运行时才确定将要调用的函数。
30
C++语言程序设计
清华大学 郑莉
虚函数
虚 函 数
虚函数是动态绑定的基础。 是非静态的成员函数。 在类的定义中,在函数原型之前写virtual。 virtual 只用来说明类定义中的原型,不能用在 函数实现时。 具有继承性,基类中声明了虚函数,派生类中 无论是否说明,同原型函数都自动为虚函数。 本质:不是重载声明而是覆盖。 调用方式:通过基类指针或引用,执行时会 根据指针指向的对象的类,决定调用哪个函数。
C++语言程序设计
清华大学 郑莉
7
C++语言程序设计
清华大学 郑莉
两种形式
运 算 符 重 载
重载为类成员函数。 重载为非成员函数(通常为友元函 数)。
8
C++语言程序设计
清华大学 郑莉
运算符函数
运 算 符 重 载
声明形式 函数类型 operator 运算符(形参) { ...... } 重载为类成员函数时 参数个数=原操作数个数-1(后置++、--除外) 重载为友元函数时 参数个数=原操作数个数, 且至少应该有一个自定义类型的形参。
12
complex complex:: operator +(complex c2) //重载函数实现 { complex c; c.real=c2.real+real; c.imag=c2.imag+imag; return complex(c.real,c.imag); }
13
complex complex:: operator -(complex c2) //重载函数实现 { complex c; c.real=real-c2.real; c.imag=imag-c2.imag; return complex(c.real,c.imag); }
21
//后置单目运算符重载 Clock Clock::operator ++(int) { //注意形参表中的整型参数 Clock old=*this; ++(*this); return old; }
22
//其它成员函数的实现略 int main() { Clock myClock(23,59,59); cout<<"First time output:"; myClock.ShowTime(); cout<<"Show myClock++:"; (myClock++).ShowTime(); cout<<"Show ++myClock:"; (++myClock).ShowTime(); }
28
complex operator +(complex c1,complex c2) //运算符重载友元函数实现 { } complex operator -(complex c1,complex c2) //运算符重载友元函数实现 { return complex(c1.real-c2.real, c1.imag-c2.imag); } // 其他函数和主函数同例8-1
29
return complex(c2.real+c1.real, c2.imag+c1.imag);
C++语言程序设计
清华大学 郑莉
静态绑定与动态绑定
绑定
– 程序自身彼此关联的过程,确定程序中的 操作调用与执行该操作的代码间的关系。
静态绑定
– 绑定过程出现在编译阶段,用对象名或者 类名来限定要调用的函数。
23
程序运行结果为:
First time output: 23:59:59 Show myClock++: 23:59:59 Show ++myClock: 0:0:1
24
C++语言程序设计
清华大学 郑莉
运算符非成员函数的设计
运 算 符 重 载
如果需要重载一个运算符,使之能够 用于操作某类对象的私有成员,可以 此将运算符重载为该类的非成员(通 常为友元)函数。 函数的形参代表依自左至右次序排列 的各操作数。 后置单目运算符 ++和--的重载函数, 形参列表中要增加一个int,但不必写 形参名。
– 函数重载 – 运算符重载 – 虚函数
3
C++语言程序设计
清华大学 郑莉
问题举例——复数的运算
运 算 符 重 载
class complex //复数类定义 { public: complex(double r=0.0,double i=0.0) //构造函数 { real=r; imag=i; } void display(); //显示复数的值 private: double real; double imag; };
26
C++语言程序设计
清华大学 郑莉
例8-3
运 算 符 重 载
将+、-(双目)重载为复数类的友元 函数。
两个操作数都是复数类的对象。
27
#include<iostream> using namespace std; class complex //复数类定义 { public: //外部接口 complex(double r=0.0,double i=0.0) { real=r; imag=i; } //构造函数 friend complex operator + (complex c1,complex c2); //运算符+重载为友元函数 friend complex operator - (complex c1,complex c2); //运算符-重载为友元函数 void display(); //显示复数的值 private: //私有数据成员 double real; double imag; };
C++语言程序设计
第八章 多态性
清华大学 郑 莉
1
C++语言程序设计
清华大学 郑莉
本章主要内容
多态性 运算符重载 虚函数 纯虚函数 抽象类
2
C++语言程序设计
清华大学 郑莉
多态性的概念
多态性是面向对象程序设计的重要特 征之一。 多态性是指发出同样的消息被不同类 型的对象接收时有可能导致完全不同 的行为。 多态的实现:
9
C++语言程序设计
清华大学 郑莉
运算符成员函数的设计
运 算 符 重 载
双目运算符 B
– 如果要重载 B 为类成员函数,使之能够实
现表达式 oprd1 B oprd2,其中 oprd1 为A
类对象,则 B 应被重载为 A 类的成员函数, 形参类型应该是 oprd2 所属的类型。 – 经重载后,表达式 oprd1 B oprd2 相当于 oprd1.operator B(oprd2)
20
Clock& Clock::operator ++() //前置单目运算符重载函数 { Second++; if(Second>=60) { Second=Second-60; Minute++; if(Minute>=60) { Minute=Minute-60; Hour++; Hour=Hour%24; } } return *this; }
4
C++语言程序设计
清华大学 郑莉
问题举例——复数的运算
运 算 符 重 载
用“+”、“-”能够实现复数的加减运 算吗?
实现复数加减运算的方法
——重载“+”、“-”运算符
5
C++语言程序设计
清华大学 郑莉
运算符重载的实质
运 算 符 重 载
运算符重载是对已有的运算符赋予多重含义 必要性
– C++中预定义的运算符其运算对象只能是基本数 据类型,而不适用于用户自定义类型(如类)
14
void complex::display() { cout<<"("<<real<<","<<imag<<")"<<endl; }
int main() //主函数 { complex c1(5,4),c2(2,10),c3; //声明复数类的对象 cout<<"c1="; c1.display(); cout<<"c2="; c2.display(); c3=c1-c2; //使用重载运算符完成复数减法 cout<<"c3=c1-c2="; c3.display(); c3=c1+c2; //使用重载运算符完成复数加法 cout<<"c3=c1+c2="; c3.display(); }
25
C++语言程序设计
清华大学 郑莉
运算符友元函数的设计
运 算 符 重 载
双目运算符 B重载后, 表达式oprd1 B oprd2 等同于operator B(oprd1,oprd2 ) 前置单目运算符 B重载后, 表达式 B oprd 等同于operator B(oprd ) 后置单目运算符 ++和--重载后, 表达式 oprd B 等同于operator B(oprd,0 )
动态绑定
– 绑定过程工作在程序运行时执行,在程序 运行时才确定将要调用的函数。
30
C++语言程序设计
清华大学 郑莉
虚函数
虚 函 数
虚函数是动态绑定的基础。 是非静态的成员函数。 在类的定义中,在函数原型之前写virtual。 virtual 只用来说明类定义中的原型,不能用在 函数实现时。 具有继承性,基类中声明了虚函数,派生类中 无论是否说明,同原型函数都自动为虚函数。 本质:不是重载声明而是覆盖。 调用方式:通过基类指针或引用,执行时会 根据指针指向的对象的类,决定调用哪个函数。