第3章_关于类和对象的进一步讨论剖析

上传人:今*** 文档编号:106892092 上传时间:2019-10-16 格式:PPT 页数:142 大小:999KB
返回 下载 相关 举报
第3章_关于类和对象的进一步讨论剖析_第1页
第1页 / 共142页
第3章_关于类和对象的进一步讨论剖析_第2页
第2页 / 共142页
第3章_关于类和对象的进一步讨论剖析_第3页
第3页 / 共142页
第3章_关于类和对象的进一步讨论剖析_第4页
第4页 / 共142页
第3章_关于类和对象的进一步讨论剖析_第5页
第5页 / 共142页
点击查看更多>>
资源描述

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

1、第三章 关于类和对象 的进一步讨论,C+面向对象程序设计,2,本章主要内容,3.1 构造函数 3.2 析构函数 3.3 调用构造函数和 析构函数的顺序 3.4 对象数组 3.5 对象指针 3.6 共用数据的保护,3.7 对象的动态 建立与释放 3.8 对象的赋 值与复制 3.9 静态成员 3.10 友元 3.11 类模板,3,【目的要求】 1、掌握用构造函数初始化对象 ; 2、理解析构函数的作用 ; 3、理静态成员、友元函数、对象的动态建立和释放、用const修饰成员函数、类对象数组和指针数组的使用。 【重点】 构造函数;调用构造函数和析构函数的顺序;对象成员的使用。 【难点】 构造函数初始化

2、对象;const修饰符;对象的 赋值和复制。,4,3.1 构造函数 3.1.1 对象的初始化 构造函数是在创建对象时,使用给定的值来将对象的数据成员初始化。应当注意:类的数据成员是不能在声明类时初始化的。下面的写法是错误的: class Time /不能在类定义中对数据成员初始化 int hour=0; int minute=0; int sec=0; ;,5,如果一个类中所有的数据成员都是公有的,则可以在定义对象时对数据成员进行初始化(否则,不能用此方法)。如: class Time public: int hour; int minute; int sec; ; Time t1=14,56

3、,36; /将t1初始化为14:56:36,6,3.1.2 构造函数的作用 构造函数是一种特殊的成员函数,与其他成员函数不同,不需要用户来调用它,而是在建立对象时自动执行。 构造函数的名字必须与类名同名,并且它不具有任何类型,没有返回值。 构造函数的功能是由用户自己定义的,用户根据初始化的要求设计函数体和函数参数。 例3.1 在例2.3的基础上定义构造函数,7,#include using namespace std; class Time public: Time( ) /定义构造函数,函数名与类名相同 hour=0; minute=0; sec=0; void set_time( ); /

4、函数声明 void show_time( ); /函数声明 private: int hour; /私有数据成员 int minute; int sec; ;,利用构造函数对对象中的数据成员赋初值,8,void Time:set_time( ) /定义成员函数,向数据成员赋值 cinhour; cinminute; cinsec; void Time:show_time( ) /定义成员函数,输出数据成员的值 couthour“:“minute“:“secendl; ,9,int main( ) Time t1; /建立对象t1时,自动会去调用构造函数 t1.set_time( ) ; /对t

5、1的数据成员赋值 t1.show_time( ); /显示t1的数据成员的值 Time t2; /建立对象t2时,自动会去调用构造函数 t2.show_time( ); /显示t2的数据成员的值 return 0; ,10,上面的例子是在类内定义构造函数的。也可以只在类内对构造函数进行声明而在类外定义构造函数。如: Time( ); /在类中对构造函数进行声明 然后在类外定义构造函数: Time :Time( ) /在类外定义构造函数,要加上类名Time和域限定符: hour=0; minute=0; sec=0; ,11,对构造函数的说明: 1.构造函数的函数名必须与类名相同。构造函数的主要

6、作用是初始化对象的数据成员以及其它的初始化工作。 2. 在定义构造函数时,不能指定函数返回值的类型,也不能指定为void类型。 3. 构造函数不需要用户调用,也不能被用户调用。什么时候调用构造函数呢? 在建立对象的时候自动调用构造函数。 4.如果用户自己没有定义构造函数,则C+编译系统自动生成一个构造函数。只是这个构造函数的函数体是空的,也没有参数,12,由于构造函数属于类的成员函数,它对私有数据成员、保护的数据成员和公有的数据成员均能进行初始化。 3.1.3 带参数的构造函数 有时用户希望对不同的对象赋予不同的初值,则可以采用带参数的构造函数来满足要求。带参数的构造函数首部的一般格式为: 构

7、造函数名(类型1 形参,类型2 形参2,),13,由于用户不能调用构造函数,故实参是在定义对象时给出。定义对象的一般格式为: 类名 对象名(实参1,实参2,) 例3.2 带参数的构造函数 #include using namespace std; class Box public: Box( int , int , int ); /声明带参数的构造函数 int volume( ); /声明计算体积的函数,14,private: int height; int width; int length; ; Box:Box( int h , int w , int len ) height=h; wi

8、dth=w; length=len; int Box:volume( ) /定义计算体积的函数 return( height * width * length );,/在类外定义带参/数的构造函数,15,int main( ) Box box1(12,25,30); /建立对象box1,并指定长宽高的值 cout“The volume of box1 is “ box1.volume()endl; Box box2(15,30,21); /建立对象box2,并指定长宽高的值 cout“The volume of box2 is “ box2.volume()endl; return 0; ,1

9、6,说明: (1)带参数的构造函数中的形参,其对应的实参在定义对象时给定。 (2)用这种方法可以方便地实现对不同的对象进行不同的初始化。 3.1.4 用参数初始化表对数据成员初始化 上面的例子是在构造函数的函数体内通过赋值语句对数据成员实现初始化。C+还提供了另一种初始化数据成员的方法参数初始化表来实现数据成员的初始化。,17,这种方法不在函数体内对数据成员初始化,而是在函数的首部来实现。如例3.2中定义的构造函数可以改写为:见C3-2-2.CPP Box:Box( int h , int w , int len ): height(h), width(w), length(len) 3.1.

10、5 构造函数的重载 在一个类中可以定义多个构造函数,以便对类对象提供不同的初始化方法,供用户选用。这些构造函数具有相同的名字,而参数的个数或参数的类型不同,这称为构造函数的重载。(函数的重载同样适用于构造函数),18,例3.3 构造函数重载 #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; i

11、nt length; ;,/声明一个有参数的构造函数,用参数的初始化表对数据成员初始化,19,Box:Box( ) /定义一个无参的构造函数 height=10; width=10; length=10; int Box:volume( ) return( height * width * length ); ,20,int main( ) Box box1; /建立对象box1,没指定参数 cout“The volume of box1 is “ box1.volume()endl; Box box2(15,30,25); /建立对象box2, 指定3个参数 cout“The volume

12、of box2 is “ box2.volume()endl; return 0; ,21,说明: (1)在调用构造函数时不必给出实参的构造函数,称为默认构造函数,或缺省构造函数。显然,无参的构造函数属于默认构造函数。一个类只能有一个默认构造函数,否则,系统就无法辨别应执行哪个构造函数。 如果用户未定义构造函数,则系统会自动提供一个默认的构造函数,但它的函数体是空的,什么事情也不做,不能初始化数据成员。在定义类时,只要显式定义了一个类的构造函数,则编译器就不产生缺省的构造函数。,22,(2)所有的对象在定义时,必须调用其中一个构造函数,不存在没有构造函数的对象!所以任一对象的构造函数必须唯一。

13、 3.1.6 使用默认参数的构造函数 构造函数中参数的值既可以通过实参传递,也可以指定为某些默认值,即如果用户不指定实参值,编译系统就使形参取默认值。,23,例3.4 带默认参数的构造函数 #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; ;,24,Box:Box( int w , int h , int len ) height=h; width=w; leng

14、th=len; int Box:volume( ) return( height * width * length ); ,/在定义函数时可以不再指定参数的默认值,25,int main( ) Box box1; /没有给定参数 cout“ The volume of box1 is “ box1.volume( )endl; Box box2(15); /只给定1个参数 cout“The volume of box2 is “ box2.volume( )endl; Box box3(15,30); /只给定2个参数 cout“The volume of box3 is“ box3.volu

15、me( )endl; Box box4(15,30,20); /给定3个参数 cout“The volume of box4 is “ box4.volume() endl; return 0; ,26,说明: (1)应该在声明构造函数时指定默认值。 (2)语句 Box( int w=10,int h=10,int len=10 );可以写成 Box(int=10,int=10,int =10); (3)如果构造函数的全部参数都指定了默认值,则在定义对象时可以给一个或几个参数,也可以不给出实参。由于不需要参数也可以调用构造函数,因此全部参数都指定了默认值的构造函数也属于默认构造函数。但一个类只能有一个默认构造函数,所以,27,Box( ); Box( int=10,int=10,int=10 ); 如果一个类中同时出现上面这两个构造函数,正确还是错误? 分析:定义对象时,不给出参数,请问是调用第几个构造函数? 参见下页例子 :见P77.CPP (4)在一个类中定义了全部是默认参数的构造函数后,不能再定义重载构造函数。,28,class A float x , y; public: A (float a

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

当前位置:首页 > 高等教育 > 大学课件

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