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

上传人:小飞机 文档编号:6246225 上传时间:2023-10-10 格式:PPT 页数:47 大小:390KB
返回 下载 相关 举报
北邮C面向对象程序设计第三讲.ppt_第1页
第1页 / 共47页
北邮C面向对象程序设计第三讲.ppt_第2页
第2页 / 共47页
北邮C面向对象程序设计第三讲.ppt_第3页
第3页 / 共47页
北邮C面向对象程序设计第三讲.ppt_第4页
第4页 / 共47页
北邮C面向对象程序设计第三讲.ppt_第5页
第5页 / 共47页
点击查看更多>>
资源描述

《北邮C面向对象程序设计第三讲.ppt》由会员分享,可在线阅读,更多相关《北邮C面向对象程序设计第三讲.ppt(47页珍藏版)》请在三一办公上搜索。

1、C+面向对象程序设计,2.3.4 成员函数的存储方式,系统为每个对象分配内存空间。由于同一类对象的成员函数相同,若为每个对象的成员函数都分配内存空间,会造成内存浪费。只为对象的数据成员分配内存空间。类的所有对象共享一个成员函数空间,该空间不占用对象的存储空间。,2.4 对象成员的引用,“引用”就是如何访问对象中的成员。有三种方法:用对象名和成员运算符访问;用指向对象的指针访问;用对象的引用访问。,2.4.1 用对象名和成员运算符访问,格式:对象名.成员名#include using namespace std;class point private:int x,y;public:void se

2、tpoint(int a,int b)x=a;y=b;int getx()return x;int gety()return y;,int main()point op1,op2;int i,j;op1.setpoint(1,2);op2.setpoint(3,4);i=op1.getx();j=op1.gety();cout“op1 i=”i“opt1 j=”jendl;i=op2.getx();j=op2.gety();cout“op2 i=”i“opt2 j=”jendl;,2.4.2 用指向对象的指针访问,可以通过指针访问对象中的成员class Time public:int hour

3、;int minute;Time t,*p;p=,2.5 类和对象的应用举例,例 2.1 简单的例子#include using namespace std;class Time public:int hour;int minute;int sec;int main()Time t1;cint1.hour;cint1.minute;cint1.sec;coutt1.hour:t1.minute:t2.secendl;,例2.1 引用多个对象的成员(1)程序(a)#include using namespace std;class Time public:int hour;int minute;

4、int sec;int main()Time t1;cint1.hour t1.minutet1.sec;coutt2.hourt2.minutet2.sec;coutt2.hour:t2.minute:t2.secendl;return 0;,(2)程序(b)#include using namespace std;class Time public:int hour;int minute;int sec;int main()void set_time(Time,void set_time(Time,(2)程序(c)#include using namespace std;class Tim

5、e public:int hour;int minute;int sec;int main()void set_time(Time,void set_time(Time,例2.3 用成员函数处理例2.2中的程序#include using namespace std;class Time public:void set_time();void show_time();private:int hour;int minute;int sec;,int main()Time t1;t1.set_time();t1.show_time();Time t2;t2.set_time();t2.show_t

6、ime();return 0;void Time:set_time()cinhour;cinminute;cinsec;void Time:show_time()couthour:minute:secendl;,例2.4 在整型数组中找最大值#include using namespace std;class Array_max public:void set_value();void max_value();void show_value();private:int array10;int max;void Array_max:set_value()int i;for(i=0;iarrayi

7、;,void Array_max:max_value()int i;max=array0;for(i=1;imax)max=arrayi;void Array_max:show_value()coutmax=max;int main()Array_max arrmax;arrmax.set_value();arrmax.max_value();arrmax.show_value();return 0;,2.6 类的封装性和信息隐蔽,C+通过类实现封装性。在声明类时,一般将数据成员指定为私有,使它们与外界隔离,把让外界调用的成员函数指定为公有,外界通过公有函数实现对数据成员的访问。外界与对象的唯

8、一联系就是调用公有成员函数。公有成员函数是用户使用类的公用接口。通过成员函数对数据成员进行操作称为类的实现。,信息隐蔽的好处:(1)如想修改或扩充类的功能,只需修改类中有关的数据成员和成员函数,类外的部分不用修改。(2)如果在编译时发现类中的数据读写有错,不必检查整个程序,只需检查本类中访问这些数据的成员函数。,类声明和成员函数定义的分离,在面向对象程序开发中,一般将类的声明(包括成员函数的声明)放在指定的头文件中,在程序中只要把有关的头文件包含进来即可,不必在多个程序中重复写类的声明。为了实现信息隐蔽,一般类成员函数的定义不放在头文件中,而另外放在一个文件中。,/student.h 头文件,

9、在此声明类#include using namespace std;class Student int num;string name;char sex;public:void display();/student.cpp 文件定义函数#include#include student.h void Student:display()cout num endl;cout name endl;cout sex endl;,/main.cpp 定义主函数#include#include student.h using namespace std;int main()Student stud;stud

10、.display();return 0;,作业题目(10月11日提交):68页 第5题和第6题。5、将本章的例2.4改写为一个多文件的程序:(1)将类定义放到头文件arraymax.h中;(2)将成员函数定义放在源文件arraymax.cpp中;(3)主函数放在源文件file1.cpp中。6、求3个长方体的体积,编写一个基于对象的程序。数据成员包括length(长)、width(宽)、height(高)。要用成员函数实现以下功能:(1)由键盘分别输入3个长方体的长、宽、高;(2)计算长方体的体积;(3)输出3个长方体的体积。,第3章 类和对象的进一步讨论,3.1 构造函数,如果定义一个变量,在

11、使用这个变量前要对其赋初始值,否则其内的值不定。对象作为变量,也需要对其中的数据成员赋初始值。这通过构造函数来实现。构造函数是一种特殊的成员函数,不需要调用,而是在创建对象时自动执行。,构造函数属于某一个类,可由系统自动生成,也可以由程序员编写。构造函数名必须与类名同名。构造函数没有类型,不返回值。构造函数可以带参数,也可以不带参数。构造函数可以写在类内部,也可以写在类外部。构造函数即使被声明为公有函数,也不能被显示地调用。,例3.1在例2.3的基础上定义构造成员函数#include using namespace std;class Time public:Time()hour=0;minu

12、te=0;sec=0;void set_time();void show_time();private:int hour;int minute;int sec;,void Time:set_time()cin hour;cin minute;cin sec;void Time:show_time()cout hour:minute:secendl;int main()Time t1;t1.set_time();t1.show_time();Time t2;t2.show_time();return 0;,程序运行的情况为:10 25 54 10:25:54/输出t1的值 0:0:0/输出t2的

13、值,3.1.3 带形参数的构造函数,为不同的对象赋不同的初始值,可用带参数的构造函数。构造函数首部格式:构造函数名(类型1 形参1,类型2 形参2,.)定义对象的格式:类名 对象名(实参1,实参2,);或类名*指针变量=new 类名(实参1,实参2,);,例 3.2 有两个长方柱,其长、宽、高分别为:(1)12,25,30;(2)15,30,21;计算它们的体积。#include using namespace std;class Box public:Box(int,int,int);int volume();private:int height;int width;int length;B

14、ox:Box(int h,int w,int len)/构造函数 height=h;width=w;length=len;,int Box:volume()/计算长方体的体积 return(height*width*length);int main()Box box1(12,25,30);/定义对象box1 cout box1体积=box1.volume()endl;Box box2(15,30,21);/定义对象box2 cout box2体积=box2.volume()endl;return 0;程序运行的结果如下:box1体积=9000box2体积=9450,int main()Box*

15、A=new Box(12,25,30);cout volume()volume()endl;return 0;,3.1.4 用参数初始化表对数据成员初始化,该方法在函数的首部实现数据成员的初始化。定义构造函数的格式:函数名(类型1 形参1,类型2 形参2,):成员名1(形参1),成员名2(形参2),定义对象的格式:类名 对象名(实参1,实参2,);,例:Box:Box(int h,int w,int len):height(h),width(w),length(len)定义对象:Box box1(12,25,30);Box box2(15,30,21);,3.1.5 构造函数的重载,构造函数可

16、以重载。一个类可以有多个同名构造函数,函数参数的个数、参数的类型各不相同。例3.3:在例3.2的基础上,定义两个构造函数,其中一个无参数,另一个有参数。#include using namespace std;class Box public:Box();/默认构造函数 Box(int h,int w,int len):height(h),width(w),length(len)int volume();private:int height;int width;int length;,Box:Box()height=10;width=10;length=10;int Box:volume()r

17、eturn(height*width*length);int main()Box box1;coutbox1 体积=box1.volume()endl;Box box2(15,30,25);coutbox2 体积=box2.volume()endl;return 0;,3.1.6 使用默认参数值的构造函数,构造函数可为形参指定默认值,若创建对象时未给出实参,则以默认值为形参赋值。格式:函数名(类型 形参1=常数,类型 形参2=常数,);,例3.4:将例3.3中的构造函数改用带默认值的参数,长、宽、高的默认值都是10。#include using namespace std;class Box

18、public:Box(int w=10,int h=10,int len=10);int volume();private:int height;int width;int length;Box:Box(int w,int h,int len)height=h;width=w;length=len;,int Box:volume()return(height*width*length);int main()Box box1;coutbox1 体积=box1.volume()endl;Box box2(15);coutbox2 体积 box2.volume()endl;Box box3(15,3

19、0);coutbox3 体积 box3.volume()endl;Box box4(15,30,20);coutbox4 体积box4.volume()endl;return 0;,程序运行结果为:box1 体积=1000box2 体积=1500box3 体积=4500box4 体积=9000,为了避免歧义,不允许同时定义不带形参的构造函数和全部形参都指定默认值的构造函数。Box();Box(int h=10,int w=10,int len=10);同样为了避免歧义性,如定义了全部形参带默认值的构造函数后,一般不要再定义重载构造函数。反之亦然。Box(int h=10,int w=10,in

20、t len=10);Box();Box(int,int);,3.2 析构函数,析构函数与构造函数作用相反。当对象生命周期结束时,系统自动调用析构函数。执行析构函数的时机:一个函数内定义的对象,当这个函数结束时,对象应该释放,在对象释放前自动执行析构函数。static局部对象要到main函数结束或执行exit命令时才自动执行析构函数。全局对象(在函数外定义的对象),当main函数结束或执行exit命令时自动执行析构函数。用new建立的动态对象,当用delete运算符释放该对象时,自动执行析构函数。,析构函数的特征:析构函数名以符号开始后跟类名。析构函数没有数据类型、返回值、形参。一个类只有一个析

21、构函数。如果程序员没有定义析构函数,C+编译系统会自动生成一个析构函数。,例3.5 包含构造函数和析构函数的C+程序#include#include using namespace std;class Student public:Student(int n,string nam,char s)num=n;name=nam;sex=s;coutConstructor called.endl;Student()coutDestructor called.endl;,void display()coutnum:numendl;coutname:nameendl;coutsex:sexendlend

22、l;private:int num;string name;char sex;int main()Student stud1(10010,Wang_li“,f);stud1.display();Student stud2(10011,Zhang_fun,m);stud2.display();return 0;,程序运行结果如下:Constructor called.num:10010name:Wang_lisex:fConstructor called.num:10011name:Zhang_funsex:mDestructor called./执行stud2的析构函数Destructor called./执行stud1的析构函数,3.3 调用构造函数和析构函数的顺序,先构造的后析构,后构造的先析构,相当一个栈,后进先出。,调用构造函数与虚构函数的时机:在全局范围中定义的对象,在文件中的所有函数(包括主函数)执行前调用构造函数。当主函数结束或执行 exit 函数时,调用析构函数。局部自动对象,在建立对象时调用其构造函数。在函数结束,对象释放前调用析构函数。在函数中定义的静态局部对象,在第一次建立对象时调用构造函数。在主函数结束或调用 exit 函数时才调用析构函数。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号