C++面向对象程序设计(第三章).ppt
《C++面向对象程序设计(第三章).ppt》由会员分享,可在线阅读,更多相关《C++面向对象程序设计(第三章).ppt(84页珍藏版)》请在课桌文档上搜索。
1、+程序设计,第三章,第3章 关于类和对象的进一步讨论,3.1构造函数 3.2析构函数 3.3调用构造函数和析构函数的顺序3.4对象数组 3.5对象指针 3.6共用数据的保护(难点)3.7对象的动态建立和释放 3.8对象的赋值和复制 3.9静态成员 3.10友元 3.11类模板,3.1构造函数,3.1.1 对象的初始化3.1.2 构造函数的作用3.1.3 带参数的构造函数3.1.4 用参数初始化表初始化数据成员3.1.5 构造函数的重载3.1.6 使用默认参数的构造函数,确定对象的初始状态,3.1.2构造函数的作用,构造函数的作用:用于为对象分配空间和进行初始化。构造函数的特点:(1)构造函数的
2、名字与它的类名必须相同;(2)它没有类型,不返回值,为public类型;(3)它可以带参数,也可以不带参数;(4)不需要写调用语句,在系统建立对象时由系统自觉调用执行。(5)如果用户没有定义构造函数,C+系统会自动生成一个空的构造函数。(6)允许为内联、重载、带缺省形参的函数。,#include using namespace std;class Time public:Time()hour=0;minute=0;sec=0;void set_time();void show_time();private:int hour;int minute;int sec;,例3.1在例2.3的基础上定义
3、构造成员函数,构造函数,int main()Time t1;/定义对象的同时调用了构造函数 t1.set_time();t1.show_time();Time t2;/定义对象的同时调用了构造函数 t2.show_time();return 0;,void Time:set_time()cinhour;cinminute;cinsec;void Time:show_time()couthour:minute:secendl;,说明,在类Time中定义了构造函数Time,它与所在的类同名。在建立对象时自动执行构造函数,该函数的作用是为对象中的各个数据成员赋初值 0。注意只有执行构造函数时才为数据
4、成员赋初值。程序运行时首先建立对象t1,并对t1中的数据成员赋初值0,然后执行t1.set_time函数,从键盘输入新值给对象t1的数据成员,再输出t1的数据成员的值。接着建立对象t2,同时对t2中的数据成员赋初值0,最后输出t2的数据成员的初值。,10 25 5410:25:54/输出t1的值 0:0:0/输出t2的值也可以在类内声明构造函数,然后在类外定义构造函数。将程序修改为:Time();然后在类外定义构造函数:Time:Time()hour=0;minute=0;sec=0;,/不带参数的构造函数,程序运行的情况为:,3.1.3 带形参数的构造函数,优点:实现不同对象的初始化。一般格
5、式:构造函数名(类型 形参1,类型 形参2,)定义对象的格式:类名 对象名(实参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;,Box:Box(int h,int w,i
6、nt len)/长方体构造函数 height=h;width=w;length=len;int Box:volume()/计算长方体的体积 return(height*width*length);,例3.2,当类中无构造函数时,编译系统自动生成一个缺省构造函数,但它不会给类的数据成员初始值。,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;,例3.2,构造函数Box有3个
7、参数,分别代表长、宽、高。在主函数中定义对象box1时,指定了实参12,25,30。然后调用成员函数计算长方体的体积。程序运行的结果如下:box1体积=9000 box2体积=9450 提醒:(1)带形参的构造函数在定义对象时必须指定实参(2)用这种方法可以实现不同对象的初始化。,说明,3.1.4用参数初始化表对数据成员初始化,构造函数的另一种数据初始化写法:利用参数初始化表的方法在函数的首部就能实现数据成员初始化。格式:函数名(类型1 形参1,类型2 形参2):成员名1(形参1),成员名2(形参2)功能:执行构造函数时,将形参1的值赋予成员1,将形参2的值赋予成员2,形参的值由定义对象时的实
8、参值决定。定义对象的格式依然是:类名 对象名(实参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构造函数的重载,例3.3:在例3.2的基础上定义两个构造函数其中一个无参数,另一个有参数。,#include using namespace std;class Box public:Box();/不带形参的构造函数为系统默认函数 Box(int h,int w,int len):h
9、eight(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()return(height*width*length);,int main()Box box1;/执行第一个构造函数 coutbox1 体积=box1.volume()endl;Box box2(15,
10、30,25);/执行第二个 构造函数 coutbox2 体积=box2.volume()endl;return 0;,说明,例子中定义了两个构造函数,一个无参数另一个带三个参数。系统根据定义对象的格式决定调用哪个构造函数。对象box1没有实参系统为它调用无参数的构造函数;对象box2带三个实参系统为它调用带形参的构造函数。,3.1.6使用默认参数值的构造函数,C+允许在构造函数里为形参指定默认值,如果创建对象时,未给出相应的实参时,系统将用形参的默认值为形参赋值。格式:函数名(类型 形参1=常数,类型 形参2=常数,);注意事项:不要同时使用重载构造函数和带默认值的构造函数。,#include
11、 using namespace std;class Box public:Box(int w=10,int h=10,int len=10);int volume();private:int height;int width;int length;,例3.4:将例3.3中的构造函数改用带默认值的参数,长、宽、高的默认值都是10。,如果在类外定义构造函数,应该在声明构造函数时指定默认参数值,在定义函数时可以不再指定默认参数值。,Box:Box(int w,int h,int len)height=h;width=w;length=len;int Box:volume()return(heigh
12、t*width*length);,int main()Box box1;coutbox1 体积=box1.volume()endl;Box box2(15);coutbox2 体积 box2.volume()endl;Box box3(15,30);coutbox3 体积 box3.volume()endl;Box box4(15,30,20);coutbox4 体积box4.volume()endl;return 0;,程序运行结果为:box1 体积=1000box2 体积=1500box3 体积=4500box4 体积=9000构造函数也可以改写成带参数初始化表的形式:Box:Box(in
13、t h,int w,int len):height(h),width(w),length(len)整个函数只需一行,简单方便。,3.2析构函数,作用:与构造函数相反,当对象的生命周期结束时,系统自动调用析构函数,收回对象占用的内存空间。析构函数的特征析构函数名以符号开始后跟类名析构函数没有数据类型、返回值、形参。由于没有形参所以析构函数不能重载。如果程序员没有定义析构函数,C+编译系统会自动生成一个析构函数。,例3.5 包含构造函数和析构函数的C+程序#include#include using namespace std;class Student public:Student(int n,
14、string nam,char s)num=n;name=nam;sex=s;coutConstructor called.endl;,Student()coutDestructor called.endl;void display()coutnum:numendl;coutname:nameendl;coutsex:sexendlendl;private:int num;string name;char sex;,int main()Student stud1(10010,Wang_li,f);stud1.display();Student stud2(10011,Zhang_fun,m);
15、stud2.display();return 0;,main函数前声明的类其作用域是全局的。程序运行结果如下:10010:Constructor called.num:10010 name:Wang_li sex:f10011:Constructor called.num:10011 name:Zhang_fun sex:m10011:Destructor called.10010:Destructor called.,3.3调用构造函数和析构函数的顺序,当定义多个对象时:先构造的后析构,后构造的先析构。,对象1 的构造函数,对象2 的构造函数,对象1 的析构函数,对象2 的析构函数,作用域概
16、念同样适用于类对象,3.4 对象数组,作为一种数据类型,可以定义类类型的数组,(就象int型的数组一样)。,例3.6 对象数组的使用方法。(长方体数组)#include using namespace std;class Box public:Box(int h=10,int w=12,int len=15):height(h),width(w),length(len)/带默认参数值和参数表 int volume();private:int height;int width;int length;,int Box:volume()return(height*width*length);int
17、main()Box a3=Box(10,12,15),Box(15,18,20),Box(16,20,26);cout“a0的体积是 a0.volume()endl;couta1的体积是 a1.volume()endl;couta2的体积是 a2.volume()endl;return 0;/每个数组元素是一个对象,运行结果如下:,a0的体积是 1800 a1的体积是 5400 a2的体积是 8320,3.5 对象指针,指针的含义是内存单元的地址,可以指向一般的变量,也可以指向对象。,3.5.1 指向对象的指针3.5.2 指向对象成员的指针3.5.3 this 指针,3.5.1指向对象的指针,
18、两种获取对象指针的方法:用取地址运算:&对象名运算的结果是该对象的起始地址,也称对象的指针。定义指针型对象变量,格式如下:类名*变量名表,class Timepublic:Time()hour=0;minute=0;sec=0;void set_time();void show_time();private:int hour;int minute;int sec;,void Time:set_time()cinhour;cinminute;cinsec;void Time:show_time()couthour:minute:“secendl;,在此基础上,有以下语句:,Time*pt;/定义
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 面向 对象 程序设计 第三
![提示](https://www.desk33.com/images/bang_tan.gif)
链接地址:https://www.desk33.com/p-236188.html