C++语言程序设计_第1页
C++语言程序设计_第2页
C++语言程序设计_第3页
C++语言程序设计_第4页
C++语言程序设计_第5页
已阅读5页,还剩804页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、培养目标,1.建立基本的计算机程序设计概念体系和基本的程序设计方法。 2.理解和掌握C+语言的基本语法和语义,初步理解面向对象的思想,初步掌握面向对象程序设计的方法。 3. 逐步提高学生的编程能力和调试程序的能力。 为后面的学习打好基础。,课程简介,第章 概述 计算机程序设计语言的发展(一般了解) 面向对象的方法(一般了解) 面向对象的软件开发(一般了解) 信息的表示与存储(理解) 程序的开发过程(一般了解) 小结,课程简介,第章 简单程序设计 语言概述(一般理解) 基本数据类型和表达式(掌握) 数据的输入与输出(掌握) 算法的基本控制结构(掌握) 自定义数据类型(掌握) 小结,课程简介,第章

2、 函数 函数的定义与使用(掌握) 内联函数(掌握) 带默认形参值的函数(掌握) 函数重载(掌握) 函数模板(掌握) 使用系统函数(掌握) 小结,课程简介,第章 类与对象 面向对象的思想(理解) 面向对象程序设计的基本特点(理解) 类和对象(掌握) 构造函数和析构函数(掌握) 类的组合(掌握) 类模板(掌握) 面向对象标记(一般了解) 小结,课程简介,第章 程序的结构 程序的结构(理解) 生存期(掌握) 数据和函数(掌握) 静态成员(掌握) 友元(掌握) 共享数据的保护(掌握) 多文件结构和编译预处理命令(掌握) 小结,课程简介,第章 数组、指针与字符串 数组(掌握) 指针(掌握) 动态内存分配

3、(掌握) 字符串,第7章,7.1 类的继承与派生(掌握) 7.2 访问控制(掌握) 7.3 派生类的构造、析构函数(掌握) 7.4 派生类成员的标识与访问(掌握) 7.5 赋值兼容规则,第8章多态性,8.1 多态性 (掌握) 8.2 运算符重载 (掌握) 8.3 虚函数 (掌握) 8.4 抽象类,实验,实验共分8次,实验环境为:visual c+6.0 实验内容为学院统一印制的实验指导书。,第一章 绪论,计算机程序设计语言的发展 面向对象的方法 面向对象的软件开发 信息的表示与存储 程序的开发过程,1.1计算机语言的发展,计算机的工作是用程序来控制的 程序是指令的集合。 指令是计算机可以识别的

4、命令。,计算机程序,机器语言,由计算机硬件系统可以识别的二进制指令组成的语言称为机器语言。 计算机发展的初期,软件工程师们只能用机器语言来编写程序。 例如 1011 1111 1101 缺点:难懂,不易修改,移植性差,汇编语言,汇编语言将机器指令映射为一些可以被人读懂的助记符,如ADD、SUB等。 此时编程语言与人类自然语言间的鸿沟略有缩小,但仍与人类的思维相差甚远。因为它的抽象层次太低,程序员需要考虑大量的机器细节。 例如 ADD CX,DX 将DX的内容加进CX 。不能立即执行,需要汇编,变成目标程序。,高级语言,高级语言屏蔽了机器的细节,提高了语言的抽象层次,程序中可以采用具有一定含义的

5、数据命名和容易理解的执行语句。这使得在书写程序时可以联系到程序所描述的具体事物。 例如 if y3 z=x+y; 类似英语和数学表达式,高级语言发展:,第一代语言是对数学表达式有很强的运算处理能力 代表是Fortran 和Algol 60 第二代语言的重点如何有效地表达算法 代表是Pascal 和C 第三代语言引入抽象数据类型的程序设计语言 代表是被认为是基于对象的语言 第四代面向对象程序设计语言 代表是Smalltalk、Eiffel、c+、Java,面向对象的语言,出发点: 更直接地描述客观世界中存在的事物(对象)以及它们之间的关系。 特点: 是高级语言。 将客观事物看作具有属性和行为的对

6、象。 通过抽象找出同一类对象的共同属性和行为,形成类。,面向对象的语言,优点: 使程序能够比较直接地反问题域的本来面目,软件开发人员能够利用人类认识事物所采用的一般思维方法来进行软件开发。,语言的鸿沟,程序的目的:用于数学计算 主要工作:设计求解问题的过程 缺点:对于庞大、复杂的程序难以开发和维护,1.2 面向对象的方法,面向对象方法的由来 一、程序设计方法的发展历程 面向过程的程序设计方法,语言排行榜,二、程序设计方法的发展历程面向过程的结构化程序设计方法,设计思路 自顶向下、逐步求精。采用模块分解与功能抽象,自顶向下、分而治之。 程序结构: 按功能划分为若干个基本模块,形成一个树状结构。

7、各模块间的关系尽可能简单,功能上相对独立;每一模块内部均是由顺序、选择和循环三种基本结构组成。 其模块化实现的具体方法:函数(C)。,优点: 有效地将一个较复杂的程序系统设计任务分解成许多易于控制和处理的子任务,便于开发和维护。,缺点:可重用性差、难以开发图形界面的应用 把数据和处理数据的过程分离为相互独立的实体。 当数据结构改变时,所有相关的处理过程都要进行相应的修改。 图形用户界面的应用,很难用过程来描述和实现,开发和维护都很困难。C语言画图举例,三、程序设计方法的发展历程 面向对象的方法,将数据及对数据的操作方法封装在一起,作为一个相互依存、不可分离的整体对象。 对同类型对象抽象出其共性

8、,形成类。 类通过一个简单的外部接口,与外界发生关系。 对象与对象之间通过消息进行通讯。(微波炉),面向对象的基本概念 对象,一般意义上的对象: 是现实世界中一个实际存在的事物。 可以使有形的(比如一辆汽车),也可以是无形的(比如一项计划)。 是构成世界的一个独立单位,具有: 静态特征:可以用某种数据来描述 动态特征:对象所表现的行为或具有的功能,面向对象方法中的对象: 是系统中用来描述客观事物的一个实体,它是用来构成系统的一个基本单位。对象由一组属性和一组行为构成。 属性:用来描述对象静态特征的数据项。 行为:用来描述对象动态特征的操作序列。,面向对象的基本概念 类,分类人类通常的思维方法(

9、轿车、男人、女人) 分类所依据的原则抽象 忽略事物的非本质特征,只注意那些与当前目标有关的本质特征,从而找出事物的共性,把具有共同性质的事物划分为一类,得出一个抽象的概念。 例如,石头、树木、汽车、房屋等都是人们在长期的生产和生活实践中抽象出的概念。,面向对象方法中的类 具有相同属性和服务的一组对象的集合 为属于该类的全部对象提供了抽象的描述,包括属性和行为两个主要部分。 类与对象的关系:犹如模具与铸件之间的关系,一个属于某类的对象称为该类的一个实例。,集合成员 抽象描述具体实例,面向对象的基本概念 封装,把对象的属性和服务结合成一个独立的系统单位。 尽可能隐蔽对象的内部细节。对外形成一个边界

10、(或者说一道屏障),只保留有限的对外接口使之与外部发生联系。,封装,顾客,面向对象的基本概念 继承,继承对于软件复用有着重要意义,是面向对象技术能够提高软件开发效率的重要原因之一。 定义:特殊类的对象拥有其一般类的全部属性与服务,称作特殊类对一般类的继承。 例如:将轮船作为一个一般类,客轮便是一个特殊类。,哺乳动物 热血、有毛发、用奶哺育幼仔,狗 有犬牙、食肉、特定的骨骼结构、群居,柯利狗 尖鼻子、身体颜色红白相间、适合放牧,面向对象的基本概念 多态性,多态是指在一般类中定义的属性或行为,被特殊类继承之后,可以具有不同的数据类型或表现出不同的行为。这使得同一个属性或行为在一般类及其各个特殊类中

11、具有不同的语义。 例如: 数的加法-实数的加法 -复数的加法 例动物叫,面向对象的软件工程,面向对象的软件工程是面向对象方法在软件工程领域的全面应用。它包括: 面向对象的分析(OOA) 面向对象的设计(OOD) 面向对象的编程(OOP) 面向对象的测试(OOT) 面向对象的软件维护(OOSM),面向对象的软件开发,作业,作业:、 、,第二章 C+简单程序设计,本章主要内容,C+语言概述 基本数据类型和表达式 数据的输入与输出 算法的基本控制结构,2.1.1 C+语言的产生,C+是从C语言发展演变而来的: 1983:对C扩充,发展为C。 C+语言的标准化工作从1989年开始,于1994年制定了A

12、NSI C+标准草案。以后又经过不断完善,成为目前的C+。,2.1 C+语言概述,2.1.2 C+的特点,全面兼容C 它保持了C的简洁、高效和接近汇编语言等特点 对C的进行了改革和扩充 C+也支持面向过程的程序设计,不是一个纯正的面向对象的语言 支持面向对象的方法,2.1.3 C+程序实例例2-1,/ this is a simplest program. #include void main(void) coutHello!n; coutWelcome to c+!n; /c语言怎么写?,词法记号,词法记号是最小的词法单位 、关键字 C+预定义的单词。是指C+中有特殊含义的字,是不能重 新定

13、义的。程序员不可用之作为自己定义的变量或函数的名字。,类别 关键字个数 举例 ANSI C 32 char,for 等 ANSI C+ 61 (增加29个) class,public等,、标识符 程序员声明的单词,它命名程序正文中的 一些实体。,两种注释方法 / 、 /* */,2.2基本数据类型和表达式,2.2.1基本数据类型,是指将数据根据表达形式的不同而 划分的类别。,数据类型:,C+的数据类型一般分为如下几种:,基本数据类型,非基本数据类型(用户定义数据类型),整型 字符型 实型(浮点型) 逻辑型(布尔型) 数组 指针 空类型 结构 联合 枚举 类,数据类型,注意: (1)注意C无布尔

14、类型。C语言在表达逻辑运算的结果时,用 整数0 代表逻辑“假”,用非0的整数值(如1)表示逻辑“真”。 C+中增添了布尔类型bool。,数据类型 布尔型数据,布尔型变量的说明:例:bool flag; 布尔型数据的取值:只有 false 和 true 两个值,例 : int a=b; char c=97; coutaendl; coutcendl; 输出: 98 a,字符常量的使用方法 字符数据和整型数据之间可以运算。 字符数据与整型数据可以互相赋值。,2.2.2 常量,字符串常量,字符串型常量是用双引号括起来的一个或多个字符。 例如,将1用双引号括起来,此时“1”代表的是一个字符串型常量,

15、与字符型常量1也是有区别的。,C+规定以字符0作为字符串结束标志。如,一个字符串“HELLO”,在内存中以“0”为结尾。“0”在输出时不作显示,只用来表示字符串的结束。,字符串型常量,“HELLO”,H E L L O 0,注意“P”与P不同。前者为字符串,在机内存储形式 为 P 0,2.3变量,变量是什么,变量程序在运行过程中,其值会发生改变的量。,变量:变量值 23,变量名 length,变量类型 int,符号常量 const float pi=3.14159; *常量定义中初始化的值可以是一个常量表达式: const int size=100*sizeof(int); const int

16、 number=max(15,23); /OK,2.2.4 符号常量,2.2.5运算符和表达式,/ 整除 5/2=2 5.0/2.0=2.5 若 / 的两操作数都为整数,则为整除: 例 int i = 15; float f ; f = i/10; 结果为:f=1 如果将第三条语句改为 f = (float)i/10; 或f = i/10.0; 则结果为:f=1.5,在 C+语言中,表达式 (7/3+1)+ 5/6 的值是( )。 A)2B)3C)4 D)不能确定,B,(余的符号与被除数相同,不允许对浮点数操作) 3%4=3 4%4=0 例 #include void main() int n

17、; n = 40 % 5; cout 40 % 5 : n endl; /(0) n = 40 % 7; cout 40 % 7 : n endl; / (5) n = 40 % -7; cout 40 % -7 : n endl; /(5) n = -40 % 7; cout -40 % 7 : n endl; /(-5) n = -40 % -7; cout -40 % -7 : n endl; /(-5) /负数求余,先取绝对值,再按正规情况求余,最后结果的符号和被除数相同,% 取余,赋值运算符和赋值表达式 赋值表达式举例,a=5表达式值为5 a=b=c=5表达式值为5,a,b,c均为5

18、 a=5+(c=6)表达式值为11,a为11,c为6 a=(b=4)+(c=6) 表达式值为10,a为10,b为4,c为6 a=(b=10)/(c=2) 表达式值为5,a为5,b为10,c为2 a+=a-=a*a 相当于: a=a+(a=a-a*a),Page 56,例:x=6; x+=x-=x*x; 若x为整型变量,则上述语句执行后 x 的值是_(4)_。 A. 36 B. -60C. 60D. -24,B,、逗号运算和逗号表达式,格式: 表达式1,表达式2 求解顺序及结果: 先求解1,再求解2,最终结果为表达式2的值 例 a=3*5,a*4 最终结果为60 例 2 int a, b, c;

19、 d=(a=1, b=a+2 , c=b+3 ); coutdendl; ,Page 58,、关系运算与关系表达式,用关系运算符将两个表达式连接起来,就是关系表达式 关系运算是比较简单的一种逻辑运算,优先次序为: = = != 优先级相同(高) 优先级相同(低) 关系表达式是一种最简单的逻辑表达式 其结果类型为 bool,值只能为 true 或 false。 例如:ab,c=a+b,x+y=3,逻辑运算与逻辑表达式,逻辑运算符: !(非) ,、位运算按位与(,位运算按位异或(),运算规则 两个操作数进行异或:若对应位相同,则结果该位为 0,若对应位不同,则结果该位为 1, 举例:计算 0710

20、52 071: 0 0 1 1 1 0 0 1 052:() 0 0 1 0 1 0 1 0 071052 : 0 0 0 1 0 0 1 1,位运算按位异或(),用途: 使特定位翻转 例如:要使 01111010 低四位翻转: 0 1 1 1 1 0 1 0 ()0 0 0 0 1 1 1 1 0 1 1 1 0 1 0 1,位运算取反(),单目运算符:对一个二进制数按位取反。 例: 025:0000000000010101 025:1111111111101010,位运算移位,左移运算() 右移后,低位:舍弃 高位:无符号数:补0 有符号数:补“符号位”,例1:,char a=-8; co

21、ut2)endl;,例2:,21,这是C中新加的非常简单易用的输入、输出方式, 在程序的开头增加一行: #include 1)用插入操作符“”向标准输出cout中插入字符。 向标准输出设备输出 例:int x; cout“x=“x;,简单的输入、输出,2) 用抽取操作符“”从标准输入流cin中抽取字符 从标准输入设备(键盘)输入 例:int x; cinx; int a,b; cinab;,) 使用控制符 有时缺省输出格式不能满足要求,这时可以用控制符控制输出的格式。 P表2-。 在程序的开头增加一行: #include,例:,#include #include void main() cou

22、tsetw(5)setprecision(3)3.1415endl; 3.14,2.5算法的基本控制结构,算法的基本控制结构: 顺序结构 分支结构 循环结构,#include void main( ) int x,y,z; cinxyz; int max=x; If (zy) if(zx) max=z; else if(yx) max=y; coutmax; ,功能:在三个数中取最大的,#include void main( ) int x,y,z; cinxyz; int max=x; If (ymax) max=y; if(zmax) max=z; coutmax; ,2.4.3如何有效地

23、完成重复工作,、while 语句,形式 while (表达式) 语句,例2-6 输入一个整数,将各位数字反转后输出。,#include void main(void) int n, right_digit, newnum = 0; cout n; cout The number in reverse order is ; do right_digit = n % 10; cout right_digit; n /= 10; while (n != 0); coutendl; ,3、for 语句,语法形式 for (表达式1;表达式2;表达式3) 语句,表达式 2,表达式1,循环体,表达式3,0

24、,非0,例2-8,输入一个整数,求出它的所有因子。,#include void main(void) int n, k; cout n; cout Number n Factors ; for (k=1; k = n; k+) if (n % k = 0) cout k ; cout endl; ,作业,、 0 1,第三章 函数,3.1 函数的定义和使用 3.2 内联函数 3.3 带缺省形参值的函数 3.4 函数重载 3.5 函数模板 3.6 C+系统函数,函数是程序设计中的基本抽象单元, 是对功能的抽象,可以把特定的功能集中由函数来完成。函数可以被重复使用,有利于代码重用。 不管这个函数实现

25、的功能有多复杂,调用它只需要很少的语句,而且调用形式是固定不变的。,3.1.1函数的定义 函数声明的语法形式 类型标识符 函数名(形式参数表) 语句序列 ,若无参数,写void,是被初始化的局部变量,寿命和可见性仅限于函数内部,若无返回值,写void,3.1函数的定义与使用,函数的调用,1 、函数调用 调用前先说明函数原型: 程序文件开头所有函数之前,按如下形式说明: 类型标识符 被调用函数名 (含类型说明的形参表); 调用形式 函数名(实参列表),例3-1 编写一个求x的n次方的函数,#include doublepower (double x, int n); void main(void

26、) cout 5 to the power 2 is power(5,2) endl; ,doublepower (double x, int n) double val = 1.0; while (n-) val = val*x; return(val); ,2、 函数调用的执行过程,汉诺塔,4、递归调用,函数直接或间接地调用自身,称为递归调用。 递归过程的两个阶段: 递推: 4!=43! 3!=32! 2!=21! 1!=10! 0!=1 未知 已知 回归: 4!=43!=243!=32!=62!=21!=21!=10!=10!=1 未知 已知,例3-8 求n!,分析:计算n!的公式如下:

27、 这是一个递归形式的公式,应该用递归函数实现。,源程序: #include long fac(int n) long f; if (n0) coutn0,data error!endl; else if (n=0) f=1; else f=fac(n-1)*n; return(f); ,void main() long fac(int n); int n; long y; coutn; y=fac(n); coutn!=yendl; 运行结果: Enter a positive integer:8 8!=40320,例3-10 汉诺塔问题,有三根针A、B、C。A针上有N个盘子,大的在下,小的在

28、上: 目的:要求把这N个盘子从A针移到C针; 规则: 在移动过程中可以借助B针,每次只允许移动一个盘,且在移动过程中在三根针上都保持大盘在下,小盘在上。,算法分析: 将n 个盘子从A针移到C针可以分解为下面三个步骤: 将A 上n-1个盘子移到 B针上(借助C针); 把A针上剩下的一个盘子移到C针上; 将n-1个盘子从B针移到C针上(借助A针); 事实上,上面三个步骤包含两种操作: 将多个盘子从一个针移到另一个针上,这是一个递归的过程。 hanoi函数实现。 将1个盘子从一个针上移到另一针上。用move函数实现。,void move(int n,char getone,char putone)

29、coutputoneendl; void hanoi(int n,char one,char two,char three) void move(int n,char getone,char putone); if (n=1) move (n,one,three); else hanoi (n-1,one,three,two); move(n,one,three); hanoi(n-1,two,one,three); ,hanio(3, A, B, C);,void main( ) void hanoi(int n,char one,char two,char three); int m; c

30、outm; coutthe steps to moving m diskes:endl; hanoi(m,A,B,C); ,3.1.3 函数的参数传递机制 传递参数值,在函数被调用时才分配形参的存储单元。 实参可以是常量、变量或表达式。 实参类型必须与形参相符。 传递时是传递参数值,即单向传递。,函数的参数传递机制 参数值传递举例,单向传递:形参改变不影响实参的值,void funca(int, int); void funcb(int); void main ( ) int a=6,b=12; funca(a,b); void funca(int aa, int bb) int n=5; f

31、uncb(n); void funcb(int s) int x; . ,例3-11 输入两 整数交换后输出,#include void Swap(int a, int b); int main() int x(5), y(10); cout交换前 x=x y=yendl; Swap(x,y); cout交换后 x=x y=yendl; return 0; ,void Swap(int a, int b) int t; t=a; a=b; b=t; ,运行结果: 交换前x=5 y=10 交换后x=5 y=10,函数的参数传递 用引用做形参,引用是C+比C扩充的一种派生数据类型 引用是为对象取一

32、个别名,不占存储空间. 引用类型说明符为,声明一个引用型变量时,必须同时使之初始化,即声明它指向哪一个变量。 并且从此不可改变。,例: void main( ) int i=100, ,100 200,一旦一个引用被初始化后,就不能改为指向其它对象。 引用可以作为形参 void swap(int,x 的地址,a,Swap(x,y);,例3-13 引用调用举例,#include #include void fiddle(int in1, int ,void fiddle(int in1, int ,运行结果: 调用函数前7 12 函数中107 112 调用函数后 7 112,3.2 内联函数,需

33、要? 编译时在调用处用函数体进行替换,节省了参数传递、控制转移等开销。 声明时使用关键字 inline。 注意: 内联函数体内不能有循环语句和switch语句。,例3-14 内联函数应用举例,#include inline double CalArea(double radius) return 3.14*radius*radius; int main() double r(3.0); double area; area=CalArea(r); coutareaendl; return 0; ,带默认形参值的函数,函数在声明时可以预先给出默认的形参值,调用时如给出实参,则采用实参值,否则采用预

34、先给出的默认形参值。 例如:,int add(int x=5,int y=6) return x+y; ,void main(void) add(10,20); /10+20 add(10); /10+6 add( ); /5+6 ,缺省形参值的说明次序,部分缺省形参值: 缺省形参值必须从右向左顺序声明,并且在缺省形参值的右面不能有非缺省形参值的参数。因为调用时实参取代形参是从左向右的顺序。 例: int add(int x,int y=5,int z=6); /正确 int add(int x=1,int y=5,int z); /错误 int add(int x=1,int y,int z

35、=6); /错误,缺省形参值与函数的调用位置,调用出现在函数体实现之前时,缺省形参值必须在函数原形中给出;而当调用出现在函数体实现之后时,缺省形参值需在函数实现时给出。 例:,int add(int x=5,int y=6); void main(void) add( ); /调用在实现前 int add(int x,int y) return x+y; ,int add(int x=5,int y=6) return x+y; void main(void) add( ); /调用在实现后 ,缺省形参值的作用域,在相同的作用域内,缺省形参值的说明应保持唯一,但如果在不同的作用域内,允许说明不

36、同的缺省形参。 例: int add(int x=1,int y=2); void main(void) int add(int x=3,int y=4); add( ); /使用局部缺省形参值(实现3+4) void fun(void) . add( ); /使用全局缺省形参值(实现1+2) ,例3-15 带缺省形参值的函数举例,#include #include int get_volume(int length, int width = 2, int height = 3); int main( ) int x = 10, y = 12, z = 15; cout Some box da

37、ta is ; cout get_volume(x, y, z) endl; cout Some box data is ; cout get_volume(x, y) endl; cout Some box data is ; cout get_volume(x) endl; cout Some box data is ; cout get_volume(x, 7) endl; cout Some box data is ; cout get_volume(5, 5, 5) endl; return 0; ,题意:给出长、宽、高,get_volum 函数计算出体积。使用缺省形参值。,int

38、get_volume(int length, int width, int height) coutsetw(5)length setw(5)widthsetw(5)height ; return length * width * height; 运行结果: Some box data is 10 12 15 1800 Some box data is 10 12 3 360 Some box data is 10 2 3 60 Some box data is 10 7 3 210 Some box data is 5 5 5 125,重载函数的声明,C+允许功能相近的函数在相同的作用域内以

39、相同函数名声明,从而形成重载。方便使用,便于记忆。 例:,注意事项,不要将不同功能的函数声明为重载函数,以免出现调用结果的误解、混淆。这样不好:,重载函数的形参必须不同: 个数不同或类型不同。 编译程序将根据实参和形参的类型及个数的最佳匹配来选择调用哪一个函数。,例3-16 重载函数应用举例,编写三个名为add的重载函数,分别实现两整数相加、两实数相加和两个复数相加的功能。 #include struct complex double real; double imaginary; ;,void main(void) int m, n; double x, y; complex c1, c2,

40、 c3; int add(int m, int n); double add(double x, double y); complex add(complex c1, complex c2); coutmn; coutinteger m+n=add(m,n)endl;,coutxy; coutc1.realc1.imaginary; coutc2.realc2.imaginary; c3=add(c1,c2); coutcomplex number ( c1.real , c1.imaginary )+(c2.real, c2.imaginary)=(c3.real, c3.imaginary

41、)n; ,int add(int m, int n) return m+n; double add(double x, double y) return x+y; complex add(complex c1, complex c2) complex c; c.real=c1.real+c2.real; c.imaginary=c1.imaginary+c2.imaginary; return c; ,3.5函数模板,函数模板可以用来创建一个通用功能的函数,以支持多种不同形参,进一步简化重载函数的函数体设计。 声明方法: template ,int abs(int x) return x0?-

42、x:x; ,例3-17 求绝对值函数的模板,#include template T abs(T x) return x0?-x:x; void main( ) int n=-5; double d=-5.5; coutabs(n)endl; coutabs(d)endl; ,运行结果: 5 5.5 分析 对于调用表达式abs(n),由于实参n为int型,所以推导出模板中类型参数T为int。 当类型参数的含义确定后,编译器将以函数模板为样板,生成一个函数:int abs(int x) return x0?-x:x; ,3.6 C+系统函数,C+的系统库中提供了几百个函数可供程序员使用。 例如:求

43、平方根函数(sprt)、求绝对值函数(abs)等。 使用系统函数时要包含相应的头文件。 例如:math.h,例3-18 系统函数应用举例,题目: 从键盘输入一个角度值,求出该角度的正弦值、余弦值和正切值。 分析: 系统函数中提供了求正弦值、余弦值和正切值的函数:sin( )、cos( )、tan( ),函数的说明在头文件math.h中。,#include #include const double pi(3.14159265); void main( ) double a,b; cina; b=a*pi/180; coutsin(a)=sin(b)endl; coutcos(a)=cos(b)

44、endl; couttan(a)=tan(b)endl; ,查找系统函数的使用说明,msdn,总结,函数的定义和使用 内联函数 带缺省形参值的函数 函数重载 函数模板 C+系统函数,作 业,复习第三章,预习第四章 3-2, 3-8, 3-10 学习使用MSDN,第四章 类与对象,C+语言程序设计(上),本章主要内容,面向对象的思想 OOP的基本特点 类与对象 构造函数与析构函数 类的组合 类模板 面向对象标记,回顾:面向过程的设计方法,重点: 如何实现细节过程,将数据与函数分开。 形式: 主模块+若干个子模块(main( )+子函数)。 特点: 自顶向下,逐步求精功能分解。 缺点: 效率低,程

45、序的可重用性差。,面向对象的思想,面向对象的方法,目的: 实现软件设计的产业化。 观点: 自然界是由实体(对象)所组成。 程序设计方法: 使用面向对象的观点来描述模仿并处理现实问题。 要求: 高度概括、分类、和抽象。,()抽象,抽象是对具体对象(问题)进行概括,抽出这一类对象的公共性质并加以描述的过程。 先注意问题的本质及描述,其次是实现过程或细节。 数据抽象:描述某类对象的属性或状态(对象相互区别的物理量)。 代码抽象:描述某类对象的共有的行为特征或具有的功能。 抽象的实现:通过类的声明。, OOP的基本特点,抽象实例钟表,数据抽象: int Hour, int Minute, int Se

46、cond 代码抽象: SetTime( ), ShowTime( ),抽象实例钟表类,class Clock public: void SetTime(int NewH, int NewM, int NewS); void ShowTime( ); private: int Hour,Minute,Second; ;,抽象实例人,数据抽象: char *name,char *sex,int age,int id 代码抽象: 生物属性角度:GetCloth( ), Eat( ), Step( ), 社会属性角度:Work( ),注意:同一问题可能有不同的抽象结果根据解决问题的要求不同, 产生的抽

47、象成员可能不同,()封装,将抽象出的数据成员、代码成员相结合,将它们视为一个整体。 目的是增强安全性和简化编程,使用者不必了解具体的实现细节,而只需要通过外部接口,以特定的访问权限,来使用类的成员。 实现封装:类声明中的,()封装,实例: class Clock public: void SetTime(int NewH,int NewM, int NewS); void ShowTime( ); private: int Hour,Minute,Second; ;,特定的访问权限,()继承与派生,是C+中支持层次分类的一种机制,允许程序员在保持原有类特性的基础上,进行更具体的说明。 实现:声

48、明派生类第七章,昆虫,有翅,无翅,蛾,苍蝇,蝴蝶,昆虫的分类树,()多态性,多态:同一名称,不同的功能实现方式。 目的:达到行为标识统一,减少程序中标识符的个数。 实现:重载函数和虚函数第八章,c+中的类,类是具有相同属性和行为的一组对象的集合,它为属于该类的全部对象提供了统一的抽象描述,其内部包括属性和行为两个主要部分。 利用类可以实现数据的封装、隐藏、继承与派生。 利用类易于编写大型复杂程序,其模块化程度比C中采用函数更高。,类与对象,类的声明形式,类是一种用户自定义类型,声明形式: class 类名称 public: 公有成员(外部接口) private: 私有成员 protected:

49、 保护型成员 ,公有类型成员,在关键字public后面声明,它们是类与外部的接口,任何外部函数都可以访问公有类型数据和函数。,私有类型成员,在关键字private后面声明,只允许本类中的函数访问,而类外部的任何函数都不能访问。 如果紧跟在类名称的后面声明私有成员,则关键字private可以省略。,保护类型,与private类似,其差别表现在继承与派生时对派生类的影响不同,第七章讲。,类的成员,class Clock public: void SetTime(int NewH,int NewM,int NewS); void ShowTime(); private: int Hour, Minu

50、te, Second; ;,成员数据,成员函数,void Clock : SetTime(int NewH, int NewM, int NewS) Hour=NewH; Minute=NewM; Second=NewS; void Clock : ShowTime() coutHour:Minute:Second; ,成员数据,与一般的变量声明相同,但需要将它放在类的声明体中。,class complex private: double real; double imag; public: void init (double r,double i)real=r; imag=i; double

51、 realcomplex()return real; double imagcomplex()return imag; double abscomplex() double t; t=real*real+imag*imag; return sqrt(t); ;,成员函数,在类中说明原形,可以在类外给出函数体实现,并在函数名前使用类名加以限定。也可以直接在类中给出函数体。 允许声明重载函数和带缺省形参值的函数,带缺省形参值的函数,Void clock:SetTime(int NewH=0,int NewM=0,int NewS=0) Hour=NewH; Minute=NewM; Second=

52、NewS; ,内联成员函数,为了提高运行时的效率,对于较简单的函数可以声明为内联形式。 在类中声明内联成员函数的方式: 将函数体放在类的声明中隐式 使用inline关键字显式,内联成员函数举例(隐式),class Point public: void Init(int initX,int initY) X=initX; Y=initY; int GetX( ) return X; int GetY( ) return Y; private: int X,Y; ;,内联成员函数举例(显式),class Point public: void Init(int initX,int initY); i

53、nt GetX( ); int GetY( ); private: int X,Y; ;,inline void Point: Init(int initX,int initY) X=initX; Y=initY; inline int Point:GetX( ) return X; inline int Point:GetY( ) return Y; ,对象,类的对象是该类的某一特定实体,即类类型的变量。 声明形式: 类名 对象名; 例: Clock myClock;,类中成员的访问方式,类中成员互访 直接使用成员名 类外访问 使用“对象名.成员名”方式访问 public 属性的成员,例4-

54、1 类的应用举例,#include class Clock /类的声明 public: void SetTime(int NewH, int NewM, int NewS); void ShowTime(); private: int Hour, Minute, Second; ;,void Clock : SetTime(int NewH, int NewM, int NewS) Hour=NewH; Minute=NewM; Second=NewS; void Clock : ShowTime() coutHour:Minute:Second; ,/.类的实现,void main(void

55、) Clock myClock; myClock.SetTime(8,30,30); myClock.ShowTime(); ,结构与类和对象,结构的扩充: struct Savings int accountNumber; float balance; void show()coutaccountNumber balanceendl; ; void fn() Savings a; Savings b; a. accountNumber=1; a.balance=100.0; b. accountNumber=2; .balance=200.0; a.show();b.show(); ,结构与

56、类的区别区别: 类中成员的缺省存储属性 为私有的 结构体中的缺省存储属性为共有的.,构造函数的作用是在对象被创建时使用特定的值构造对象,或者说将对象初始化为一个特定的状态。 在对象创建时由系统自动调用。 如果程序中未声明,则系统自动产生出一个缺省形式的构造函数 允许为内联函数、重载函数、带缺省形参值的函数,4.4 构造函数与析构函数,构造函数-由于类的封装性,不能象普通变量一样初始化struct Savingsint accountNumber; float balance;Savings A=1, 2000.0;,构造函数举例,class Clock public: Clock (int NewH, int NewM, int NewS);/构造函数 void SetTime(int NewH, int NewM, int NewS); void ShowTime( ); private: int Hour,Minute,Second; ;,构造函数的实现: Clock:Clock(int NewH, int NewM, int NewS) Hour=H; Minute=M; Second

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论