《C++面向对象程序设计》_第一章_第1页
《C++面向对象程序设计》_第一章_第2页
《C++面向对象程序设计》_第一章_第3页
《C++面向对象程序设计》_第一章_第4页
《C++面向对象程序设计》_第一章_第5页
已阅读5页,还剩64页未读 继续免费阅读

下载本文档

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

文档简介

C+面向对象程序设计,网络空间安全学院丁志芳,办公室:一号实验楼2楼E-mail:dzf_0001Tel课程安排,主要内容:面向对象基本思想标准C+语法标准C+常用类与函数上机实验(10/30学时),考核方式,考核内容书面考试+课题实践,学习方法,教学为辅、自学为主听、读、练互联网,教材,选用教材C+面向对象程序设计谭浩强,参考书目,1面向对象的理论与C+实践王燕清华大学出版社2C+编程思想(影印第二版)BruceEckel机械工业出版社3面向对象程序设计(C+语言)李爱华程磊编著清华大学出版社4C+语言程序设计郑莉董渊何江舟编著清华大学出版社,第一章C+的初步知识第二章类和对象第三章再论类和对象第四章运算符重载第五章继承与派生第六章多态性与虚函数第七章函数模板与类模板,课程章节安排,程序设计方法的发展历程,程序的目的:用于数学计算主要工作:设计求解问题的过程缺点:对于庞大、复杂的程序难以开发和维护,面向过程的方法,程序设计方法的发展历程,设计思路自顶向下、逐步求精。采用模块分解与功能抽象,自顶向下、分而治之。程序结构:按功能划分为若干个基本模块,形成一个树状结构。各模块间的关系尽可能简单,功能上相对独立;每一模块内部均是由顺序、选择和循环三种基本结构组成。其模块化实现的具体方法是使用子程序。,面向过程的方法,程序设计方法的发展历程,优点:有效地将一个较复杂的程序系统设计任务分解成许多易于控制和处理的子任务,便于开发和维护。,面向过程的方法,程序设计方法的发展历程,缺点:可重用性差、数据安全性差、难以开发大型软件和图形界面的应用软件把数据和处理数据的过程分离为相互独立的实体。当数据结构改变时,所有相关的处理过程都要进行相应的修改。每一种相对于老问题的新方法都要带来额外的开销。图形用户界面的应用程序,很难用过程来描述和实现,开发和维护也都很困难。,面向过程的方法,程序设计方法的发展历程,将数据及对数据的操作方法封装在一起,作为一个相互依存、不可分离的整体对象。对同类型对象抽象出其共性,形成类。类通过一个简单的外部接口,与外界发生关系。对象与对象之间通过消息进行通讯。,面向对象的方法,程序设计方法的发展历程,优点:程序模块间的关系更为简单,程序模块的独立性、数据的安全性就有了良好的保障。通过继承与多态性,可以大大提高程序的可重用性,使得软件的开发和维护都更为方便。,面向对象的方法,【C+语言与C语言的关系】,一个C+的示范程序,#include/文件包含usingnamespacestd;/定义命名空间intmain()/主函数头/主函数体doublex,y;/变量说明coutxy;/输入数据doublez=x+y;/定义并赋值coutx+y=z和cout是输入运算符,的定义,均包含在文件iostream中。所以在程序的开始要有#include包含语句,16,输出流对象cout输出流对象cout输出数据语句的一般格式为:cout数据1数据2数据n;floata=3.45;intb=5;charc=A;cout“a=”a“,”“b=”b“,”“c=”cendl;输出结果:a=3.45,b=5,c=A注意:(1)“”从cin输入流中抽取字符。输入流对象cin输入数据语句的一般格式为:cin变量1变量2变量n;例如:intm,n;cinmn;/表示从键盘读取数据赋给m和n注意:“”为输入操作符,“cin”是把标准输入设备(键盘)接收到的数据,存入“”后面的变量中。可以连续地输入多个变量的值,输入时多个变量值之间用空格隔开或用回车区分即可。,1.1C+的输入输出,1.指出下列输出语句哪些是合法的?cout/*;cout*/;cout/*/*/;,2.下面这段代码合法吗?为什么?#includeusingnamespacestd;intmain()intv1=1,v2=3;coutthesumofv1;andv2;isv1+v2endl;return0;,习题与思考,C语言中,用#define定义符号常量:#definePI3.14159#defineRa+b它只是在预编译时进行字符置换,将标识符置换成表达式或数字。预编译后,标识符PI,R不再存在。PI,R不是变量,没有类型,不占用存储单元,很容易出错:inta=1;b=2;#definePI3.14159#defineRa+bcout0)coutarea(radius)0)coutarea(radius)endl;/再使用return0;floatarea(floatr)/最后定义returnr*r*3.14159;,1.4函数的重载(overloading),什么叫重载?运算符“a)a=c;returna;floatmax(floata,floatb)if(ba)a=b;returna;longmax(longa,longb,longc)if(ba)a=b;if(ca)a=c;returna;,intmain()inta,b,c,d;floatx,y,z;longm,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=c;/即用虚拟的类型名T代替实际的类型returna;intmain()inti=8,j=3,k=4,h;longm=1,n=2,p=3,q;h=max(i,j,k);q=max(m,n,p);cout“int_h=“hendl;cout“long_q=“qendl;return0;,类型参数可以有多个:template,由此程序可以看到,函数模板比函数重载更方便,但模板只适用于函数的参数个数相同而类型不同,且函数体相同的情况。不满足这种情况时,就只能使用函数重载。,注意,1.6有默认参数的函数,背景:一般情况下,函数调用时,形参从实参那里取得值。因此要求实参的个数和类型应该与形参相同。但是,有时候,多次调用同一函数时用的是同一实参数,或者调用时还不好确定实参数。C+提供一个简单的解决办法,即给参数一默认值。这样当不提供实参时,形参就用默认参数作为参数值。例:有一函数声明为:floatarea(floatr=6.5);调用area函数时,如果不提供实际参数给r,r就以默认数值6.5作为参数调用area:area();/相当于area(6.5);,在函数原型中,所有取缺省值的参数都必须出现在不缺省值的参数的右边。即默认形参值必须从右向左顺序声明,并且在默认形参值的右面不能有非默认形参值的参数。例如:intfun(inti,intj=5,intk);/错误intfun(inti,intk,intj=5);/正确intadd1(intx,inty=5,intz=6);intadd1(intx=1,inty=5,intz);intadd1(intx=1,inty,intz=6);,默认形参值的说明次序,默认参数的函数调用,在函数调用时,实际参数提供的顺序应该是从左到右依次提供,实际参数的最少个数应等于不具有默认参数值的形式参数个数声明:voidarea(floatx1,intx2=1,charx3=a);调用:area(1.2,3,b);/形参值全部由实参得到area(1.2,3);/最后一个参数取自默认值area(1.2);/最后两个参数取自默认值area();/出错,第一个形参没有实参,也没有默认值,默认参数的函数调用,若某个参数省略,则其后的参数皆应省略而采用缺省值。不允许某个参数省略后,再给其后的参数指定参数值。声明:voidarea(floatx1,intx2=1,charx3=a);调用:area(1.2,c);,默认形参值与函数的调用位置,调用出现在函数体实现之前时,默认形参值必须在函数原形中给出;而当调用出现在函数体实现之后时,默认形参值需在函数实现时给出。例:,intadd(intx=5,inty=6);intmain()add();/调用在实现前intadd(intx,inty)returnx+y;,intadd(intx=5,inty=6)returnx+y;intmain()add();/调用在实现后,注意:,一个函数不能既作为重载函数,又作为默认参数函数。因为当调用函数时如果少写一实际个参数,系统无法判断是利用重载函数还是利用默认参数函数。如:intmax(inta,intb,intc=100);intmax(inta,intb);调用:max(2,4);,1.7变量的引用(reference),引用(Reference)的概念及使用引用用来为变量起别名,引用的作用是为一个变量另取一个名字,以便在需要的时候间接地引用该别名.它主要用作函数参数以及作为函数的返回值类型C+是通过引用运算符,1.7变量的引用(reference),声明了一个变量的引用后,在本函数执行期间,该引用一直与代表的变量相联系,不能再作为另一个变量的别名。请看如下示例:inta,b;int/错误,没有指定x代表哪个变量,例:#includeusingnamespacestd;intmain()inta=10;int,1.7变量的引用(reference),运行结果:b=100,将引用作为函数参数:C+之所以增加“引用”,主要是利用它作为函数参数,以弥补函数传递参数的不方便的遗憾。也降低了编程难度。将变量名作为实参:这时传给形参的是变量的值,传递是单向的,函数运行时,形参发生变化,并不回传给实参。因为形参和实参不是同一个存储单元。请看下面例子:,1.7变量的引用(reference),1.7变量的引用(reference),#includevoidswap(inta,intb)intt;t=a;a=b;b=t;,intmain()intx=5,y=10;swap(x,y);coutx“,”yendl;return0;运行结果,x,y仍然是5,10没有发生交换。,传递变量的指针:这时传给形参的是变量的地址,形参得到一个变量的地址,即形参指针变量指向实参变量单元。函数中形参发生改变,实际上是改变实参。这种方法实际上仍然是值传递:向一个指针变量传递一个地址值。然后通过指针变量访问有关变量。“间接地”回传了改变的变量。请看下面例子:,1.7变量的引用(reference),1.7变量的引用(reference),#includevoidswap(int*p1,int*p2)intt;t=*p1;*p1=*p2;*p2=t;,voidmain()intx=5,y=10;swap(运行结果,x,y是10,5变量值发生交换。,传递变量的别名:将变量的引用作为函数形参,弥补了上面两种方法的不足。请看下面例子:,1.7变量的引用(reference),#includevoidswap(int,Intmain()intx=5,y=10;swap(x,y);coutx“,”yendl;return0;运行结果,x,y是10,5变量值发生交换。,Swap(x,y);,47,48,1.7变量的引用(reference),引用可以作为返回类型引用返回函数的原型声明形式:类型名,#includeusingnamespacestd;int,intmain()int,对引用的说明:不能建立void类型的引用。因为任何实际存在的变量都属于非void类型。void/t是指向整形变量的指针变量的引用,初始化为p.,1.7变量的引用(reference),可以将引用的地址赋给指针。此时,指针指向原来变量:inta=3;int/合法,1.7变量的引用(reference),引入原因:目的是为了解决程序中函数调用的效率问题。函数调用时需要时间和空间的代价。,1.8内联函数(inlinefunction),main()statement;fun1();statement;,fun1()statement;fun2();statement;return;,fun2()statement;return;,保存返回地址及当前现场,恢复函数main的现场,取得返回地址,保存返回地址及当前现场,恢复函数fun1的现场,取得返回地址,函数调用的执行过程,而有时一些函数代码很短(行),却有高使用频率,造成处理现场的开销巨增。这时若将函数体嵌入函数调用处,则可避免每次调用函数的开销,大大提高效率。,1.8内联函数(inlinefunction),在声明一个函数时,加上限定词inline,该函数就成为内联函数。编译时,系统将调用此函数的地方用函数的原代码替换即以空间代价换取时间。例如:#includeinlineintpower(intx)/定义一个内联函数returnx*x;voidmain()coutpower(2)endl;/编译系统展开为x=2;x*x;coutpower(1+2)endl;/编译系统展开为x=1+2;x*x;运行结果:49,内联函数还有限制:内联函数内不能含有循环结构或switch结构;内联函数不能含有任何静态数据及数组声明。内联函数不能是递归函数。类说明体定义的函数都是内联函数,1.8内联函数(inlinefunction),1.9作用域运算符,每一个变量都有其有效的作用域,只能在变量的作用域内使用该变量,不能直接使用其他作用域中的变量。如果要使用其它作用域中的同名变量,必须使用“作用域运算符”,即“:”。,例如:#includeusingnamespacestd;floata=13.5;intmain()inta=5;coutaendl;return0;,#includeusingnamespacestd;floata=13.5;intmain()inta=5;coutaendl;cout:ac1;cout=、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;couts3endl;return0;,1.11动态分配内存new/回收内存delete,new和delete,单目运算符new用于内存分配语法形式为:指针变量=new类型名;,delete用于释放new分配的存储空间语法形式为:delete指针变量;,1.11动态分配内存new/回收内存delete,#includeusingnamespacestd;intmain()int*p;p=newint;/分配了一块存放整型数据的内存空间,p指向该内存块*p=10;cout*p;deletep;return0;,1.11动态分配内存new/回收内存delete,new和delete,单目运算符使用new为数组动态分配内存语法形式为:指针变量=new类型名下标表达式;如:int*p2=newint4;,delete释放动态分配的数组存储区语法形式为:delete指针变量;如:deletep2;,1.11动态分配内存new/回收内存delete,new和delete,单目运算符new可为简单变量分配内存空间的同时进行初始化语法形式为:指针变量=new类型名(初始值);如:int*p=newint(99);float*p4=newfloat(3.14159);/动态分配一块存放实型数据的内存空间,并指定该实数的初值为3.14159,返回一个指向实型数据的指针,说明:new可自动计算所要分配内存的大小,而不必使用sizeof()计算所需要的字节数;new能够自动返回正确的指针类型可用new将分配的对象初始化new和delete可被重载用new分配的空间,使用过后要用delet

温馨提示

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

评论

0/150

提交评论