C++程序设计课件第11章
合集下载
C语言程序设计第五版谭浩强 ppt课件

Ctrl+KV--------块移动
Ctrl+KY-------块删除 Ctrl+KH--------块隐藏
窗口操作:
F5-----窗口缩放 F6-----窗口切换
程序调试:
<>
F8-----Step over
F7-------Trace into
/* example1.1 calculate the sum of a and b*/
#include <stdio.h>
预处理命令
/* This is the main program */
void main() { int a,b,sum; /*定义变量*/ 函数
注释
的
a=10;
和
b=24;
sum=add(a,b);
空类型void
短整型short 整型int 长整型long 单精度型float
双精度型double
<
定义类型typedef
C语言程序设计
第一章 C语言概述
§1.3 简单的C程序介绍
例1.1 第一个程序This is a c program .
/* example1.1 The first C Program*/
第一章 C语言概述
C语言结构特点
❖函数与主函数
程序由一个或多个函数组成
必须有且只能有一个主函数main(),可以放在程序中任一 位置
程序执行从main开始,在main中结束,其它函数通过嵌 套调用得以执行。
❖程序语句
C程序由语句组成 用“;”作为语句终止符
❖注释
/* */为注释,不能嵌套
C语言运算符丰富(附录C)
C语言程序设计(姜学峰版)PPT课件第十一章

8
5)定义结构体类型仅仅声明了一种数据结构,编译 系统不会为类型分配存储空间的;此时可用已定 义的结构体类型去定义结构体变量或数组,编译 系统将为结构体变量分配存储空间;
9
2. 定义结构体类型的变量 有三种方法: 1)先定义结构体类型,再用类型标识去定义变量 struct student stu1, stu2; struct student是已定义的结构体类型标识符; stu1、stu2是所定义的结构体变量;编译时将为 结构体变量分配各自的存储空间; 2)定义类型的同时定义变量 struct student { …; …; } stu1, stu2;
18
5. 结构体变量的指针、结构体成员的指针 注:&优先级为2级,低于.和[ ]; stu1 变量stu1的指针:&stu1 图示: num
num成员指针:&stu1. num
4
20 1
name第i个元素指针:&stu1. name[i]
name sex m
┇
birthday d 最低级成员y的指针:&stu1.birthday.y y score
5
例:定义可表示学生基本情况的结构体类型。
项目: 学号 姓名 性别 出生日期 成绩 电话号码 数据: 010510 Li Feng M 1981.5.4 680 029-8482500
类型: 长整/字串 字串
字符
字串
整型
字串
struct student /*结构体类型标识*/ { long num; char name[20]; char sex; char birthday[12]; float score; char tel[15]; };
计算机导论教学第11章算法与程序设计课件

根据问题的输入方式,将算法分为在 线和离线两种类型。
近似算法
用于解决NP难问题,能够在多项式时 间内得到一个近似最优解。
2024/1/28
7
算法的评价指标
可读性
好的算法应该具有较好的可读性 ,以便于人们理解和交流。
空间复杂度
评估执行程序所需的存储空间。 可以估算出程序对内存资源的占 用情况。
05
04
算法的分类
根据问题的性质和求解方法的不 同,算法可分为数值算法和非数 值算法、确定性算法和随机性算 法等。
算法的评价
评价算法的好坏通常从时间复杂 度和空间复杂度两个方面进行衡 量,优秀的算法应具有较低的时 间复杂度和空间复杂度。
2024/1/28
26
计算机导论中的程序设计方法
2024/1/28
结构化程序设计方法
简洁明了
程序应简洁明了,易于理解,避免不必要的复 杂性和冗余。
一致性
程序中的命名、格式和风格应保持一致性,提 高程序的可读性和可维护性。
注释规范
程序中应包含必要的注释,说明程序的功能、 算法和实现细节。
12
03
数据结构与算法
2024/1/28
13
线性数据结构
2024/1/28
数组(Array)
连续的内存空间,通过下标访问元素,插入和删除操作可能涉及大量 元素的移动。
图(Graph)
由节点和边组成的数据结构,可以表 示任意两个节点之间的关系,常用于 表示网络、地图等复杂结构。
2024/1/28
15
排序与查找算法
2024/1/28
排序算法
将一组数据按照某种规则进行排序的算法,如冒泡排序、选择排序 、插入排序、归并排序、快速排序等。
近似算法
用于解决NP难问题,能够在多项式时 间内得到一个近似最优解。
2024/1/28
7
算法的评价指标
可读性
好的算法应该具有较好的可读性 ,以便于人们理解和交流。
空间复杂度
评估执行程序所需的存储空间。 可以估算出程序对内存资源的占 用情况。
05
04
算法的分类
根据问题的性质和求解方法的不 同,算法可分为数值算法和非数 值算法、确定性算法和随机性算 法等。
算法的评价
评价算法的好坏通常从时间复杂 度和空间复杂度两个方面进行衡 量,优秀的算法应具有较低的时 间复杂度和空间复杂度。
2024/1/28
26
计算机导论中的程序设计方法
2024/1/28
结构化程序设计方法
简洁明了
程序应简洁明了,易于理解,避免不必要的复 杂性和冗余。
一致性
程序中的命名、格式和风格应保持一致性,提 高程序的可读性和可维护性。
注释规范
程序中应包含必要的注释,说明程序的功能、 算法和实现细节。
12
03
数据结构与算法
2024/1/28
13
线性数据结构
2024/1/28
数组(Array)
连续的内存空间,通过下标访问元素,插入和删除操作可能涉及大量 元素的移动。
图(Graph)
由节点和边组成的数据结构,可以表 示任意两个节点之间的关系,常用于 表示网络、地图等复杂结构。
2024/1/28
15
排序与查找算法
2024/1/28
排序算法
将一组数据按照某种规则进行排序的算法,如冒泡排序、选择排序 、插入排序、归并排序、快速排序等。
C语言程序设计项目式教程完整版课件全书电子教案教材课件完整

例如,有一函数
,编写程序,其功能是对已知 x 求 y
程序说明 ① if 和 else 后面的语句可以是复合语句。 ②注意 if 与 else 的配对原则,else 总是与前面离它最近的没成对的 if 成对。
简单的C语言程序结构
说明4——语句
C语言中以“;”作为语句结束的标志。函数体就是由若干语句组成的,同时语句也出现在 函数之间,示例代码如下所示:
简单的C语言程序结构
学习一种编程语言,最佳途径就是多阅读代码段,多编写程序代码,接下来通过最基本的 C语言程序的基本构成学习基本格式和书写规范,代码示例如下所示:
单一if结构
选择结构中最基本的分支结构是 if 语句,按形式分 if 语句可以分为单分支、双分支和多 分支等,单一 if 语句定义形式如下所示
当上述中“表达式”值为“逻辑真”时,执行“语句”中内容。例如计算整型变量 x 的 绝对值,示例代码如下所示:
If-else结构
if 语句的第二种形式为 if-else 结构的双分支。其定义形式如下所示 : 当“表达式”值为“逻辑真”时,执行“语句 1”;当“表达式”值为“逻辑假”时,执 行“语句 2”。例如,判断整型变量 x 是 5,则输出“right”,否则输出“error”,示例代码如 下所示:
简单的C语言程序结构
说明2——预处理
include称为文件包含命令,其意义是把双引号""或尖括号<>内指定的文件包含到本程序来, 成为本程序的一部分。被包含的文件通常是由系统提供的,其扩展名为.h的头文件。C语言的 头文件中包括了各个标准库函数的函数原型。因此,凡是在程序中调用一个库函数时,都必 须包含该函数原型所在的头文,示例代码如下所示:
原型在头文件 “stdio.h”中。具体格式如下:
C语言完整 ppt课件

1.4.1 宏定义
用一个标识符来表示一个字符串,称为“宏”,标识符称为“宏名”。在 程序中 用宏名替代字符串称为“宏调用”。在编译预处理时,将对程序中所有出现的 “宏 名”,都用宏定义中的字符串代换,这个过程称为“宏展开”。
1.4.1.1 不带参数的宏定义
格式为:#define 标识符 字符串
1.4.1.2 带参数的宏定义
1-4
1.3 C程序上机步骤
C源程序编好后,要经过编辑、编译、连接, 生成可执行文件后,才可运行。
运行集成开发软件
编辑源程序
编译
有 有错? 无 连接
不正确
运行
结果正确? 正确
结束
1-5
1.4 编译预处理
编译预处理是指,在C编译程序对C源程序进行编译之前,由编译预处理程 序对源程序中的预处理命令进行处理的过程。
1.2.1 C语言程序举例
1.2.2 C语言程序的结构
1.2.2.1 函数是C语言程序的基本单位。
1.2.2.2 函数的一般结构
任何函数(包括main()函数)都是由函数首部和函数体两部分组成。
1. 函数首部: 函数首部即函数第一行,由函数类型、函数名和函数参数表三部分组成。
2. 函数体: 函数体为函数首部下面的花括号{……}内的部分。 函数体一般由声明部分和执行部分构成:声明部分定义所用到的变量,声明所调用的函数等; 执行部分有若干语句组成。
2.6.1 运算符及表达式简介 2.6.1.1 运算符
C语言中的运算符具有2个特点: ⑴ 运算符的优先级 C语言中,运算符的优先级共分为15级,1级最高,15级最低。 ⑵ 运算符的结合性 C语言中各运算符的结合性分为左结合性(从左到右)和右结合性(从右到左)。 2.6.1.2 表达式 表达式是由常量、变量、函数和运算符组成的式子。 表达式求值是按运算符的优先级和结合性规定的顺序进行的。
用一个标识符来表示一个字符串,称为“宏”,标识符称为“宏名”。在 程序中 用宏名替代字符串称为“宏调用”。在编译预处理时,将对程序中所有出现的 “宏 名”,都用宏定义中的字符串代换,这个过程称为“宏展开”。
1.4.1.1 不带参数的宏定义
格式为:#define 标识符 字符串
1.4.1.2 带参数的宏定义
1-4
1.3 C程序上机步骤
C源程序编好后,要经过编辑、编译、连接, 生成可执行文件后,才可运行。
运行集成开发软件
编辑源程序
编译
有 有错? 无 连接
不正确
运行
结果正确? 正确
结束
1-5
1.4 编译预处理
编译预处理是指,在C编译程序对C源程序进行编译之前,由编译预处理程 序对源程序中的预处理命令进行处理的过程。
1.2.1 C语言程序举例
1.2.2 C语言程序的结构
1.2.2.1 函数是C语言程序的基本单位。
1.2.2.2 函数的一般结构
任何函数(包括main()函数)都是由函数首部和函数体两部分组成。
1. 函数首部: 函数首部即函数第一行,由函数类型、函数名和函数参数表三部分组成。
2. 函数体: 函数体为函数首部下面的花括号{……}内的部分。 函数体一般由声明部分和执行部分构成:声明部分定义所用到的变量,声明所调用的函数等; 执行部分有若干语句组成。
2.6.1 运算符及表达式简介 2.6.1.1 运算符
C语言中的运算符具有2个特点: ⑴ 运算符的优先级 C语言中,运算符的优先级共分为15级,1级最高,15级最低。 ⑵ 运算符的结合性 C语言中各运算符的结合性分为左结合性(从左到右)和右结合性(从右到左)。 2.6.1.2 表达式 表达式是由常量、变量、函数和运算符组成的式子。 表达式求值是按运算符的优先级和结合性规定的顺序进行的。
c语言程序设计ppt课件

使用更高效的算法和数据结构,提高程序的性能。
对代码进行重新组织和优化,提高可读性和可维护性。
C语言发展趋势和展望
C语言在计算机科学领域的重要地位
C语言作为计算机科学领域的基础语言,具有广泛的应用和深远的影响。
C语言在操作系统、嵌入式系统等领域的应用
C语言在操作系统、嵌入式系统等领域具有不可替代的作用,其高效、可靠的性能深受开发者的青睐。
循环结构
函数定义
函数调用
函数参数传递
函数返回值
01
02
03
04
指定函数名、返回值类型和参数列表。
通过函数名和参数列表来调用函数。
按值传递和按指针传递。
函数执行完毕后返回一个值。
C语言进阶特性
指针是一种变量,它存储了另一个变量的内存地址。通过指针可以间接访问和修改变量的值。
指针
使用指针可以进行地址操作,如取地址、解引用等。指针在C语言中广泛应用于动态内存分配、函数参数传递和数组操作等场景。
C语言程序设计 PPT 课件
Contents
目录
C语言概述C语言基础语法C语言进阶特性C语言编程实践C语言常见错误和调试C语言发展趋势和展望
C语言概述
C语言起源于20世纪70年代,由美国贝尔实验室的Dennis Ritchie设计开发。
C语言最初是为了开发UNIX操作系统而创建的,后来逐渐发展成为一种通用的编程语言。
C语言提供了多种文件读写函数,如fread()和fwrite()用于二进制文件的读写,fscanf()和fprintf()用于文本文件的读写。通过文件读写函数可以对文件内容进行读取和写入操作。
文件读写
C语言编程实践
冒泡排序:通过重复地遍历待排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来,遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
对代码进行重新组织和优化,提高可读性和可维护性。
C语言发展趋势和展望
C语言在计算机科学领域的重要地位
C语言作为计算机科学领域的基础语言,具有广泛的应用和深远的影响。
C语言在操作系统、嵌入式系统等领域的应用
C语言在操作系统、嵌入式系统等领域具有不可替代的作用,其高效、可靠的性能深受开发者的青睐。
循环结构
函数定义
函数调用
函数参数传递
函数返回值
01
02
03
04
指定函数名、返回值类型和参数列表。
通过函数名和参数列表来调用函数。
按值传递和按指针传递。
函数执行完毕后返回一个值。
C语言进阶特性
指针是一种变量,它存储了另一个变量的内存地址。通过指针可以间接访问和修改变量的值。
指针
使用指针可以进行地址操作,如取地址、解引用等。指针在C语言中广泛应用于动态内存分配、函数参数传递和数组操作等场景。
C语言程序设计 PPT 课件
Contents
目录
C语言概述C语言基础语法C语言进阶特性C语言编程实践C语言常见错误和调试C语言发展趋势和展望
C语言概述
C语言起源于20世纪70年代,由美国贝尔实验室的Dennis Ritchie设计开发。
C语言最初是为了开发UNIX操作系统而创建的,后来逐渐发展成为一种通用的编程语言。
C语言提供了多种文件读写函数,如fread()和fwrite()用于二进制文件的读写,fscanf()和fprintf()用于文本文件的读写。通过文件读写函数可以对文件内容进行读取和写入操作。
文件读写
C语言编程实践
冒泡排序:通过重复地遍历待排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来,遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
C语言程序设计-杨路明第11章课件

C 语言
程 序 设 计 教 程 第4版
第11章 C语言综合应用程序示例
目录
1 多模块编程 2 绘图和图像处理应用
11.1 多模块编程
返回
11.1.1 程序模块组织
使用多模块编程技术的处理过程大致如下: 首先
将一个大的源程序根据其功能合理地划分成若干个小的源程序,每个小源程 序均以程序文件(.C)的形式保存在磁盘上。并建立一个包括各个源程序模块的文件 名的工程文件(.prj)。
students = 50 ; … } fun2() { students += 18 ; … }
11.1.2 模块之间的通信
例题 利用外部变量实现程序模块f1.c与程序模块f2.c之间的通信。
设程序模块文件f1.c的内容如下:
# include < stdio.h >
# include "f2.cpp"
cvPoint( 0, 7*w/8.0 ), cvPoint( w, w),
CV_RGB( 0, 255, 255 ), -1, 8, 0);
11.2.1 基本图形处理函数
2. 在图像里插入文字
例题 在图像中插入一串字符。
#include <cv.h>
#include <highgui.h>
#include <windows.h>
center, w/32.0, CV_RGB(0,0,255), thickness, lineType ); }
/*设w为480*/
11.2.1 基本图形处理函数
(4) 创建椭圆的定义如下: MyEllipse( atom_image, 90 ); MyEllipse( atom_image, 0 ); MyEllipse( atom_image, 45 ); MyEllipse( atom_image, -45 ); void MyEllipse(IplImage *img, double angle ) {
程 序 设 计 教 程 第4版
第11章 C语言综合应用程序示例
目录
1 多模块编程 2 绘图和图像处理应用
11.1 多模块编程
返回
11.1.1 程序模块组织
使用多模块编程技术的处理过程大致如下: 首先
将一个大的源程序根据其功能合理地划分成若干个小的源程序,每个小源程 序均以程序文件(.C)的形式保存在磁盘上。并建立一个包括各个源程序模块的文件 名的工程文件(.prj)。
students = 50 ; … } fun2() { students += 18 ; … }
11.1.2 模块之间的通信
例题 利用外部变量实现程序模块f1.c与程序模块f2.c之间的通信。
设程序模块文件f1.c的内容如下:
# include < stdio.h >
# include "f2.cpp"
cvPoint( 0, 7*w/8.0 ), cvPoint( w, w),
CV_RGB( 0, 255, 255 ), -1, 8, 0);
11.2.1 基本图形处理函数
2. 在图像里插入文字
例题 在图像中插入一串字符。
#include <cv.h>
#include <highgui.h>
#include <windows.h>
center, w/32.0, CV_RGB(0,0,255), thickness, lineType ); }
/*设w为480*/
11.2.1 基本图形处理函数
(4) 创建椭圆的定义如下: MyEllipse( atom_image, 90 ); MyEllipse( atom_image, 0 ); MyEllipse( atom_image, 45 ); MyEllipse( atom_image, -45 ); void MyEllipse(IplImage *img, double angle ) {
C语言程序设计教程ppt课件完整版pptx

C语言的应用领域
计算机系统基本概念
计算机系统的组成 操作系统的基本概念 计算机中的数与编码
编程环境与工具安装配置
01
常见的C语言编程环境
02
安装与配置C语言编译器
使用集成开发环境(IDE)进行C语言编程
03
第一个C程序:Hello, World!
01
C程序的基本结 构
02
编写Hello, World!程序
应用场景
适用于需要根据特定条件提前终 止循环或跳过某些循环操作的情 况。
04 函数与模块化设计
函数定义和调用
01
函数定义
包括函数名、参数列表、返回值 类型和函数体等部分,用于描述 函数的功能和实现细节。
函数调用
02
03
函数声明
通过函数名和参数列表来调用函 数,实现相应功能并获取返回值 。
在使用函数之前,需要对函数进 行声明,以便编译器识别函数的 存在和调用方式。
THANKS FOR WATCHING
感谢您的观看
指针运算符
包括取地址运算符&和取值运算符*,分别 用于获取变量的内存地址和通过指针访问内 存中的数据。
动态内存分配函数(malloc, free)使用方法
malloc函数
用于在堆区动态分配指定大小的内存空间,并返回 分配内存的起始地址。
free函数
用于释放之前通过malloc函数分配的内存空间,防 止内存泄漏。
动态规划思想
动态规划是一种在数学、计算机科学和经济学中 使用的,通过把原问题分解为相对简单的子问题 的方式来求解复杂问题的方法。动态规划常用于 优化重叠子问题的计算。
回溯与分支限界法
回溯法是一种通过探索所有可能的候选解来找出 所有解的算法,而分支限界法是一种通过剪枝来 减少搜索空间的优化算法。回溯与分支限界法常 用于解决组合优化问题。
计算机系统基本概念
计算机系统的组成 操作系统的基本概念 计算机中的数与编码
编程环境与工具安装配置
01
常见的C语言编程环境
02
安装与配置C语言编译器
使用集成开发环境(IDE)进行C语言编程
03
第一个C程序:Hello, World!
01
C程序的基本结 构
02
编写Hello, World!程序
应用场景
适用于需要根据特定条件提前终 止循环或跳过某些循环操作的情 况。
04 函数与模块化设计
函数定义和调用
01
函数定义
包括函数名、参数列表、返回值 类型和函数体等部分,用于描述 函数的功能和实现细节。
函数调用
02
03
函数声明
通过函数名和参数列表来调用函 数,实现相应功能并获取返回值 。
在使用函数之前,需要对函数进 行声明,以便编译器识别函数的 存在和调用方式。
THANKS FOR WATCHING
感谢您的观看
指针运算符
包括取地址运算符&和取值运算符*,分别 用于获取变量的内存地址和通过指针访问内 存中的数据。
动态内存分配函数(malloc, free)使用方法
malloc函数
用于在堆区动态分配指定大小的内存空间,并返回 分配内存的起始地址。
free函数
用于释放之前通过malloc函数分配的内存空间,防 止内存泄漏。
动态规划思想
动态规划是一种在数学、计算机科学和经济学中 使用的,通过把原问题分解为相对简单的子问题 的方式来求解复杂问题的方法。动态规划常用于 优化重叠子问题的计算。
回溯与分支限界法
回溯法是一种通过探索所有可能的候选解来找出 所有解的算法,而分支限界法是一种通过剪枝来 减少搜索空间的优化算法。回溯与分支限界法常 用于解决组合优化问题。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
public-->public
+
+
访问控制 用于规定从基类 继承的成员在派 生类中的访问限 制。
public
protected -->protected # # private-->inaccessible X
public-->private
+ # - X
private
protected -->private private-->inaccessible
1 单一继承
从现存的类派生出新类时,可作如下变化: 从现存的类派生出新类时,可作如下变化: 1 增加新的数据成员 2 增加新的成员函数 3 改变继承的成员在派生类中的访问限制
using 声明 访问控制
4 添加的成员与继承的成员同名
名字隐藏
1 单一继承
class Pen{ public: enum ink{off,on}; void set_status(ink); void set_location(int,int); private: int x; int y; ink status; }; class Cpen: pulic Pen{ public: void set_color(int); private: int color; };
派生类中继承的基类成员的初始化需由派生类的 构造函数调用基类的构造函数来完成。 构造函数调用基类的构造函数来完成。 从类X1,X2 Xn派生 X1,X2…Xn派生, 设Y从类X1,X2 Xn派生,则定义派生类的 构造函数的一般形式: 构造函数的一般形式: Y::Y(参数表 ):X1(参数表1), 参数表0 X1(参数表 Y::Y(参数表0 ):X1(参数表1), X2(参数表 参数表2), X2(参数表2), 初始化列表 … Xn(参数表 参数表n) Xn(参数表n) { };
ink get_status(){return status;} int color; void set_location(int,int); private: int x; int y; ink status; }; }; 例 4.2_142_1 void display(){cout<<get_status( ) <<color<<endl;}
2 保护成员
解决方案: 1 增加一个用于访问x的公共接口 2 在基类中将x的访问权限改为保护的
方案1 class Pen{ public: enum ink{off,on}; void set_status(ink); class Cpen: pulic Pen{ public: void set_color(int); private:
11.1.1 类的继承与派生 11.1.2 赋值兼容规则 11.1.3 两义性与作用域分辨
至 第11章 章
引入继承的最大的优点:代码重用,提高编程效率。 引入继承的最大的优点:代码重用,提高编程效率。 类的派生。 派生:通过特殊化已有的类来建立新类的过程,叫做类的派生 派生:通过特殊化已有的类来建立新类的过程,叫做类的派生。 继承性:是子类自动地共享基类中所定义的方法和数据的机制。 继承性:是子类自动地共享基类中所定义的方法和数据的机制。 人 基类或超类
class BC{ public: BC(int a){cout<<"BC::(int) executes...\n"; x=a; } ~BC(){cout<<"~BC::() executes...\n";} private: int x; }; class DC:public BC{ public: DC() {cout<<"DC::() executes...\n";} × ~DC(){cout<<"~DC::() executes...\n";}
至 第12章 章
11.1 一般—特殊关系的实现
C++提供了描述一般—特殊关系的语法,在C++中称为类的 C++提供了描述一般—特殊关系的语法, C++中称为类的 提供了描述一般 派生或继承,通常分为单一继承和多重继承。 派生或继承,通常分为单一继承和多重继承。在C++ 中常 把一般—特殊关系中的一般类称为父类, 把一般—特殊关系中的一般类称为父类,而把特殊类称为 子类。 子类。
class Pen{ public: enum ink{off,on}; void set_status(ink); void set_location(int,int); private: int x; int y; ink status; }; }; class Cpen: pulic Pen{ public: void set_color(int); private: int color; void display(){cout<<status × <<color<<endl;}
第11章 类间关系的实现
学习目的: 学习目的:
① 掌握类间关系的C++实现; 掌握类间关系的C++实现; C++实现 ② 了解多态性与虚函数的概念。 了解多态性与虚函数的概念。
11.1 11.2 11.3 11.4 11.5
一般—特殊关系的实现 一般 特殊关系的实现 多态性与虚函数 整体—部分关系的实现 整体 部分关系的实现 关联关系的实现 关于类层次的总结
BC(){cout<<"BC::( ) executes...\n";} BC(int a){cout<<"BC::(int) executes...\n"; x=a; } ~BC(){cout<<"~BC::() executes...\n";} private: int x; }; class DC:public BC{ public: DC() {cout<<"DC::() executes...\n";} ~DC(){cout<<"~DC::() executes...\n";}
方案2 class Pen{ public: enum ink{off,on}; void set_status(ink); void set_location(int,int); private: int x; int y; protected: ink status; }; }; 例 4.2_142_2 class Cpen: pulic Pen{ public: void set_color(int); private: int color; void display(){cout<<status <<color<<endl;}
3 多继承
多重继承:一个类有一个以上的基类。 多重继承:一个类有一个以上的基类。 定义派生类的一般格式: 定义派生类的一般格式: 派生类名: 基类名1 class 派生类名:访问控制 基类名1, 基类名2 访问控制 基类名2, … 基类名n 访问控制 基类名n { };
3 多继承
多继承中派生类是其所有基类的组合体。 多继承中派生类是其所有基类的组合体。 派生类的数据成员和成员函数的访问规则同单继承。 派生类的数据成员和成员函数的访问规则同单继承。
1 单一继承
Pen - x,y,status +void set_status(ink); +void set_location(int,int) CPen 继 承 的
X x,y,status
CPen p; p.x=5; //x是不可访问成员 p.set_status(Pen::on); √ p.color=1; //color是私有成员 p.set_color(1);
×
+void set_status(ink); +void set_location(int,int) -color +void set_color(int)
×
√
例 4.1_133
2 保护成员
保护成员:在类外不可见(同私有成员),在派生类中 保护成员:在类外不可见(同私有成员),在派生类中 ), 可见(同公有成员) 可见(同公有成员)
private: int y; }; int main() { DC d; }
BC::() executes DC::() executes ~DC::() executes ~BC::() executes
例 4.3_147
4 继承机制下的构造与析构函数
注: 如果如果基类中只定义了有参的构造函数, 如果如果基类中只定义了有参的构造函数,而 没有无参或全部参数都缺省的构造函数, 没有无参或全部参数都缺省的构造函数,则派 生类必须定义构造函数并显示地调用基类的某 生类必须定义构造函数并显示地调用基类的某 个构造函数。( 。(即使本身无需完成任何工作 个构造函数。(即使本身无需完成任何工作 函数体为空)) (函数体为空))
学生
教师
PopupMenu
ScrollWin
在职研究生
ScrollPopupMenu
class BC1{ private: int x; public: void set_x(int a){x=a;} }; class BC2{ private: int x; public: void set_x(int a){x=a;} };
class DC:public BC1,public BC2 {private: int x; public: void set_x(int a){x=a;} }; int main() {DC d1; d1.set_x(999); d1.BC1::set_x(111); d1.BC2::set_x(222); } 例4.4_163