北邮C面向对象程序设计第三讲.ppt

上传人:sh****n 文档编号:12701937 上传时间:2020-05-14 格式:PPT 页数:47 大小:507.50KB
返回 下载 相关 举报
北邮C面向对象程序设计第三讲.ppt_第1页
第1页 / 共47页
北邮C面向对象程序设计第三讲.ppt_第2页
第2页 / 共47页
北邮C面向对象程序设计第三讲.ppt_第3页
第3页 / 共47页
点击查看更多>>
资源描述
C+面向对象程序设计,2.3.4成员函数的存储方式,系统为每个对象分配内存空间。由于同一类对象的成员函数相同,若为每个对象的成员函数都分配内存空间,会造成内存浪费。只为对象的数据成员分配内存空间。类的所有对象共享一个成员函数空间,该空间不占用对象的存储空间。,2.4对象成员的引用,“引用”就是如何访问对象中的成员。有三种方法:用对象名和成员运算符访问;用指向对象的指针访问;用对象的引用访问。,2.4.1用对象名和成员运算符访问,格式:对象名.成员名#includeusingnamespacestd;classpointprivate:intx,y;public:voidsetpoint(inta,intb)x=a;y=b;intgetx()returnx;intgety()returny;,intmain()pointop1,op2;inti,j;op1.setpoint(1,2);op2.setpoint(3,4);i=op1.getx();j=op1.gety();cout“op1i=”i“opt1j=”jendl;i=op2.getx();j=op2.gety();cout“op2i=”i“opt2j=”jt1.hour;cint1.minute;cint1.sec;coutt1.hour:t1.minute:t2.sect1.hourt1.minutet1.sec;coutt2.hourt2.minutet2.sec;coutt2.hour:t2.minute:t2.sechour;cinminute;cinsec;voidTime:show_time()couthour:minute:secarrayi;,voidArray_max:max_value()inti;max=array0;for(i=1;imax)max=arrayi;voidArray_max:show_value()coutmax=max;intmain()Array_maxarrmax;arrmax.set_value();arrmax.max_value();arrmax.show_value();return0;,2.6类的封装性和信息隐蔽,C+通过类实现封装性。在声明类时,一般将数据成员指定为私有,使它们与外界隔离,把让外界调用的成员函数指定为公有,外界通过公有函数实现对数据成员的访问。外界与对象的唯一联系就是调用公有成员函数。公有成员函数是用户使用类的公用接口。通过成员函数对数据成员进行操作称为类的实现。,信息隐蔽的好处:(1)如想修改或扩充类的功能,只需修改类中有关的数据成员和成员函数,类外的部分不用修改。(2)如果在编译时发现类中的数据读写有错,不必检查整个程序,只需检查本类中访问这些数据的成员函数。,类声明和成员函数定义的分离,在面向对象程序开发中,一般将类的声明(包括成员函数的声明)放在指定的头文件中,在程序中只要把有关的头文件包含进来即可,不必在多个程序中重复写类的声明。为了实现信息隐蔽,一般类成员函数的定义不放在头文件中,而另外放在一个文件中。,/student.h头文件,在此声明类#includeusingnamespacestd;classStudentintnum;stringname;charsex;public:voiddisplay();/student.cpp文件定义函数#include#includestudent.hvoidStudent:display()coutnumendl;coutnameendl;coutsexhour;cinminute;cinsec;voidTime:show_time()couthour:minute:secendl;intmain()Timet1;t1.set_time();t1.show_time();Timet2;t2.show_time();return0;,程序运行的情况为:10255410:25:54/输出t1的值0:0:0/输出t2的值,3.1.3带形参数的构造函数,为不同的对象赋不同的初始值,可用带参数的构造函数。构造函数首部格式:构造函数名(类型1形参1,类型2形参2,.)定义对象的格式:类名对象名(实参1,实参2,);或类名*指针变量=new类名(实参1,实参2,);,例3.2有两个长方柱,其长、宽、高分别为:(1)12,25,30;(2)15,30,21;计算它们的体积。#includeusingnamespacestd;classBoxpublic:Box(int,int,int);intvolume();private:intheight;intwidth;intlength;Box:Box(inth,intw,intlen)/构造函数height=h;width=w;length=len;,intBox:volume()/计算长方体的体积return(height*width*length);intmain()Boxbox1(12,25,30);/定义对象box1coutbox1体积=box1.volume()endl;Boxbox2(15,30,21);/定义对象box2coutbox2体积=box2.volume()endl;return0;程序运行的结果如下:box1体积=9000box2体积=9450,intmain()Box*A=newBox(12,25,30);coutvolume()volume()endl;return0;,3.1.4用参数初始化表对数据成员初始化,该方法在函数的首部实现数据成员的初始化。定义构造函数的格式:函数名(类型1形参1,类型2形参2,):成员名1(形参1),成员名2(形参2),定义对象的格式:类名对象名(实参1,实参2,);,例:Box:Box(inth,intw,intlen):height(h),width(w),length(len)定义对象:Boxbox1(12,25,30);Boxbox2(15,30,21);,3.1.5构造函数的重载,构造函数可以重载。一个类可以有多个同名构造函数,函数参数的个数、参数的类型各不相同。例3.3:在例3.2的基础上,定义两个构造函数,其中一个无参数,另一个有参数。#includeusingnamespacestd;classBoxpublic:Box();/默认构造函数Box(inth,intw,intlen):height(h),width(w),length(len)intvolume();private:intheight;intwidth;intlength;,Box:Box()height=10;width=10;length=10;intBox:volume()return(height*width*length);intmain()Boxbox1;coutbox1体积=box1.volume()endl;Boxbox2(15,30,25);coutbox2体积=box2.volume()endl;return0;,3.1.6使用默认参数值的构造函数,构造函数可为形参指定默认值,若创建对象时未给出实参,则以默认值为形参赋值。格式:函数名(类型形参1=常数,类型形参2=常数,);,例3.4:将例3.3中的构造函数改用带默认值的参数,长、宽、高的默认值都是10。#includeusingnamespacestd;classBoxpublic:Box(intw=10,inth=10,intlen=10);intvolume();private:intheight;intwidth;intlength;Box:Box(intw,inth,intlen)height=h;width=w;length=len;,intBox:volume()return(height*width*length);intmain()Boxbox1;coutbox1体积=box1.volume()endl;Boxbox2(15);coutbox2体积box2.volume()endl;Boxbox3(15,30);coutbox3体积box3.volume()endl;Boxbox4(15,30,20);coutbox4体积box4.volume()endl;return0;,程序运行结果为:box1体积=1000box2体积=1500box3体积=4500box4体积=9000,为了避免歧义,不允许同时定义不带形参的构造函数和全部形参都指定默认值的构造函数。Box();Box(inth=10,intw=10,intlen=10);同样为了避免歧义性,如定义了全部形参带默认值的构造函数后,一般不要再定义重载构造函数。反之亦然。Box(inth=10,intw=10,intlen=10);Box();Box(int,int);,3.2析构函数,析构函数与构造函数作用相反。当对象生命周期结束时,系统自动调用析构函数。执行析构函数的时机:一个函数内定义的对象,当这个函数结束时,对象应该释放,在对象释放前自动执行析构函数。static局部对象要到main函数结束或执行exit命令时才自动执行析构函数。全局对象(在函数外定义的对象),当main函数结束或执行exit命令时自动执行析构函数。用new建立的动态对象,当用delete运算符释放该对象时,自动执行析构函数。,析构函数的特征:析构函数名以符号开始后跟类名。析构函数没有数据类型、返回值、形参。一个类只有一个析构函数。如果程序员没有定义析构函数,C+编译系统会自动生成一个析构函数。,例3.5包含构造函数和析构函数的C+程序#include#includeusingnamespacestd;classStudentpublic:Student(intn,stringnam,chars)num=n;name=nam;sex=s;coutConstructorcalled.endl;Student()coutDestructorcalled.endl;,voiddisplay()coutnum:numendl;coutname:nameendl;coutsex:sexendlendl;private:intnum;stringname;charsex;intmain()Studentstud1(10010,Wang_li“,f);stud1.display();Studentstud2(10011,Zhang_fun,m);stud2.display();return0;,程序运行结果如下:Constructorcalled.num:10010name:Wang_lisex:fConstructorcalled.num:10011name:Zhang_funsex:mDestructorcalled./执行stud2的析构函数Destructorcalled./执行stud1的析构函数,3.3调用构造函数和析构函数的顺序,先构造的后析构,后构造的先析构,相当一个栈,后进先出。,调用构造函数与虚构函数的时机:在全局范围中定义的对象,在文件中的所有函数(包括主函数)执行前调用构造函数。当主函数结束或执行exit函数时,调用析构函数。局部自动对象,在建立对象时调用其构造函数。在函数结束,对象释放前调用析构函数。在函数中定义的静态局部对象,在第一次建立对象时调用构造函数。在主函数结束或调用exit函数时才调用析构函数。,
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!