C++程序设计-北京邮电大学课件 (9)
C语言程序设计教程第3章 北京邮电大学出版社.ppt
为止。
特点:(1)先执行A再判条
件,若条件满足再执行A。
2/6
C语言程序设计教程
6
选择结构可以派生出“多分支选择结构”:根据k的值(k1、 k2、...、kn)不同而执行A1、A2、...、An之一。
三种基本结构可以处理任何复杂的问题。
2019/12/6
C语言程序设计教程
2019/12/6
C语言程序设计教程
10
(3)用一对花括号{}将多条语句组合在一起,在语法上相当 于一条语句。 例 main( ) { int x=1;
{int x=2; {int x=3; printf(“x=%d”, x); } printf(“x=%d”, x); } printf(“x=%d”, x); }
5
3、循环结构:两种。
(1)当型循环结构。当条件p成立(“真”)时,反复执行 A操作,直到p为“假”时才停止循环。
特点:(1)先判条件,若条件满足, 则执行A。 (2)在第一次判别条件时,若条件 不满足,则A一次也不执行。
(2)直到型循环结构。先执行A操作,再判别条件p是否为
“假”,若为“假”,再执行A,如此反复,直到p为“真”
(2)作用:完成特定任务
(3)C 的标准函数库, 可提供各类函数供用户调用,调
用标准库函数可完成预先设定好的操作.
2019/12/6
C语言程序设计教程
8
例如调用标准库函数求数学函数值: sin(x) 、cos(x) 、 exp(x) (求ex ) 、fabs(x) (求x的绝对值).
调用标准库函数要注意以下几点
两个输出项都是变量i , 但 以不同的格式输出,一个是输 出的整型数,一个输出的是字 符a. 其格式是由,%d与%c控 制的.
北京邮电大学计导课件大一1
科学: 是什么” 科学:“是什么”,“为什么”; 为什么” 技术: 做什么” 技术:“做什么”,“怎么做”; 怎么做”
18
19
三.关于计算机科学与技术 关于计算机科学与技术
• 计算机科学与技术是研究计算机的设计、制造以 计算机科学与技术是研究计算机的设计、制造以 设计 利用计算机进行信息获取 表示、存储、处理、 进行信息获取、 及利用计算机进行信息获取、表示、存储、处理、 控制和传输等的理论 原则、方法和技术的学科。 理论、 控制和传输等的理论、原则、方法和技术的学科。 • 它包括科学与技术两方面。科学侧重于描述构成 它包括科学与技术两方面。科学侧重于描述构成 计算基础的一些基本概念和模型 基本概念和模型; 计算基础的一些基本概念和模型;如:可计算性 理论、自动机论、形式语言理论、程序设计理论、 理论、自动机论、形式语言理论、程序设计理论、 算法设计与分析和计算复杂性理论等等。 算法设计与分析和计算复杂性理论等等。 • 技术则侧重于研制计算机和研究使用计算机进行 技术则侧重于研制 研制计算机和研究使用计算机进行 信息处理的方法与技术手段。 信息处理的方法与技术手段。如:设计 各类计算 机器件的制造技术;计算机通信技术; 机器件的制造技术;计算机通信技术;程序设计 技术;编译技术;并行计算机技术等。 技术;编译技术;并行计算机技术等。
8
一.大学培养目标 知识、能力、素质 大学培养目标: 知识、能力、 大学培养目标 • 能力: 能力:
– 获取知识的能力:自学能力、信息获取和表 获取知识的能力:自学能力、 达能力等(读大学最重要的是学习“ 达能力等(读大学最重要的是学习“如何学 习”,这才是你终身受用不尽的知识 ); ; – 应用知识能力:系统级的认知能力,理论联 应用知识能力:系统级的认知能力, 系实际的能力(防止读死书、死读书) 系实际的能力(防止读死书、死读书); – 创新能力:创造性思维能力、创新实验能力、 创新能力:创造性思维能力、创新实验能力、 科技开发能力、科学研究能力以及对新知识、 科技开发能力、科学研究能力以及对新知识、 新技术的敏感性; 新技术的敏感性;
北京邮电大学C语言课件第3章
上一页
下一页
C语言程序设计教程 第七页,编辑于星期日:五点 八分。
如:数学表达式 y=|3sinx+4cosx|+ex ,可以用C 语言表达式表示为:
y=fabs(3*sin(x)+4*cos(x))+exp(x);
其中,fabs,sin,cos,exp都属于头文件 math.h,用到这些函数,必须在程序的预处 理语句中用#include<math.h>把数学函数库包
2. 空语句:
3.
由一个分号表示,一般形式为:
4.
;
5.
空语句在语法上是一条语句,但执行时不
做任何操作。
上一页
下一页
C语言程序设计教程 第五页,编辑于星期日:五点 八分。
3. 函数调用语句: 由函数调用表达式加分号构成.
如:printf(“%d”,a); scanf(“%f”,&b);
C 语言有丰富的标准函数库, 可提供各类函数供用
输入值。 ✓ 如果输入时类型不匹配则停止处理,返回0。
含进来。
上一页
下一页
C语言程序设计教程 第八页,编辑于星期日:五点 八分。
3.1.2 复合语句
用一对花括号,把若干条语句括起来, 就形成了一条复合语句。形式如下:
{
语句1;
……
语句n; }
花括号中的语句,可以是简单语句、空语句、复合语句、 流程控制语句,所有这些语句括在一起,在语法上看成是一 条语句,执行时顺序执行花括号中的每条语句。复合语句多 用于流程控制语句中。
下一页
C语言程序设计教程 第二页,编辑于星期日:五点 八分。
程序设计语言有顺序、选择、循环三种基本的控
C语言程序设计(北京邮电大学出版社第二版)主编占跃华算
整型 100,125,-100,0 实型 3.14 , 0.125,-3.789 字符型 ‘a’, ‘b’,‘2’ 字符串 ‘a’, ‘ab’,‘1232’
例3.1 符号常量的使用 #define PRICE 30 #include <stdio.h> 说明:如再用赋值语句给PRICE赋值是错的 void main ( ) PRICE=40; /* 错误,不能给符号常量赋值 { int num, total; num=10; total=num * PRICE; printf(″total=%d\n″,total); } 说明: 程序中用#define命令行定义PRICE 符号常量: 用一个标识符代表一个常量。 代表常量 30,此后凡在本文件中出现的 符号常量的值在其作用域内不能改变 , PRICE 都代表30,可以和常量一样进行运算 也不能再被赋值。
整型数据
3.3
整型数据
(3)十六进制整数。以0x开头的数是16进制数。 如:0x123,代表16进制数123,等于十进制数 291。 -0x12等于十进制数-10。
3.3.2 整型变量 (1)整型数据在内存中的存放形式
数据在内存中是以二进制形式存放的。
如: int i;
i=10;
/* 定义为整型变量 */ /* 给i赋以整数10 */
3.2 常量与变量
变量命名的规定:C语言规定标识符只能由 字母、数字和下划线三种字符组成,且第一 个字符必须为字母或下划线。 例:sum,_total, month, Student_name,
lotus_1_2_3,BASIC, li_ling M.D.John, ¥123,3D64,a>b
北邮c++面向对象程序设计与实践课件02-C++ Foundations
enum weekday {sun=7, mon=1, tue, wed, thu, fri, sat}; //声明sun为7,mon为1,以后顺序加1,sat为6
18 18
9
枚举类型—enum
枚举类型应用说明:
对; 整数值不能直接赋给枚举变量,如需要将整数赋值给枚举 变量,应进行强制类型转换。 枚举值可以进行运算
44c与c的关系?c语言是在c语言的基础上进行了扩充和改进而得到的?它继承了c语言的全部内容?并在c语言的基础之上增加了面向对象编程的内容?c既支持面向过程的程序设计又支持新型的面向对象程序设计?c保持了与c语言的兼容?大部分的c代码的程序不经修改或很少修改就可被c使用?用c语言编写的许多库函数和应用软件也都可以用于c?c不是一个纯粹的面向对象程序设计语言?c语言是面向过程的语言c与c兼容支持面向过程的程序设计?由于面向过程程序设计和面向对象程序设计是两种不同风格的程序设计技术对于习惯于面向过程程序设计的程序员在学习使用c时可能存在一定的障碍355c对c的扩展?增加了一些在新的运算符使得c应用起来更加方便?newdelete用于内存管理用户不需直接使用库函数?增加了引用amp
空白符
空格、换行、制表符 注释
是用来帮助阅读、理解及维护程序 注释部分被忽略,不产生目标代码 C++语言提供两种注释方式: 一种是与C兼容的多行注释,用 /* 和 */ 分界 另一种是单行注释,以“//”开头,表明本行中“//”符号后的内容 是注释
14 14
7
C++ 简单实例
15 15
C++ 简单实例
#include <iostream> using namespace std; int main(void) { const int PRICE = 30; int num, total; num = 10; total = num * PRICE; cout << “Total:” << total <<endl; float v,r,h; r = 2.5; h = 3.2; v = 3.14159 * r * r * h; cout << v << endl; }
c语言课程设计北京邮电
c语言课程设计北京邮电一、教学目标本课程的教学目标是使学生掌握C语言的基本语法、数据类型、运算符、控制结构、函数等基本知识,培养学生运用C语言进行程序设计的能力,提高学生的逻辑思维和问题解决能力。
具体来说,知识目标包括:1.理解C语言的基本语法和规则;2.掌握C语言的数据类型、运算符和控制结构;3.了解函数的定义和调用方式;4.熟悉常用的标准库函数。
技能目标包括:1.能够使用C语言编写简单的程序;2.能够阅读和理解C语言的程序代码;3.能够运用C语言进行问题分析和解决方案的设计;4.能够进行程序的调试和优化。
情感态度价值观目标包括:1.培养学生对计算机编程的兴趣和热情;2.培养学生良好的编程习惯和团队协作精神;3.培养学生的创新思维和问题解决能力;4.培养学生的自我学习和持续进步的意识。
二、教学内容本课程的教学内容主要包括C语言的基本语法、数据类型、运算符、控制结构、函数等基本知识。
具体安排如下:1.第一章:C语言概述介绍C语言的历史、特点和应用领域,熟悉C语言的编译环境和基本语法。
2.第二章:数据类型和运算符学习C语言的数据类型、常量和变量的定义,掌握各种运算符的使用方法和规则。
3.第三章:控制结构学习条件语句、循环语句和跳转语句的语法和用法,掌握程序的控制流程。
4.第四章:函数学习函数的定义、声明和调用方式,掌握函数的参数传递和返回值处理。
5.第五章:数组和字符串学习数组的基本概念和操作,掌握字符串的存储和处理方法。
6.第六章:指针学习指针的概念、运算和应用,掌握指针与数组、函数的关系。
7.第七章:结构体和联合体学习结构体和联合体的定义和使用,掌握动态内存分配和指针操作。
8.第八章:文件操作学习文件的概念和文件操作的API,掌握文件的打开、读写和关闭。
三、教学方法本课程采用多种教学方法,包括讲授法、案例分析法、实验法等,以激发学生的学习兴趣和主动性。
1.讲授法:通过教师的讲解和演示,向学生传授C语言的基本知识和编程技巧。
北京邮电大学C++语言程序设计-----阶段作业2
北京邮电⼤学C++语⾔程序设计-----阶段作业2 C++语⾔程序设计-----阶段作业2⼀、单项选择题(共20道⼩题,共100.0分)1. 多继承是指()。
A. ⼀个派⽣类同时继承多个基类B. 多个派⽣类同时继承⼀个基类C. 基类本⾝⼜是⼀个更⾼⼀级基类的派⽣类D. 派⽣类本⾝⼜是更低⼀级派⽣类的基类2.3. 有如下的类声明:class MyBASE{int k;public:void set(int n){ k=n;}int get()const{ return k; }};class MyDERIVED: protected MyBASE{protected:int j;public:void set(int m, int n){ MyBASE::set(m); j=m;}int get()const{ return MyBASE::get()+j; }};则类MyDERIVED中保护成员的个数是()。
A. 1B. 2C. 3D. 44. 有如下程序:#includeusing namespace std;class Base {public:void fun() { cout<<"Base::fun"<};class Derived : public Base {public:void fun(){ _____________ // 显式调⽤基类的成员函数fun()cout<<"Derived::fun"<}};程序中画线处正确的语句是()。
A. fun();B. Base.fun();C. Base::fun();D. Base->fun();5. 在任何继承⽅式下,派⽣类的⾃有成员函数都不能访问原基类的某些成员,这些成员的原访问属性必然是()。
A. 公有或保护B. 保护或私有C. 私有或继承的私有D. 继承的私有或公有6.7. 有如下程序:#includeusing namespace std;inti=1;class Fun{public:static inti;int value() { return i-1; }int value() const { return i+1;}};int Fun::i = 2;int main(){inti=3;Fun fun1;const Fun fun2;_______________return 0;}若程序的输出结果是:123则程序中下画线处遗漏的语句是()。
北京邮电大学2017年《C语言程序设计》硕士考试大纲_北京邮电大学考研网
北京邮电大学2017年《C语言程序设计》硕士考试大纲(一)C语言基本知识1、C语言的特点以及C语言程序的组成;2、数据类型,包括整型、实型、字符型等常量与变量和变量的赋值;用typedef定义类型;3、各种类型数据之间的混合运算;4、各类运算符(包括自增、自减运算符)的运算规则与优先级,条件运算符;5.算术表达式、关系表达式和逻辑表达式,逗号运算符和逗号表达式,表达式sizeof的含义。
(二)语句1、赋值语句(含条件赋值语句)、条件语句(含if、if-else、switch)、循环语句(含while、do-while、for 语句,包括循环嵌套和break语句与continue语句);2、输入/输出语句,包括整型、实型、字符型(含字符串)等类型数据的格式输入函数scanf和格式输出函数printf。
(三)数组1、一维数组和二维数组的定义、引用与初始化;2、字符数组的定义、引用与初始化,字符数组的输入与输出,字符串和字符串处理函数。
(四)函数1、函数的定义,函数参数(形参和实参)与函数的返回值;2、函数的调用,包括函数的嵌套调用和递归函数的调用;3、命令行参数的基本概念,带参数的主函数的概念和应用。
(五)宏定义1、带参数的宏定义;2、包含文件的处理。
(六)指针1、指针的基本概念,变量的指针与指向变量的指针变量,包括定义、引用以及指针变量作为函数参数;2、数组与指针,包括指向数组的指针变量的定义与赋值、通过指针引用数组元素、数组名作为函数参数;3、字符串与指针,指向字符串的指针变量。
(七)结构体1、结构体的基本概念和特点,结构体变量的初始化与引用;2、结构体数组。
(八)文件1、C文件的基本概念,文本文件的类型指针FILE与文本文件的使用方式;2、文本文件的打开(fopen函数)与关闭(fclose函数);3、文本文件的状态,包括feof函数和ferror函数;4、文本文件的读写,包括fputc函数和fgetc函数、fgets函数与fputs函数等;5、文本文件的输入函数fscanf和输出函数fprintf。
C语言程序设计教程第1章 北京邮电大学出版社
2010/9/6
C语言程序设计教程
第1章 C语言程序设计概述
14
1.4 C语言字符集、标识符和关键字 C语言字符集、 语言字符集
一、C语言字符集 英文字母:大小写各26 26个 共计52 52个 1、英文字母:大小写各26个,共计52个; 阿拉伯数: 9 10个数字 个数字; 2、阿拉伯数:0~9共10个数字; 下划线: 3、下划线: _ ; 特殊符号:通常指由1 个符号组成的运算符。 4、特殊符号:通常指由1~2个符号组成的运算符。 算术运算符: / % ++ -算术运算符: + - * 关系运算符: > >= <= == != 关系运算符: < 逻辑运算符: 逻辑运算符: && || ! 位运算符: & | 位运算符: ~ ^ >> << 条件运算符: 和赋值运算符: 条件运算符: ?: 和赋值运算符:= 其他分隔符: 其他分隔符: ( ) [ ] { } . , ;
2010/9/6
C语言程序设计教程
2010/9/6
C语言程序设计教程
第1章 C语言程序设计概述
5
4、面向任务的程序设计语言: 、面向任务的程序设计语言: 是非过程化的语言,不需要知道问题是如何求解的。 是非过程化的语言,不需要知道问题是如何求解的。 例如:要从某学生表SS用数据库(SQL) SS用数据库 例如:要从某学生表SS用数据库(SQL)查询语言获取 表中记录的信息,采用SELECT语句,描述如下: SELECT语句 表中记录的信息,采用SELECT语句,描述如下: SELECT SSNO,SSNAME,SSAGE,SSSEX FROM SS 5、面向对象的程序设计语言: 面向对象的程序设计语言: 认为系统是由许多对象组成的, 认为系统是由许多对象组成的,对象通过消息相互 联系和相互作用,从而完成系统的功能。 C++, 联系和相互作用,从而完成系统的功能。如C++, 设计的程序更易懂, 更适合更大规模的程序开发。 设计的程序更易懂, 更适合更大规模的程序开发。 程 序 数据的确定:确定数据的类型和数据的存放方式。 数据的确定:确定数据的类型和数据的存放方式。 设 高级语言中用变量定义来实现。 变量定义来实现 高级语言中用变量定义来实现。 计 操作步骤(也即算法)的确定: 语句来实现 来实现。 操作步骤(也即算法)的确定:用语句来实现。
北邮课件--C++(B)
Beijing University of Posts & T elecommunications young@Beijing University of Posts & T elecommunications young@Beijing University of Posts & T elecommunications young@Beijing University of Posts & T elecommunications young@Beijing University of Posts & T elecommunications young@Beijing University of Posts & T elecommunications young@Beijing University of Posts & T elecommunications young@Beijing University of Posts & T elecommunications young@Beijing University of Posts & T elecommunications young@Beijing University of Posts & T elecommunications young@Beijing University of Posts & T elecommunications young@Beijing University of Posts & T elecommunications young@Beijing University of Posts & T elecommunications young@Beijing University of Posts & T elecommunications young@Beijing University of Posts & T elecommunications young@Buffer<char,20-10> b3;Beijing University of Posts & T elecommunications young@Beijing University of Posts & T elecommunications young@Beijing University of Posts & T elecommunications young@Beijing University of Posts & T elecommunications young@Beijing University of Posts & T elecommunications young@Beijing University of Posts & T elecommunications young@Beijing University of Posts & T elecommunications young@Beijing University of Posts & T elecommunications young@}Beijing University of Posts & T elecommunications young@}Beijing University of Posts & T elecommunications young@Beijing University of Posts & T elecommunications young@Beijing University of Posts & T elecommunications young@Beijing University of Posts & T elecommunications young@Beijing University of Posts & T elecommunications young@Beijing University of Posts & T elecommunications young@Beijing University of Posts & T elecommunications young@}Beijing University of Posts & T elecommunications young@}Beijing University of Posts & T elecommunications young@Beijing University of Posts & T elecommunications young@Beijing University of Posts & T elecommunications young@Vector<Node*> vpn;Beijing University of Posts & T elecommunications young@Beijing University of Posts & T elecommunications young@Beijing University of Posts & T elecommunications young@}; // 部分专门化示例Beijing University of Posts & T elecommunications young@Beijing University of Posts & T elecommunications young@Beijing University of Posts & T elecommunications young@Beijing University of Posts & T elecommunications young@Beijing University of Posts & T elecommunications young@Beijing University of Posts & T elecommunications young@Beijing University of Posts & T elecommunications young@Beijing University of Posts & T elecommunications young@complex<int> ci = cq; // 错误,无从Quad到int的转换Beijing University of Posts & T elecommunications young@Beijing University of Posts & T elecommunications young@Beijing University of Posts & T elecommunications young@。
北京邮电大学C语言课件第9章-结构体与链表
/*姓名*/
char address[40]; /*地址*/
float salary;
/*工资*/
float cost;
/*扣款*/
struct date hiredate; /*聘任日期*/
};
结构体类型可以嵌套定义即一个结构体类 型中的某些成员又是其他结构体类型
第七页,编辑于星期日:五点 十分。
()
{ ifnlotcanhtuasmrcno; arem; e[20]; chairnatdadgre[3; 0];
stu1.sc…o…re+..=stu2.(sc)ore;
cchhsaatrrruandcatdmrd[e3a[0t2e]0;}]s;tu1,stuf2l;oat score;
stu1.age++;
struct 结构体名 结构体变量={初始数据};
例 struct student { int num; char name[20];
char sex; int age;
char addr[30]; }; struct student stu1={112,“Wang Lin”,‘M’,19, “200 Beijing Road”};
char addr[50]; /*住址*/
};
第六页,编辑于星期日:五点 十分。
(3)日期结构体类型包括年、 月、日:
struct date {int year; /*年*/
month; /*月*/ day; /*日*/
};
(4)如职工信息结构体类型:
struct person
{
char name[20];
char name[20];
char name[20];
C语言程序设计教程第2章北京邮电大学出版社.ppt
C语言程序设计教程
7
(1)变量名。每个变量都必须有一个名字──变量名,变量命名 遵循标识符命名规则。 (2)变量值。在程序运行过程中,变量值存储在内存中。在程 序中,通过变量名来引用变量的值。 3.标识符命名规则 (1)有效字符:只能由字母、数字和下划线组成,且以字母或 下划线开头。 (2)有效长度:随系统而异,但至少前8个字符有效。如果超长, 则超长部分被舍弃。
2019/4/5
C语言程序设计教程
第2章 C语言的基本数据类型与表达式
11
5、变量的作用域 C语言程序是由函数组成的,且有且只能有一个main函数。 变量定义可以出现在函数内,亦可出现在函数外或者是函 数的参数中。 按照变量定义语句出现的位置,可以分为: 局部变量:在函数内定义; 只在该函数中才能使用。 全局变量:在函数外定义; 从它被定义的位置起,在之后的所有函数中有效。 形式参数:定义为函数的参数; 只在该函数中才能使用。
13
2.2 C语言的基本数据类型
一、整型数据 1、整型常量表示方法: (1) 十进制形式:与数学上的整数表示相同; 例如: 12, -100, 0 (2) 八进制形式:在数码前加数字0; 例如: 012=1*81+2*80=10(十进制) (3) 十六进制形式:在数码前加0X(数字0和字母X)。 例如: 0x12=1*161+2*160=18(十进制)
关键字 short unsigned short int unsigned long unsigned long
2019/4/5
所占位数 16 16 16 16 32 32
取值范围 -32768~32767 0 ~65535 -32768~32767 0 ~65535 -2147483648~2147483647 0~4294967295
C++大学基础教程第九章
• 父类被称为子 类的直接基类 • 父类的父类或 更高层次的父 类被称为这个 子类的间接基 类
派生与继承的实例
公司人员管理系统: 小型公司人员分为: 经理、兼职技术人员、销售经理和 兼职推销员. 要求: 存储所有人员的姓名、编号、级别、当月薪水,计算月薪 总额并显示全部信息。 人员编号在生成人员信息时同时生成,每输入一个人员信 息编号顺序加1。 程序能够对不同人员按不同方法提升级别,月薪的计算 方法是:
北京邮电大学电信工程学院计算机技术中心
-7-
继承的概念
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-8-
继承的概念
Bicycle
is-a relationships
Mountain Bikes
Racing Bikes
Tandem Bikes
2005-4-27
北京邮电大学电信工程学院计算机技术中心
2005-4-27 北京邮电大学电信工程学院计算机技术中心 -22-
class technician: public employee //兼职技术人员类 { private: 新增加的成员 float hourlyRate; //每小时酬金 int workHours; //当月工作时数 public: technician(); //构造函数 同名覆盖,改造基类成员 void pay(); //计算月薪函数 void displayStatus(); //显示人员信息 }; 派生类的成员: 1. 从基类继承的成员; 2. 改造基类成员; 3. 添加派生类新成员.
2005-4-27 北京邮电大学电信工程学院计算机技术中心 -31-
• 派生类的成员包括:(1)继承基类的成员,(2)派生 类定义时声明的成员。 • 派生类自己增加的成员,完成两个需求:(1)修改基类 成员,(2)描述新的特征或方法。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
11.1.2 多态的实现:联编
联编有两种方式:静态联编和动态联 编。 在源程序编译的时候就能确定具有多态 性的语句调用哪个函数,称为静态联 编。 对于重载函数的调用就是在编译的时候 确定具体调用哪个函数,所以是属于静 态联编。
2005-4-28 北京邮电大学电信工程学院计算机技术中心 -8-
class Rectangle : public Shape { public: Rectangle( int = 0, int = 0); // 构造函数 double getArea() const; // 返回面积 void print() const; // 输 出 Rectangle 类对象 private: int a,b; // 矩形的长和宽-13北京邮电大学电信工程学院计算机技术中心 2005-4-28 }; // 派生类Rectangle定义结束
2005-4-28 北京邮电大学电信工程学院计算机技术中心 -6-
11.1.2 多态的实现:联编
一个具有多态性的程序语句,在执行的 时候,必须确定究竟是调用哪一个函 数。也就是说,在执行的时候调用哪个 函数是唯一地确定的。确定具有多态性 的语句究竟调用哪个函数的过程称为联 编(Binding),有的资料也翻译成“绑 定”。
2005-4-28 北京邮电大学电信工程学院计算机技术中心 -20-
11.2.2通过基类指针调用同名函数
以下这些操作是不可以进行的:
不可以将基类对象赋值给派生类对象; 不可以用基类对象的地址初始化派生类对象的 指针; 不可以将派生类对象的引用定义为基类对象的 别名; 不可以通过用派生类对象初始化的基类对象的 指针,访问派生类新增加的和基类公有成员不 重名的公有成员。
2005-4-28 北京邮电大学电信工程学院计算机技术中心 -17-
11.2.1派生类对象调用同名函数
对于派生类对象调用成员函数,可以有以下的 结论: 派生类对象可以直接调用本类中与基类成员函 数同名的函数,不存在二义性; 在编译时就能确定对象将调用哪个函数,属于 静态联编,不属于运行时的多态。
2005-4-28
11.1.2 多态的实现:联编
动态联编则是必须在程序运行时,才能够确定 具有多态性的语句究竟调用哪个函数。用动态 联编实现的多态,也称为运行时的多态。以上 所述的几种多态形式中,只有运行多态是属于 动态联编。以后我们会看到,在一个循环中的 同一个语句,第一次循环时调用的是一个函 数,第二次循环时调用的是另一个函数。这种 结果,程序不运行是看不到的。所以称为动态 联编。
2005-4-28 北京邮电大学电信工程学院计算机技术中心 -21-
例11.2 在例11.1所定义的类的基础上,观察通过派生类对象地址初 始化的基类对象的指针访问getArea函数的结果。 #include <iostream> circle 对 象 初 始 化 shape_ptr 指 using namespace std; 针访问的getArea函数是 #include "shape.h" // 包含头文件 基类的getArea函数,面积是 0 void main() rectangle 对象初始化shape_ptr 指针访问的getArea函数是 { Shape *shape_ptr; // 指向基类对象的指针 Circle circle( 22, 8, 3.5 ); 基类的getArea函数,面积是 0 建 // 创 Circle类对象 Rectangle rectangle( 10, 10 ); // 创建Rectangle类对象 shape_ptr = &circle; // Circle 类对 象地 址初 始化基类指针 cout << "circle 对象初始化shape_ptr指针访问的getArea函数是 "<<endl; cout<<shape_ptr->getArea() << endl; // 静态联编 shape_ptr = &rectangle; // Rectangle类对象地址初始化基类 指针 cout << "rectangle 对象初始化shape_ptr指针访问的getArea函数 是 "<<endl; 北京邮电大学电信工程学院计算机技术中心 -222005-4-28 cout<<shape_ptr->getArea() << endl; // 静态联编
2005-4-28 北京邮电大学电信工程学院计算机技术中心 -15-
Rectangle类成 Rectangle::Rectangle( int aValue, int bValue ) 员函数的定义
{ a=aValue; b=bValue; } // Rectangle类构造函数 double Rectangle::getArea() const { cout<<"Rectangle类的getArea函数,面积是 "; return a * b; } // Rectangle类getArea函数定 义 void Rectangle::print() const { cout << "hight is "<<a; cout<<"width is"<<b<<endl; } // Rectangle 类 print 函 数 定 义
2005-4-28 北京邮电大学电信工程学院计算机技术中心 -14-
Circle::Circle( int xValue, int yValue, double radiusValue ) { Circle类成员函数的定义 x=xValue; y=yValue; radius= radiusValue ; } // Circle类构造函数 double Circle::getArea() const { cout<<"Circle类的getArea函数,面积是 "; return 3.14159 * radius * radius; } // Circle类getArea函数定义 void Circle::print() const { cout << "center is "; cout<<"x="<<x<<" y="<<y; cout << "; radius is " << radius<<endl; } // Circle类print函数定义
11.1 多态性的概念
11.1.1面向对象程序设计中多态的表现
总的来说,不同对象对于相同的消息有不同的 响应,就是面向对象程序设计中的多态性。 具体在程序中,多态性有两种表现的方式:
同一个对象调用名字相同、但是参数不同的函数, 表现出不同的行为。在同一个类中定义的重载函数 的调用,属于这种情况。 不同的对象调用名字和参数都相同的函数,表现出 不同的行为。在派生类的应用中,经常会看到这样 的调用。
北京邮电大学电信工程学院计算机技术中心
-18-
11.2.2通过基类指针调用同名函数
从继承的角度来看,派生类对象是基类对象的 一个具体的特例。或者说,派生类对象是某一 种特定类型的基类对象。
例如,Circle类是Shape类的公有继承,“圆”是“图 形”的一种特例。或者说,圆是一种特定的图形, 具有图形的基本特征。
#include "shape.h" // 包含头文件 void main() { Circle circle( 22, 8, 3.5 ); // 创建Circle类对象 Rectangle rectangle( 10, 10 ); // 创 建 Rectangle 类 对象 cout << "调用的是 "; cout<<circle.getArea() << endl; // 静态联编 cout << "调用的是"; cout<<rectangle.getArea() << endl; // 静态联编 } // 结束main函数
2005-4-28 北京邮电大学电信工程学院计算机技术中心 -11-
例11.1 定义Circle类和Rectangle类为Shape类的派生类,通 过Circle类和Rectangle类的对象调用重载函数getArea()显示 对象的面积。
// 例11.1: shape.h #ifndef SHAPE_H #define SHAPE_H class Shape { public: double getArea() const; void print() const; };
基类Shape的定义
// 邮电大学电信工程学院计算机技术中心
-12-
class Circle : public Shape { 派生类Circle的定义 public: Circle( int = 0, int = 0, double = 0.0 ); double getArea() const; // 返回面积 void print() const; // 输出Circle 类对象t private: 派生类Rectangle的定义 int x,y; // 圆心座标 double radius; // 圆半径 }; // 派生类Circle定义 结束
2005-4-28
北京邮电大学电信工程学院计算机技术中心
-5-
11.1.1面向对象程序设计中多态的表现
面向对象程序设计中多态性表现为以下几种形 式:
重载多态:通过调用相同名字的函数,表现出不同 的行为。运算符重载也是一种重载多态。 运行多态:通过基类的指针,调用不同派生类的同 名函数,表现出不同的行为。许多面向对象程序设 计的书籍中所说的多态性,就是这种多态。 模板多态,也称为参数多态:通过一个模板,得到 不同的函数或不同的类。这些函数或者类具有不同 的特性和不同的行为。