《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 用参数初始
2、化表初始化数据成员 3.1.5 构造函数的重载 3.1.6 使用默认参数的构造函数确定对象的初始状态确定对象的初始状态3.1.2构造函数的作用构造函数的作用 构造函数的作用:构造函数的作用:p用于为对象分配空间和进行初始化。构造函数的特点:构造函数的特点:p(1)构造函数的名字与它的类名必须相同;p(2)它没有类型,不返回值,为public类型;p(3)它可以带参数,也可以不带参数;p(4)不需要写调用语句,在系统建立对象时由系统自觉调用执行。p(5)如果用户没有定义构造函数,C+系统会自动生成一个空的构造函数。p(6)允许为内联、重载、带缺省形参的函数。#include using name
3、space 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的基础上定义构造成员函数构造函数构造函数int main() Time t1; /定义对象的同时调用了构造函数定义对象的同时调用了构造函数 t1.set_time(); t1.show_time(); Time t2; /定义对象的同时调用了构造函数定义对象的同时调用了构造函数 t2.show_time()
4、; return 0; void Time:set_time()cinhour; cinminute; cinsec;void Time:show_time() couthour:minute:secendl; 说明说明在类Time中定义了构造函数Time,它与所在的类同名。在建立对象时自动执行构造函数,该函数的作用是为对象中的各个数据成员赋初值 0。 注意只有执行构造函数时才为数据成员赋初值。程序运行时首先建立对象t1,并对t1中的数据成员赋初值0,然后执行t1.set_time函数,从键盘输入新值给对象t1的数据成员,再输出t1的数据成员的值。接着建立对象t2,同时对t2中的数据成员赋初值
5、0,最后输出t2的数据成员的初值。10 25 5410:25:54 / 输出输出t1的值的值 0: 0: 0 / 输出输出t2的值的值也可以在类内声明构造函数,然后在类外定义构造函数。也可以在类内声明构造函数,然后在类外定义构造函数。将程序修改为:将程序修改为:Time();然后在类外定义构造函数:Time:Time() hour=0; minute=0; sec=0;/不带参数的构造函数不带参数的构造函数程序运行的情况为:程序运行的情况为:3.1.3 带形参数的构造函数带形参数的构造函数 优点:优点: 实现不同对象的初始化。 一般格式:一般格式:构造函数名(类型 形参1,类型 形参2,)定义
6、对象的格式:定义对象的格式:类名 对象名(实参1,实参2,);例例3.2有两个长方柱,其长、宽、高分别为:(1)12,25,30(2)15,30,21编写程序,在类中用带参数的构造函数,计算它们的体积。分析:分析:可以在类中定义一个计算长方体体积的成员函数计算对象的体积。p#include pusing namespace std;pclass Boxp public:p Box(int,int,int); /带形参的构造函数带形参的构造函数p int volume();p private:p int height;p int width;p int length;p ;pBox:Box(in
7、t h,int w,int len) / 长方体长方体构造函数构造函数p height=h;p width=w;p length=len;p pint Box:volume() / 计算长方体的体积计算长方体的体积p return(height*width*length);p 例例3.2当类中无构造函数时,编译系当类中无构造函数时,编译系统自动生成一个缺省构造函数,统自动生成一个缺省构造函数,但它不会给类的数据成员初始值。但它不会给类的数据成员初始值。pint main()p p Box box1(12,25,30); / 定义对象定义对象box1p cout box1体积= box1.vol
8、ume() endl;p Box box2(15,30,21); / 定义对象定义对象box2p cout box2体积= box2.volume()endl;p return 0;p 例例3.2构造函数Box有3个参数,分别代表长、宽、高。在主函数中定义对象box1时,指定了实参12,25,30。然后调用成员函数计算长方体的体积。程序运行的结果如下: box1体积= 9000 box2体积= 9450 提醒:(1)带形参的构造函数在定义对象时必须指定实参(2)用这种方法可以实现不同对象的初始化。说明说明3.1.4用参数初始化表对数据成员初始化用参数初始化表对数据成员初始化 p构造函数的另一种
9、数据初始化写法:构造函数的另一种数据初始化写法:p利用参数初始化表的方法在函数的首部就能实现数据成员初始化。p格式:格式:p函数名函数名(类型类型1 形参形参1,类型,类型2 形参形参2):成员名成员名1(形参形参1),成员名成员名2(形参形参2) p功能:功能:p执行构造函数时,将形参1的值赋予成员1,将形参2的值赋予成员2,形参的值由定义对象时的实参值决定。p定义对象的格式依然是:定义对象的格式依然是:类名类名 对象名对象名( 实参实参1,实参,实参2);例:定义带形参初始化表的构造函数例:定义带形参初始化表的构造函数Box:Box( int h, int w, int len): hei
10、ght ( 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): height(h), width(w), length(len) int volume(); priva
11、te: int height; int width; int length; ;这是什么这是什么?构造函数也可以重载构造函数也可以重载。一个类可以有多个同名构造函数,一个类可以有多个同名构造函数,函数参数的个数、参数的类型各不函数参数的个数、参数的类型各不相同相同定义对象是只执行一个构造函数定义对象是只执行一个构造函数Box:Box() height=10; width=10; length=10; int Box:volume() return(height*width*length); pint main()p p Box box1; /执行第一个构造函数执行第一个构造函数 p coutb
12、ox1 体积= box1.volume()endl;p Box box2(15,30,25); /执行第二个执行第二个 构造函数构造函数 p coutbox2 体积= box2.volume()endl;p return 0;p 说明说明例子中定义了两个构造函数,一个无参数另一个带三个参数。系统根据定义对象的格式决定调用哪个构造函数。对象box1没有实参系统为它调用无参数的构造函数;对象box2带三个实参系统为它调用带形参的构造函数。3.1.6使用默认参数值的构造函数使用默认参数值的构造函数 C+允许在构造函数里为形参指定默认值,如果创建对象时,未给出相应的实参时,系统将用形参的默认值为形参赋
13、值。格式:格式:p函数名(类型 形参1=常数,类型 形参2=常数,);注意事项:注意事项:p不要同时使用重载构造函数和带默认值的构造函不要同时使用重载构造函数和带默认值的构造函数。数。#include 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中的构造函数改用带默认中的构造函数改用带默认值的参数,长、宽、高的默认值都是值的参数,长、宽、高的默认值都
14、是10。如果在类外定义构造函数,应该在如果在类外定义构造函数,应该在声声明构造函数时指定默认参数值明构造函数时指定默认参数值,在定,在定义函数时可以不再指定默认参数值。义函数时可以不再指定默认参数值。pBox:Box(int w, int h, int len)p height=h;p width=w;p length=len;p pint Box:volume()p return(height*width*length);p p pint main()p p Box box1;p coutbox1 体积= box1.volume()endl;p Box box2(15);p coutbox2
15、 体积 box2.volume()endl;p Box box3(15,30);p coutbox3 体积 box3.volume()endl;p Box box4(15,30,20);p coutbox4 体积box4.volume()endl;p return 0;p 程序运行结果为:程序运行结果为:box1 体积=1000box2 体积=1500box3 体积=4500box4 体积=9000构造函数也可以改写成带参数初始化表的形式: Box:Box( int h, int w, int len): height ( h),width(w), length( len ) 整个函数只需一行
16、,简单方便。整个函数只需一行,简单方便。3.2析构函数析构函数 p作用:作用:与构造函数相反,当对象的生命周期结束时,系统自动调用析构函数,收回对象占用的内存空间。p析构函数的特征析构函数的特征析构函数名以符号开始后跟类名析构函数没有数据类型、返回值、形参。由于没有形参没有形参所以析构函数不能重载不能重载。如果程序员没有定义析构函数,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:sexendlendl; private: int num; stri