版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、0,C+面向对象程序设计 山东理工大学 黄晶晶 ,1,教材,选用教材 C+面向对象程序设计 谭浩强,2,培养目标,理解和掌握C+语言的基本语法和语义; 理解面向对象的思想,掌握面向对象程序设计的方法; 逐步提高学生的编程能力和调试程序的能力; 为后面的学习打好基础。,3,课 程 简介 第一章 C+的初步知识 第二章 类和对象 第三章 再论类和对象 第四章 运算符重载 第五章 继承与派生 第六章 多态性与虚函数 第七章 输入输出流 第八章 C+工具,4,实验:共8次,每次2学时,实验一:C+运行环境、C+对C的扩充 实验二:类与对象的定义和使用 实验三:类/对象的构造和应用 实验四:运算符重载
2、实验五:继承与派生 实验六:多态性与虚函数 实验七:输入流/输出流 实验八:C+工具、综合应用 开发环境:Windows环境下的Visual C+6.0,5,学时分配,总学时:56 讲课: 40学时 上机: 16学时 课外上机:每周不少于4学时,6,参考书目(基本参考书): C+程序设计教程 杨国兴 中国水利水电出版社 2006.6 Visual C+ 教程郑阿奇 清华大学出版社 2005.7 Visual C+程序设计教程梁建武 水利水电出版社 Visual C+与面向对象程序设计教程(第二版)吕军等 高等教育出版社,7,学习方法: 1、注意各章知识点 2、理解编程特例 3、强化实践:类似实
3、验、进行小改动、注意不同程序的使用方法。,8,主要内容:,1.1 从C到+ 1.2 最简单的C+程序 1.3 C+对C的扩充 1.4 C+程序的编写与实现,第1章 C+初步知识,9,1.1 从C到C+ (计算机语言的发展),机器语言 汇编语言 高级语言 第一代:科学计算 Fortran 、 ALgol 60 第二代:表达算法 Pascal 、 C 第三代:引入抽象数据类型 Ada 第四代:面向对象 Smalltalk、Eiffel、C+、Java,10,1.1 从C到C+ C语言特点: 1、C语言是一种结构化的程序设计语言,语言本身简洁、使用灵活方便。 2、它既有高级语言的特点,又具有汇编语言
4、的特点。 3、目标程序质量高,程序执行效率高。 4、程序的可移植性好。 5、程序的语法结构不够严密,程序设计的自由度大。既是优点也是缺点。,11,1.1 从C到C+ 用C语言编写的程序是面向过程的。程序员要熟悉程序运行的每一个细节,出现软件危机。程序顺序执行,与现实世界的运行模式不一致; 因此提出了面向对象的程序设计方法。为了支持这种程序设计方法,又由于C语言早已深入人心,因此C+语言应运而生。,12,C+对C的增强,1、在面向过程的基础上对C语言功能进行扩充。 2、增加面向对象的机制。,13,1.2 简单的C+程序举例1:,#include Using namesapce std;/使用命名
5、空间 int main( ) cout“How are you! n”;/输出字符串 return 0; ,主函数,函数体开始,函数体结束,输出流,在屏幕上打印引号内的字符串,分号,一条完整语句的结束符,本程序编译执行后,在屏幕上打印出: How are you!,包含文件,注释或说明,14,#include int main( ) cout i; /从键盘上输入变量i的值 cout “i的值为:”in; return 0; ,程序举例2:从键盘上输入i的值,并输出i。,15,C+程序举例3 -求两数中的最大者,#include / 预编译命令 using namespace std; int
6、 max(int x,int y); int main() / 主函数 int a,b,c; cinab; c=max(a,b); couty) z=x; else z=y; return z; 注意:.cpp文件包含2个函数 , 主函数mian调用max函数 。,16,C+程序举例4 -包含类的C+程序,1、建立.h文件 aaa.h如下: class Student / 定义类st private : int num,score; / 类的私有的数据成员 public: void setdata() / 类的公有的成员函数 cinnumscore; void display() / 类的公有
7、的成员函数 cout“num=”numendl; cout“score=”scoreendl; ; / 类定义结束, 必须有“ ;”,17,C+程序举例4(续),2、建立.cpp文件a1.cpp如下: #include using namespace std; #include “aaa.h” / 调用头文件aaa.h Student st1,st2; / 定义变量st1、st2是Student类型变量,称为对象 int main() / 主函数 st1.setdata(); st2.setdata(); st1.display(); st2.display(); return 0; 注意:在
8、本例中,有源文件a1.cpp和头文件 aaa .h,18,小结: 在一个程序单位中,一般包括3部分: 1、 预处理命令:以符号“#”开头的行,称为编译预处理行。 “#include” 称为文件预处理命令。 “ #include ”是将文件 “iostream .h”的内容包含到新建的程序中去。 iostream.h 是C+系统定义的一个 “头文件”, iostream.h中设置了C+的输入/输出 ( I / O ) 相关环境,定义了输入流 cin 和输出流 cout 对象。,19,2、全局声明部分:在函数外的声明部分,用户自定义数据类型、程序中变量的定义,例如对类st的定义、对变量st1、st
9、2的定义。对函数的声明例如:int max(int x,int y); 3、函数:函数是程序中必须有的和最基本的组成部分。main( ) 是每一个C+程序都必须有的,称为主函数,它是程序入口。 注意1:main() 前的 int 表示主函数 main( ) 返回值为整型。花括号 括起为main()的函数体。 注意2:标准C+在main()正常执行时返回0,否则返回-1。,20,1.3 C+对C的扩充 1.3.1 C+输入/输出 1、cout 输出: 格式:cout int main() cout “您好” endl; / “endl” 与“ n”一样是控制换行。 return 0; 注意:每个
10、输出项用一个“ ”符号分隔。,21,2、 cin 标准输入 格式:cin 变量1 变量2 ; 例:使用cin进行简单的输入。 #include int main() int a,b; cin a b; cout a , b endl; return 0; ,22,1.3.2 用const定义常变量 在C语言中,宏定义如下: 1、不带参宏定义: #define PI 3.14 /定义符号常量,实际编译时只是字符置换。 2、带参宏定义: #define 宏名(参数表) 字符串 /* 字符串中包含在括弧中指定的参数 */,23,例: C语言宏定义应用 #include #define PI 3.14
11、15926 #define S(r) PI*r*r /* 引用已定义的宏名PI */ main() double a,area; a=3.6; area=S(a); printf(r=%f,area=%f,a,area); 运行结果: r=3.600000,area=40.715038 赋值语句areaS(a);经宏展开后为 area=3.1415926*a*a;,24,说明: 若: #define S(r) PI*r*r 则: area=S(a+b); /* 相当于area=PI*a+b*a+b */ 若: #define S(r) PI*(r)*(r) 则: area=S(a+b); /*
12、 相当于area=PI*(a+b)*(a+b) */ 在C语言中: 用#define 定义符号常量,实际编译时只是字符置换,易出错。,25,1.3.2 用const定义常变量 C+利用const定义常变量: const float PI=3.14; 说明:PI具有变量属性,有数据类型,占存储空间,有地址,可用指针指向它,但是程序运行时其值是不可改变的。,26,1.3.3 函数原型声明 在C+程序中,被调函数的定义可以放在主调函数之后,也可以放在主调函数之前。若被调函数的定义位于主调函数之后,则必须对被调用函数作声明。 例如: int max(int x,int y); int max(int,
13、int);,27,函数声明和定义的示例,#include float area( float ); / 调用函数前先声明 int main( ) float radius; coutradius; if (radius0) coutarea(radius )endl; return 0; float area( float r) /最后定义 return r * r* 3.14159;,28,程序可以改为如下形式:,#include float area( float r) return r * r* 3.14159; Int main( ) float radius; coutradius;
14、 if (radius0) coutarea(radius )endl; return 0; ,29,1.3.4 函数重载,什么叫重载? 运算符“”是位运算左移运算符,在C+中,又作为输出算符;运算符“*”是乘法算符,也是指针符号。这种一个标识符有多种含义的现象叫“重载”。 如果标识符为运算符,就叫“运算符重载”;如果标识符为函数名,就叫“函数重载”。 什么时候用到重载? 用于相类似而又不同的操作。例如,求多个数值的最大数,不同类型的参数,C语言要编写不同的函数: int max1(int a, int b ,int c); / 3个整型数求最大值 float max2(float a, fl
15、oat b,float c); / 3个实型数求最大值 long max3(long a, long b,long c); / 3个长整型数求最大值,30,即:C+允许在同一作用域中用同一函数名定义多个函数,函数的参数类型和个数不同,这些同名函数实现不同功能-函数重载。,而C+的做法是重载:将这三个函数名取相同的名字,程序运行时,系统会根据实际参数的不同,调用相近参数的函数:,31,#include int max(int a, int b, int c) if (ba) a=b; if (ca) a=c; return a; float max(float a, float b) if (b
16、a) a=b; return a; long max(long a, long b, long c) if (ba) a=b; if (ca) a=c; return a; ,int main( ) int a, b, c, d; float x, y, z; long m, n, p, q; cinabc; cinxy; cinmnp; d = max (a, b, c); cout “int_d = “dendl; z = max (x,y); cout “float_z = “zendl; q = max (m, n, p); cout “long_q = “qendl; return
17、0; ,main函数三次调用max函数,每次实参的个数或类型不同,系统会寻找与之匹配的函数调用。,例如1.6:求3个数最大值(整数、实数),32,#include int max(int a, int b, int c) if (ba) a=b; if (ca) a=c; return a; int max(int a,int b) if (ab) return a; else return b; ,int main( ) int a=7,b=-4,c=9; cout max(a,b,c)endl; cout max(a,b)endl; return 0; ,例如1.7:求2个数或3个整数最大
18、值,main函数2次调用max函数,每次实参的个数或类型不同,系统会寻找与之匹配的函数调用。 注意:不能出现函数名、参数个数、类型完全一致的函数,33,1.3.5 函数模板 C+函数重载允许用同一函数名定义多个函数,但是还要定义每一个函数。编码量很大。 什么时候使用模板?对于有些相同功能的函数,如果函数参数个数相同,可以用函数模板。,函数模板是定义一个通用函数,其函数类型和形参类型不确定,用虚拟类型代表。 利用函数模板定义的函数叫做模板函数。,34,定义一个模板函数的形式如下: template () . 注意1:template 和 template 等价 注意2:类型参数可以不止一个如:
19、template 注意3:模板函数只适用于函数的参数个数相同而类型不同,而且函数体相同的情况。,35,#include template T max (T a, T b, T c) / 建立函数模板时,只需要 if (ba) a=b; / 将函数类型、参数类型 int 换成 T 就行。 if (ca) a=c; / 即用虚拟的类型名T代替实际的类型 return a; int main( ) int i = 8, j = 3, k = 4, h; long m = 1, n = 2, p = 3, q; h = max ( i, j, k); q = max ( m, n, p); cout
20、“int_h = “hendl; cout “long_q = “qendl; return 0; ,示例:将上述重载示例改为函数模板。,36,结论:函数模板比函数重载更方便,但模板只适用于函数的参数个数相同而类型不同,且函数体相同的情况。不满足这种情况时,就只能使用函数重载。,37,特例: 定义一个求数值绝对值的模板函数。 #include template T max(T a) return a0?a:-a; int main() cout max(-9)= max(-9) endl; cout max(-9.666)= max(-9.666) endl; cout max(12345)=
21、 max(12345) endl; return 0; ,38,1.3.6 有默认参数的函数,背景:一般情况下,函数调用时,形参从实参取值。要求实参的个数和类型与形参相同。但有时多次调用同一函数时用的是同样的实参值。C+提供一个简单的解决办法,即给参数一默认值。 若不提供实参数,形参就用默认参数作为实参值。 示例:有一函数声明如下: float area ( float r=6.5 ); 调用area 函数时,如果不提供实参给r,r 就以默认数值 6.5 作为参数调用area: 即: area ( ); / 相当于 area (6.5 );,39,注意: 1) 当有多个参数时,如果只有部分参数
22、有默认值,则指定默认值的参数必须放在参数表的最右边,否则出错。 2)因为实参与形参的结合是从左至右顺序进行的,第一个实参必须给第一个形参,第二个实参必须给第二个形参。 3) 一个函数不能既作为重载函数,又作为默认参数函数。因为当调用函数时如果少写一实参,系统无法判断是利用重载函数还是利用默认参数函数。,40,例如函数声明如下: void area (float x1, int x2 = 1, char x3 = a); 调用1:area ( 1.2, 3, b); / 形参值全部由实参得到 调用2:area (1.2, 3); / 最后一个参数取自默认值 调用3:area (1.2 ); /
23、最后两个参数取自默认值 调用4: area ( ); / 出错,第一个形参没有实参,也没有默 认值,41,举例: 利用默认参数的函数实现求2个或3个整数的最大值,#include int max(int a,int b,int c=-32767) if (ba) a=b; if (ca) a=c; return a; void main( ) int a,b,c,mab,mabc; a=10; b=100; c=900; mab=max(a,b); couta b mabendl; mabc=max(a,b,c); couta b c mabcendl; ,42,/ 函数模板和默认参数综合举例
24、 #include template T max(T a,T b,T c=-32767,T d=-32767) if (ba) a=b; if (ca) a=c; if (da) a=d; return a; void main( ) int a,b,c,mab,mabc,mabcd,d; a=10; b=100; c=900,d=8888; mab=max(a,b); couta b mabendl; mabc=max(a,b,c); couta b c mabcendl; mabcd=max(a,b,c,d); couta b c mabcdendl; float a1,b1,c1,mab
25、1,mabc1,mabcd1,d1; a1=10.0; b1=100.9; c1=900.98,d1=8888.99; mab1=max(a1,b1); couta1 b1 mab1endl; mabc1=max(a1,b1,c1); couta1 b1 c1 mabc1endl; mabcd1=max(a1,b1,c1,d1); couta1 b1 c1 d1 mabcd1endl; ,43,1.3.7 变量的引用,1、什么叫引用?变量的引用就是变量的别名。建立引用的作用,是为一个变量另取一个名字,以便在需要的时候间接地引用该变量。 2、引用示例: #include int main( )
26、int a = 10; int 运行结果:a = 100 b= 100,44,1.3.7 变量的引用,3、如何使用引用?如有变量a ,给它另取一个别名b : int a ;int / 声明b 是一个整型变量的引用变量,并且被初始化为a 说明: 1)此处 int / 错误, 没有指定 x 代表哪个变量,46,4、将引用作为函数参数:C+之所以增加“引用”,主要是利用它作为函数参数,以扩充函数传递数据的功能。 C语言中,函数的参数传递有以下两种情况: 1)将变量名作为实参:传给形参的是变量的值,传递是单向的,函数运行时,形参发生变化,并不回传给实参。因为形参和实参不是同一个存储单元。例:,#inc
27、lude void swap ( int a, int b ) int temp; temp = a; a = b; b = temp; ,int main( ) int i=3, j=5; swap ( i, j ); couti“,”jendl; return 0; 运行结果,i, j 仍然是3,5。 没有发生交换。,47,2)传递变量的指针:传给形参的是变量的地址,形参得到一个变量的地址,即形参指针变量指向实参变量单元。函数中形参发生改变,实际上是改变实参。这种方法实际上仍然是值传递:向指针变量传递地址值。然后通过指针变量访问有关变量。“间接地”回传了改变的变量。例:,#include
28、void swap ( int *p1, int *p2 ) int temp; temp = *p1; *p1 = *p2; *p2 = temp; ,int main( ) int i=3, j=5; swap ( 运行结果,i, j 是5,3。 变量值发生交换。,48,3)传递变量的别名:将变量的引用作为函数形参,弥补了上面两种方法的不足。例: 注意:swap函数形参 swap ( i, j ); couti“,”jendl; return 0; 运行结果,i, j 是5,3。 变量值发生交换。,49,如何理解引用?我们从物理实现上来理解,引用是一个隐性指针,即引用值是引自所指向的实体。
29、这就是引用的真意。高级编程(面向应用)多用引用,低级编程(面向机器)多用指针。,50,5、对引用的说明: 1)不能建立void类型的引用。因为任何实际存在的变量都属于非void类型。如: void / t 是指向整型变量的指针变量的引用,初始化为p.,51,4)可以将引用的地址赋给指针。此时,指针指向原来变量: int a = 3;int /合法,52,1、引入原因:目的是为了解决程序中函数调用的效率问题。有些函数代码很短(行),却有高使用频率,造成处理现场的开销巨增。 这时若将函数体嵌入函数调用处,则可避免每次调用函数的开销,大大提高效率。,1.3.8 内联函数(inline functio
30、n),53,2、内联函数的定义:在声明一个函数时,加上限定词inline,该函数就成为内联函数。编译时,系统将调用此函数的地方用函数的原代码替换。即以空间代价换取时间。例如: #include / c1.15 inline int power(int x ) / 定义一个内联函数 return x*x; int main( ) cout power ( 2 ) endl; / 编译系统展开为x=2;x*x; cout power ( 1+2 ) endl; / 编译系统展开为x=1+2;x*x; return 0; 运行结果:4 9,54,3、内联函数的限制: 1)函数内不能含有循环结构或sw
31、itch结构; 2)不能含有任何静态数据及数组声明。 3)不能是递归函数。,说明: 如果内联函数内有以上问题,在VC+上编译也能通过,是因为编译器将它改成非inline的了。即我们只有建议内联的权利,是否真的实现内联还要由编译器决定。,55,标识符只能在说明它或定义它的范围内是可见的,而在该范围之外是不可见的。 每一个变量都有自己的有效范围。只能在变量的作用域内使用该变量。不能直接使用其它作用域中的变量。如果要使用其它作用域中的同名变量,必须使用“作用域运算符”,即“ : ”。,1.3.9 作用域运算符,56,作用域运算符示例: #include /c1.16 float a=1.5; int
32、 main( ) int a = 5; cout a endl; / 输出作用域为main 函数的局部变量a 的值 cout :a endl; / 输出作用域为全局的 全局变量a 的值 return 0; 运行结果:5 1.5 注意:不能用作用域运算符“:”访问函数中的局部变量。,57,局部变量和全局变量,1、局部变量 指作用域在函数级的变量。 2、全局变量 指作用域在程序级和文件级的变量。,58,#include int i=5; /外部全局变量 void func( ) cout iendl; / 输出全局变量i void main() int i=3; / 内部局部变量 func( );
33、 cout iendl; / 输出局部变量i ,局部 变量,全局变量,蓝色为文件作用域,绿色为函数作用域,59,1.3.10 字符串变量,C+提供了字符串类。利用此类可以定义字符串对象。但在文件开头必须包含string库: #include / 不能是string.h,必须用using namespace std; 1、字符串定义: string s1; / 定义字符串变量s1 string s2 = “China”; / 定义字符串变量s2并初始化,60,1.3.10 字符串变量,2、字符串赋值:可以对定义了的字符串变量进行赋值: s1 = “Hello”;s2 = s1; s3 = s1+
34、s2; / 字符串连接 3、字符串变量的输入输出: string c1;cin c1;cout =,= 来进行字符串的比较,61,5、字符串数组: C+允许直接定义字符串数组如: string name 3 = “张三”,”李四”,”王五”; 结果为: name 0 = “张三“; name 1 = “李四”; name 2 = “王五”;,62,字符串变量示例:从键盘输入3个字符串,并按字典顺序输出: #include / c1.17 #include using namespace std; int main( ) string s1,s2,s3,temp; cin s1s2s3; if ( s2s3) temp =s2; s2 = s3; s3 = temp; if ( s1s2) temp =s1; s1 = s2; s2 = temp; if ( s2s3) temp =s2; s2 = s3; s3 = temp; cout
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 作文批改评语
- 初中生创新作文写作技巧大全
- 护士职称聘用证明标准范本
- 零售行业销售人员激励方案汇编
- 八年级道德与法治下册《公民基本权利》深度教学方案
- Unit1ThinkingSkillsandReadingStrategies课件仁爱科普版七年级英语上册
- 企业绿色生产与节能减排措施
- 中学生英语阅读能力提升策略计划
- 食品工厂原料质量控制标准
- 高校课程质量评价指标体系设计
- 2026年江苏事业单位统考无锡市定向招聘退役大学生士兵8人笔试备考试题及答案解析
- 2026届广东高三一模英语试题(含答案)
- 2026年青岛卫生考试试题及答案
- 国家事业单位招聘2024中央台办所属事业单位招聘30人笔试历年参考题库典型考点附带答案详解
- 环境监测工作责任制度
- 成人反流误吸高危人群全身麻醉管理专家共识(2025版)解读课件
- 离子晶体教学课件
- 档案管理与保密工作规范
- 数据排序课件浙教版高中信息技术选修1
- GB/T 5782-2016六角头螺栓
- GB/T 5023.5-2008额定电压450/750 V及以下聚氯乙烯绝缘电缆第5部分:软电缆(软线)
评论
0/150
提交评论