【精品】成都高新西区污水处理厂运营管理服 ..49_第1页
【精品】成都高新西区污水处理厂运营管理服 ..49_第2页
【精品】成都高新西区污水处理厂运营管理服 ..49_第3页
【精品】成都高新西区污水处理厂运营管理服 ..49_第4页
【精品】成都高新西区污水处理厂运营管理服 ..49_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

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

文档简介

Object-OrientedProgramming in C+第一章 C+的初步知识,中国科大学继续教育学院 李艺,第一章 C+的初步知识第二章 类和对象第三章 再论类和对象第四章 运算符重载第五章 继承与派生第六章 多态性与虚函数第七章 输入输出流第八章 C+工具,参考教材,选用教材 C+面向对象程序设计 谭浩强参考教材 C+语言基础教程 吕凤翥编著参考教材 C+程序设计教程 钱能主编英文教材 Programming in C+(SE)高等教育出版社,学时分配,总学时:60讲课:40学时上机:20学时课外上机:每周不少于4学时,1.1C+程序结构的特点,一个示范程序 程序的组成部分 程序的书写格式,一个C+的示范程序,/*This is a simple Cpp program*/#include /文件包含void main( ) /主函数头 /主函数体 double x,y; /变量说明 cout xy ; /输入数据 double z=x+y; /定义并赋值 cout x+y= zendl ; /输出数据,任何变量都必须先说明后使用,执行结果为: Enter two float number: 3 4 x+y=7,C语言中,用#define 定义常量:#define PI 3.14159#define R a+b 它只是在预编译时进行字符置换,将标识符置换成表达式或数字。预编译后,标识符PI,R不再存在。PI,R不是变量,没有类型,不占用存储单元,很容易出错:int a=1;b=2;#define PI 3.14159#define R a+bcoutradius; if (radius0) coutarea(radius )radius; if (radius0) coutarea(radius )”是左移运算符,在C+中,有作为输出算符;而“*”是乘法算符,也是指针符号。这种一个标识符有多种含义用途的现象,旧叫“重载”(overloading)。如果标识符为运算符,就叫“运算符重载”;如果标识符为函数名,就叫“函数重载”。什么时候用到重载?用于相类似而又不同的操作。例如,求多个数值的最大数,不同类型的参数,C语言要编写不同的函数:int max1(int a, int b, int c); / 3个整形数值求最大值float max2(float a, float b); / 2个实形数值求最大值long max3(long a, long b, long c); / 3个长整形数值求最大值,而C+的做法是重载:将这三个函数名取相同的名字,程序运行时,系统会根据实际参数的不同,调用相近参数的函数:,#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 (ba) a=b; return a;long max(long a, long b, long c) if (ba) a=b; if (ca) a=c; return a; ,void 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 = “qa) a=b; / 将函数类型、参数类型 int 换成 T 就行。 if (ca) a=c; / 即用虚拟的类型名T代替实际的类型 return a; void 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 “int_h = “hendl; cout “long_q = “qendl;,类型参数可以有多个:template ,由此程序可以看到,函数模板比函数重载更方便,但模板只适用于函数的参数个数相同而类型不同,且函数体相同的情况。不满足这种情况时,就只能使用函数重载。,1.6 有默认参数的函数,背景:一般情况下,函数调用时,形参从实参那里取得值。因此要求实参的个数和类型应该与形参相同。但是,有时候,多次调用同一函数时用的是同一实参数,或者调用时还不好确定实参数。C+提供一个简单的解决办法,即给参数一默认值。这样当不提供实参数时,形参就用默认参数作为参数值。示例:有一函数声明为:float area ( float r=6.5 );调用area 函数时,如果不提供实际参数给r,r 就以默认数值 6.5 作为参数顶用area:area ( ); / 相当于 area (6.5 );注意:1) 当有多个参数时,如果只有部分参数有默认值,则指定了默认值的参数必须放在参数表的最右边,否则出错。因为实参与形参的结合是从左至右顺序进行的,第一个实参必须给第一个形参,第二个实参必须给第二个形参。,1.6 有默认参数的函数,声明:void area (float x1, int x2 = 1, char x3 = a);调用:area ( 1.2, 3, b); / 形参值全部由实参得到 area (1.2, 3); / 最后一个参数取自默认值 area (1.2 ); / 最后两个参数取自默认值 area ( ); / 出错,第一个形参没有实参,也没有默 认值2) 一个函数不能既作为重载函数,又作为默认参数函数。因为当调用函数时如果少写一实际个参数,系统无法判断是利用重载函数还是利用默认参数函数。,1.7 变量的引用(reference),什么叫引用?变量的引用就是变量的别名。建立引用的作用,是为一个变量另取一个名字,以便在需要的时候间接地引用该别名。如何使用引用?假如有一个变量a , 想给它另取一个别名b ,可以这样写:int a ;int / 声明b 是一个整形变量的引用变量,并且被初始化为a此处 & 不代表取地址,只是“引用声明符”。对一个变量声明一个引用,并不另外开辟内存空间。b和a 代表同一个变量单元。引用不是独立的变量,编译系统不给它分配存储单元。因此建立引用只有声明,没有定义,只是声明和某一个变量的关系。,1.7 变量的引用(reference),声明了一个变量的引用后,在本函数执行期间,该引用一直与代表的变量相联系,不能再作为另一个变量的别名。请看如下示例:int a, b ;int / 错误, 没有指定 x 代表哪个变量,示例:#include using namespace std;void main( ) int a = 10; int 运行结果:b = 100,1.7 变量的引用(reference),将引用作为函数参数:C+之所以增加“引用”,主要是利用它作为函数参数,以弥补函数传递参数的不方便的遗憾。也降低了编程难度。将变量名作为实参:这时传给形参的是变量的值,传递是单向的,函数运行时,形参发生变化,并不回传给实参。因为形参和实参不是同一个存储单元。请看下面示例:,1.7 变量的引用(reference),#include void swap ( int a, int b ) int temp; temp = a; a = b; b = temp;,void main( ) int i=3, j=5; swap ( i, j ); couti“,”jendl;运行结果,i, j 仍然是3,5。没有发生交换。,传递变量的指针:这时传给形参的是变量的地址,形参得到一个变量的地址,即形参指针变量指向实参变量单元。函数中形参发生改变,实际上是改变实参。这种方法实际上仍然是值传递:想指针变量传递地址值。然后通过指针变量访问有关变量。“间接地”回传了改变的变量。请看下面示例:,1.7 变量的引用(reference),#include void swap ( int *p1, int *p2 ) int temp; temp = *p1; *p1 = *p2; *p2 = temp;,void main( ) int i=3, j=5; swap ( 运行结果,i, j 是5,3。变量值发生交换。,传递变量的别名:将变量的引用作为函数形参,弥补了上面两种方法的不足。请看下面示例:注意:swap函数形参&a,&b是指定整形变量的引用作为形参,但引用谁还没定。而main函数中,用一,i, j的名调用swap,就是将i, j的名字传给引用,这样a就成立i的别名,b就成立j 的别名。,1.7 变量的引用(reference),#include void swap ( int ,void main( ) int i=3, j=5; swap ( i, j ); couti“,”jendl;运行结果,i, j 是5,3。变量值发生交换。,如何理解引用?我们从物理实现上来理解,引用是一个隐性指针,即引用值是引自所指向的实体。这就是引用的真意。高级编程(面向应用)多用引用,低级编程(面向机器)多用指针。对引用的说明:不能建立void类型的引用。因为任何实际存在的变量都属于非void类型。 void / t 是指向整形变量的指针变量的引用,初始化为p.,1.7 变量的引用(reference),可以将引用的地址赋给指针。此时,指针指向原来变量:int a = 3;int /合法,1.7 变量的引用(reference),引入原因:目的是为了解决程序中函数调用的效率问题。函数调用时需要建立栈内存环境,进行参数传递,并产生程序执行转移,则都要有时间和空间的代价。而有时一些函数代码很短(行),却有高使用频率,造成处理现场的开销巨增。这时若将函数体嵌入函数调用处,则可避免每次调用函数的开销,大大提高效率。,1.8 内联函数(inline function),1.8 内联函数(inline function),在声明一个函数时,加上限定词inline,该函数就成为内联函数。编译时,系统将调用此函数的地方用函数的原代码替换。即以空间代价换取时间。例如:#include inline int power(int x ) / 定义一个内联函数 return x*x; void main( ) cout power ( 2 ) endl; / 编译系统展开为x=2;x*x; cout power ( 1+2 ) endl; / 编译系统展开为x=1+2;x*x;运行结果:49,内联函数还有限制:函数内不能含有循环结构或switch结构;不能含有任何静态数据及数组声明。不能是递归函数。,1.8 内联函数(inline function),标识符只能在说明它或定义它的范围内是可见的,而在该范围之外是不可见的。大多数标识符的说明与定义是一致的,只有少数例外。如:函数等。范围有大有小。最大为整个程序,最小为块,中间有文件和函数。每一个变量都有自己的有效范围。我们只能在变量的作用域内使用该变量。不能直接使用其它作用域中的变量。如果要使用其它作用域中的同名变量,必须使用“作用域运算符”,即“:”。,1.9 作用域运算符,请看示例:#include float a=1.5;void main( ) int a = 5; cout a endl; / 输出作用域为main 函数的局部变量a 的值 cout :a endl; / 输出作用域为全局的 全局变量a 的值运行结果:5 1.5 注意:不能用作用域运算符“:”访问函数中的局部变量。,1.9 作用域运算符,局部变量和全局变量,1、局部变量是指作用域在函数级和块级的变量。2、全局变量是指作用域在程序级和文件级的变量。,#includeint i(5); /外部全局变量extern void func( ) cout iendl; void main() int i=3; / 内部局部变量 func( ); cout i c1;cout =,s1s2s3; if ( s2s3) temp =s2; s2 = s3

温馨提示

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

评论

0/150

提交评论