C++程序设计 教学课件 ppt 作者 王春玲 第5章

上传人:E**** 文档编号:89422821 上传时间:2019-05-25 格式:PPT 页数:55 大小:327.50KB
返回 下载 相关 举报
C++程序设计 教学课件 ppt 作者 王春玲 第5章_第1页
第1页 / 共55页
C++程序设计 教学课件 ppt 作者 王春玲 第5章_第2页
第2页 / 共55页
C++程序设计 教学课件 ppt 作者 王春玲 第5章_第3页
第3页 / 共55页
C++程序设计 教学课件 ppt 作者 王春玲 第5章_第4页
第4页 / 共55页
C++程序设计 教学课件 ppt 作者 王春玲 第5章_第5页
第5页 / 共55页
点击查看更多>>
资源描述

《C++程序设计 教学课件 ppt 作者 王春玲 第5章》由会员分享,可在线阅读,更多相关《C++程序设计 教学课件 ppt 作者 王春玲 第5章(55页珍藏版)》请在金锄头文库上搜索。

1、第5章,类和对象,本章主要内容,1类的定义方式,数据成员、成员函数及访问权限(public,private,protected)。 2对象和对象指针的定义与使用。 3构造函数与析构函数。 4静态数据成员与静态成员函数的定义与使用。 5常数据成员与常成员函数。 6this指针的使用。 7友元函数和友元类。 8对象数组与成员对象。,5-1 类,类是把各种不同类型的数据(称为数据成员)和对数据的操作(称为成员函数)组织在一起而形成的用户自定义的数据类型。 5-1-1 类的定义 C+中,类定义包括类说明和类实现两大部分。 说明部分提供了对该类所有数据成员和成员函数的描述; 实现部分则提供了所有成员函数

2、的实现代码。,类定义的一般形式为: class 类名 private: 数据成员或成员函数 protected: 数据成员或成员函数 public: 数据成员或成员函数 ; ,如:下例中定义了一个描述学生的类。 class Student private: /private成员 int number; /数据成员,表示学号 char name20; /数据成员,表示姓名 char sex; /数据成员,表示性别 int age; /数据成员,表示年龄 public: /public成员 void set(int a,char *b,char c,int d); /成员函数,用于给各数据成员赋值

3、 void show(); /成员函数,用于显示各数据成员的值 ;,5-1-2 类成员的访问权限,类成员具有不同的访问权限,具体可以分成三个部分,即私有部分(private)、公有部分(public)和保护部分(protected),并分别由private、public和protected这三个关键字后跟冒号“:”来指定。 这三种访问权限控制符可以以任何顺序出现,且在同一个类的定义中,这三个部分并非必须同时出现。 (1)private部分:类的private部分说明的数据成员和成员函数在类之外是不能访问的,只有类中的成员函数才能访问private部分的数据成员和成员函数。 (2)protect

4、ed部分:类的protected部分说明的数据成员和成员函数是不能在类之外访问的,只有类的成员函数及其子类(派生类)可以存取protected部分的成员。 (3)public部分:类的public部分说明的数据成员和成员函数可以被程序中的任何函数或语句访问。public部分的成员多为成员函数,用来提供一个与外界的接口,外界只有通过这个接口才可以实现对private部分成员的访问。 (4)在定义类时,当未指明成员是属于哪部分时,默认是属于private部分,但一般不提倡采用默认形式。,5-1-3 类的数据成员,类的数据成员描述的是类所表达的问题的属性。 数据成员要在类的类体中进行定义,其定义的方

5、法和一般变量的定义方法相同,但对于数据成员的访问要受到访问权限(private、protected或public)的控制。 在定义类的数据成员时,要注意一个问题:在类体中不允许对类的数据成员初始化。例如: class Student private: int number; char name20; char sex; int age=20; /错误的 public: void set(int a,char *b,char c,int d); void show(); ;,5-1-4 类的成员函数,类的成员函数描述的是类所表达的问题的行为。 类中的所有成员函数都要在类的类体中进行说明,但成员函

6、数的定义既可以在类体中给出,也可以在类体外给出。,(1)将成员函数的定义直接写在类体中。 (2)在类的定义体中只写出成员函数的原型说明,而成员函数的定义写在类的类体之外。 函数返回值的类型 类名:成员函数名(参数说明) 函数体 ,5-2 对象,类实际上是一种抽象机制,它描述了一类问题共同的属性和行为。 在C+中,类的对象就是该类的某一特定实体(也称实例)。 1对象的定义 类名 对象名表; 类是抽象的概念,而对象是具体的概念; 每个对象占用了各自的存储单元,每个对象都各自具有了该类的一套数据成员(静态成员除外),而所有成员函数是所有对象共有的。 每个对象的成员函数都通过指针指向同一个代码空间。,

7、类名 *指针变量名表; Student stu; /定义Student类的对象stu Student *p; /定义指向Student类的指针 p= /使指针变量p指向对象stu,5-2-2 对象指针的定义,5-2-3 对象的成员,格式1:对象名.成员名 格式2:指针变量名-成员名 格式3:(*指针变量名).成员名 【例5-1】访问对象的成员。,5-2-4 this 指针,在类的每一个成员函数的形参表中都有一个隐含的指针变量this,该指针变量的类型就是成员函数所属类的类型。 当程序中调用类的成员函数时,this指针变量被自动初始化为发出函数调用的对象的地址。 尽管在定义成员函数时没有看到也没

8、有定义this指针变量,但在成员函数的函数体内可以使用this指针变量。 this-number=a; strcpy(this-name,b); this-sex=c; this-age=d;,5-2-5 对象的作用域与生存期,对象是类的实例,它的实质就是某种数据类型的变量。 class Desk /定义Desk类 public: int weight; int high; int width; int length; ; class Stool /定义Stool类 public: int weight; int high; int width; int length; ; Desk da;

9、/定义全局对象 Stool sa; void fn() static Stool ss; /定义局部静态对象 Desk da; /定义局部对象 / ,1局部对象 局部对象(不包括局部静态对象)的作用域是定义它的函数体,其生存期是从函数调用开始到函数调用结束,当下一次重新调用函数时,再重新构造对象。 构造局部对象的次序(即分配存储单元的次序)是按照它们在函数体中声明的次序进行的。 局部对象所占的存储空间被分配在程序的动态区(栈区)中。,2静态对象 静态对象(局部静态对象和全局静态对象)的作用域是定义它的函数体或程序文件,其生存期是整个程序的运行时间。 构造静态对象的次序是按它们在程序中出现的先后

10、次序,且在整个程序运行开始时(即在主函数运行前)只构造一次。 静态对象所占的存储空间被分配在程序的静态区(全局区)中。,3全局对象 全局对象的作用域是整个程序,其生存期是整个程序的运行时间。 它也是在程序运行前(即在主函数运行前)只构造一次。 全局对象所占的存储空间被分配在程序的静态区(全局区)中。 4类中成员的构造次序 类中成员的构造次序是以类中声明成员的次序进行的。,5-3 构造函数与析构函数,在声明对象的同时给它的数据成员赋初值,称为对象的初始化。 在对象使用结束时,还经常需要进行一些清理工作。 C+中对象的初始化和清理工作分别由两个特殊的成员函数来完成,即构造函数和析构函数。,5-3-

11、1 构造函数,构造函数(Constructor)是与类名同名的特殊的成员函数; 构造函数的执行是在系统创建对象时自动执行。 构造函数的定义格式为: 类名(形参说明) 函数体 【例5-2】修改【例5-1】中的Student类,为其定义构造函数,完成对象的初始化工作。,5-3-2 构造函数的重载,如果一个类中出现了两个以上的同名成员函数,则称为类的成员函数的重载。 一个类的成员函数和另一个类的成员函数同名; 一个类的成员函数与一个类外的函数同名;,在类的成员函数的重载中,比较常见的形式是构造函数的重载。 在对象定义时,系统会根据参数的类型及个数选择调用某一种合适的构造函数完成对象的构造。 【例5-

12、3】修改【例5-2】中的Student类,为其定义两个构造函数:一个无参构造函数和一个有参构造函数,完成对象的初始化工作。,5-3-3 默认构造函数,C+规定,每个类必须有一个构造函数,没有构造函数就不能创建对象。 如果在类中没有显式定义构造函数,则C+编译系统在编译时为该类提供一个默认的构造函数。 只要一个类定义了一个构造函数,则C+编译系统就不再提供默认的构造函数。 也就是说,如果已经为类定义了一个带参数的构造函数,但还想要无参构造函数,则必须自己定义。,当构造函数的参数具有默认值时,称为具有缺省参数的构造函数。 【例5-4】修改【例5-1】中的Student类,定义有默认参数的构造函数,

13、完成对象的初始化工作。 使用默认值时要注意以下几点: (1)只能出现在类定义的接口部分,而不能出现在类定义的实现部分。 (2)所有具有默认值的参数必须处在参数表的最右边。 (3)在使用具有缺省参数的构造函数时,要防止二义性。,5-3-4 有默认参数的构造函数,5-3-5 拷贝构造函数,一种特殊的构造函数 类名:类名(const 类名 &形式参数) 函数体 说明: (1)拷贝构造函数的名称与类的名称相同,且它只有一个参数。该参数就是对该类对象的引用。 (2)拷贝构造函数的功能是用于实现对象值的拷贝。通过将一个同类对象的值拷贝给一个新对象完成对新对象的初始化,即用一个对象去构造另外一个对象。,【例

14、5-5】Person类是一个人员信息类。用普通构造函数生成对象per1,用拷贝构造函数生成对象per2。,5-3-6 析构函数,析构函数其函数名称是在类名的前面加上“”。 它没有返回值和参数,不能随意调用,也没有重载。 只是在类对象生命期结束时,系统自动调用。 类名() 函数体 ,说明: (1)如果程序员在定义类时没有为类提供析构函数,则系统会自动创建一个默认的析构函数,其形式为: 类名() (2)如果在类的对象中分配有动态内存,就必须为该类提供适当的析构函数,以完成清理工作。 (3)一个类中只能拥有一个析构函数。 (4)对象被析构的顺序与其建立时的顺序正好相反。 【例5-6】分析以下程序的执

15、行结果。,5-4 静态成员,同一类的各个对象之间如何共享数据? 在类中增加用于共享的新的普通成员。 在类中设置一种“特殊”的成员静态成员。 静态数据成员 静态成员函数,5-4-1 静态数据成员,class 类名 static 类型说明符 成员名; ; 【例5-7】分析以下程序的执行结果。,关于静态数据成员的几点说明: (1)静态数据成员不属于任何一个对象,而是属于类。 (2)在一个类的对象空间内不包含静态数据成员的空间。 (3)静态数据成员的存储空间的分配是在程序一开始运行时就被分配了,而并不是在程序运行过程中在某一函数内进行空间分配和初始化的。 (4)类的静态数据成员必须进行初始化,且初始化

16、语句应当写在程序的全局区域中,并且必须指明其数据类型与所属类的类名,其格式表示如下: 数据类型标识符 类名:变量名=值; (5)对于在类的public部分说明的静态数据成员,可以不使用成员函数而直接访问,格式是: 类名:静态数据成员名,5-4-2 静态成员函数,class 类名 static 类型 函数名(形参) 函数体 ;,【例5-8】 【例5-9】阅读下面程序,理解在类的内部和外部访问类的普通数据成员和静态数据成员的方法以及区别,理解调用类的普通成员函数和类的静态成员函数的方法以及区别。,5-5 友元,C+提供了一种允许外部类和外部函数存取类的私有成员和保护成员的辅助方法,即将它们声明为一个给定类的友元,使其具有类成员函数的访问权限。 但友元本身不是类的成员,它不属于任何类。,在一个类中,可以利用关键字

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

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

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