第9章类和对象的进一步讨论

上传人:飞*** 文档编号:24429403 上传时间:2017-12-05 格式:PPT 页数:114 大小:1.16MB
返回 下载 相关 举报
第9章类和对象的进一步讨论_第1页
第1页 / 共114页
第9章类和对象的进一步讨论_第2页
第2页 / 共114页
第9章类和对象的进一步讨论_第3页
第3页 / 共114页
第9章类和对象的进一步讨论_第4页
第4页 / 共114页
第9章类和对象的进一步讨论_第5页
第5页 / 共114页
点击查看更多>>
资源描述

《第9章类和对象的进一步讨论》由会员分享,可在线阅读,更多相关《第9章类和对象的进一步讨论(114页珍藏版)》请在金锄头文库上搜索。

1、2017/12/5,1,第9章 关于类和对象的进一步讨论,9.1 构造函数9.2 析构函数9.3 调用构造函数和析构函数的顺序9.4 对象数组9.5 对象指针9.6 共用数据的保护9.7 对象的动态建立和释放9.8 对象的赋值和复制9.9 静态成员9.10 友元9.11 类模板,2017/12/5,2,如果一个类中所有的成员都是公用的,则可以在定义对象时对数据成员进行初始化。如class Timepublic: /声明为公用成员 int hour; int minute; int sec;Time t1=14,56,30; /将t1初始化为14:56:30,9.1 构造函数 9.1.1 对象的

2、初始化,2017/12/5,3,注意: 类的数据成员是不能在声明类时初始化的。 如果数据成员是私有的,或者类中有private或protected的成员,就不能在定义对象时对数据成员进行初始化。,class Timepublic: /声明为公用成员 int hour=0; int minute=0; int sec=0;,(),private:,Time t1=14,56,30;,2017/12/5,4,构造函数是一种特殊的成员函数,在建立对象时自动执行。构造函数的名字必须与类名同名构造函数不具有任何类型无返回值构造函数的功能由用户定义,用户根据初始化的要求设计函数体和函数参数。,9.1.2

3、构造函数的作用,2017/12/5,5,例9.1 在例8.3基础上定义构造成员函数。#include using namespace std;class Timepublic:Time( ) hour=0; minute=0;sec=0; /构造函数不具有任何类型,无返回值void set_time( ); /函数声明void show_time( ); /函数声明private:int hour; int minute; int sec; /私有数据成员;,函数名与类名相同,给数据成员赋初值,2017/12/5,6,void Timeset_time( ) cinhour;cinminute

4、;cinsec;void Timeshow_time( ) couthour:minute:secendl;int main( )Time t1; /建立对象t1,同时调用构造函数t1.set_time( ); t1.show_time( ); Time t2; /建立对象t2,同时调用构造函数t2.show_time( ); /显示t2的数据成员的值return 0;,运行结果:12 30 512:30:50:0:0,2017/12/5,7,构造函数也可以在类内对构造函数进行声明而在类外定义构造函数。将上例改为: Time( ); /在类内对构造函数进行声明在类外定义构造函数:TimeTim

5、e( ) / 在类外要加上类名和域限定符“”hour=0; minute=0; sec=0;,2017/12/5,8,说明: (1) 在类对象进入其作用域时调用构造函数。(2) 构造函数没有返回值,因此也不需要在定义构造函数时声明类型。(3) 构造函数不需用户调用,也不能被用户调用。(4) 在构造函数的函数体中不仅可以对数据成员赋初值,而且可以包含其他语句。 (5) 如果用户自己没有定义构造函数,则C+系统会自动生成一个构造函数,只是这个构造函数的函数体是空的,也没有参数,不执行初始化操作。,2017/12/5,9,构造函数首部的一般格式为:构造函数名(类型 1 形参1,类型2 形参2,)说明

6、: 用户是不能调用构造函数的,因此无法采用常规的调用函数的方法给出实参。实参是在定义对象时给出的。定义对象的一般格式为: 类名 对象名(实参1,实参2,);,9.1.3 带参数的构造函数,2017/12/5,10,例9.2 有两个长方柱,其长、宽、高分别为: (1)12,20,25;(2)10,14,20。求它们的体积。#include using namespace std;class Boxpublic:Box(int,int,int); /声明带参数的构造函数int volume( ); /声明计算体积的函数 private:int height;int width;int length

7、;,BoxBox(int h,int w,int len) /在类外定义带参数的构造函数height=h;width=w;length=len;,2017/12/5,11,int Boxvolume( ) /定义计算体积的函数 return(height*width*length);int main( )Box box1(12,25,30); cout“The volume of box1 is “box1.volume( )endl;Box box2(15,30,21); cout“The volume of box2 is “box2.volume( )endl;return 0;程序运行

8、结果如下: The volume of box1 is 9000The volume of box2 is 9450,结论: (1) 带参数的构造函数中的形参,其对应的实参在定义对象时给定。(2) 用这种方法可以方便地实现对不同的对象进行不同的初始化。,2017/12/5,12,在函数首部实现对数据成员的初始化。例如例9.2中定义构造函数可以改用以下形式: BoxBox(int h,int w,int len):height(h),width(w),length(len) 优点:写法方便、简练,尤其当需要初始化的数据成员较多时更显其优越性。甚至可以直接在类体中(而不是在类外)定义构造函数。,9

9、.1.4 用参数初始化表对数据成员初始化,2017/12/5,13,在一个类中可以定义多个构造函数,以便对类对象提供不同的初始化的方法,供用户选用。构造函数的重载的特点:这些构造函数具有相同的名字而参数的个数或参数的类型不相同,9.1.5 构造函数的重载,2017/12/5,14,#include using namespace std;class Boxpublic:Box( ); Box(int h,int w,int len):height(h),width(w),length(len) int volume( );private:int height, width, length;Bo

10、xBox( ) /定义一个无参的构造函数height=10;width=10;length=10;,例9.3 定义两个构造函数,其中一个无参,一个有参数。,2017/12/5,15,int Boxvolume( )return(height*width*length);int main( )Box box1; /建立对象box1,不指定实参cout“The volume of box1 is “box1.volume( )endl;Box box2(15,30,25); /建立对象box2,指定3个实参cout“The volume of box2 is “box2.volume( )endl

11、;return 0; ,2017/12/5,16,说明: (1) 调用构造函数时不必给出实参的构造函数,称为默认构造函数(default constructor)。一个类只能有一个默认构造函数。(2) 如果在建立对象时选用的是无参构造函数,应注意正确书写定义对象的语句。(3) 尽管在一个类中可以包含多个构造函数,但是对于每一个对象来说,建立对象时只执行其中一个构造函数,并非每个构造函数都被执行。,例如:Box box1; Box box1(); ,2017/12/5,17,构造函数中参数的值既可以通过实参传递,也可以指定为某些默认值,即如果用户不指定实参值,编译系统就使形参取默认值。例9.4

12、将上例中的构造函数改用含默认值的参数,长、宽、高的默认值均为10。改写如下:,9.1.6 使用默认参数的构造函数,2017/12/5,18,#include using namespace std;class Boxpublic:Box(int h=10,int w=10,int len=10); /在声明构造函数时指定默认参数int volume( ); private:int height; int width; int length;BoxBox(int h,int w,int len) /在定义函数时可以不指定默认参数height=h; width=w; length=len;,或:

13、BoxBox(int h,int w,int len):height(h),width(w),length(len) ,默认参数在声明构造函数是给出,2017/12/5,19,int Boxvolume( )return(height*width*length);int main( )Box box1; /没有给实参 coutThe volume of box1 is box1.volume( )endl;Box box2(15); /只给定一个实参coutThe volume of box2 is box2.volume( )endl;Box box3(15,30); /只给定2个实参cou

14、tThe volume of box3 is box3.volume( )endl;Box box4(15,30,20); /给定3个实参coutThe volume of box4 is box4.volume( )endl;return 0;,2017/12/5,20,程序运行结果为:The volume of box1 is 1000The volume of box2 is 1500The volume of box3 is 4500The volume of box4 is 9000优点: 在构造函数中使用默认参数是方便而有效的,它提供了建立对象时的多种选择,它的作用相当于好几个重载的构造函数。即使在调用构造函数时没有提供实参值,不仅不会出错,而且还确保按照默认的参数值对对象进行初始化。,2017/12/5,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 其它相关文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号