《mfc课件》由会员分享,可在线阅读,更多相关《mfc课件(111页珍藏版)》请在金锄头文库上搜索。
1、,目录,3.1 类的声明和对象的定义 3.2 类的构造函数 3.3 类的析构函数 3.4 构造函数和析构函数的调用顺序 3.5 对象数组 3.6 对象指针 3.7 静态成员 3.8 对象成员 3.9 友元 3.10 常类型,第3章 类和对象,目的要求,3.1 类的声明和对象的定义,3.1.1 类的声明 3.1.2 对象的定义和使用 3.1.3 类和结构体类型的比较 3.1.4 类的封装性和信息隐藏,类类型的声明,一般形式如下: class 类名 private:私有的数据成员和成员函数;public:公用的数据成员和成员函数;private和public称为成员访问限定符(member acc
2、ess specifier)。 如果在类的定义中既不指定private,也不指定public,则系统就默认为是私有的。,3.1.1 类的声明,实例:,class Student /声明类类型 private: /声明以下部分为私有的int num;char name20; char sex; public: /声明以下部分为公用的void display( ) coutnum:numendl;coutname:nameendl;coutsex:sexendl; ;,说明: 1、除了private和public之外,还有一种成员访问限定符protected(受保护的),用protected声明的
3、成员称为受保护的成员,它不能被类外访问,但可以被派生类的成员函数访问。 2、在声明类类型时,如没写关键字则默认为private。 3、在一个类体中,关键字private和public可以分别出现多次。每个部分的有效范围到出现另一个访问限定符或类体结束时为止。建议: 使每一种成员访问限定符在类定义体中只出现一次。,类的成员函数(简称类函数)是函数的一种,它与一般函数的区别只是: 它是属于一个类的成员,出现在类体中。成员函数可以访问本类中任何成员,可以引用在本作用域中有效的数据。具体内容:成员函数的性质成员函数定义的位置成员函数的存储方式,类的成员函数,成员函数的性质成员函数定义的位置,注意:在类
4、的内部对成员函数作声明,而在类体外定义成员函数,这是程序设计的一种良好习惯。如果一个函数,其函数体只有23行,一般可在声明类时在类体中定义。多于3行的函数,一般在类体内声明,在类外定义。如果想将类体外定义的成员函数指定为内置函数,要用inline 显式声明,同时必须将类定义和成员函数的定义都放在同一个头文件中,否则编译时无法进行置换。内置函数适用于成员函数规模很小而调用频率较高情况。,成员函数的存储方式,用类去定义对象时,系统会为每一个对象分配存储空间。一个类包括了数据和函数,C+编译系统只用一段空间来存放公用函数代码段,在调用各对象的函数时,都去调用这个公用的函数代码。如图所示。,3.1.2
5、 对象的定义和使用,对象的定义类似结构体变量的定义方法:1. 先声明类类型,然后再定义对象(1) class 类名 对象名(2) 类名 对象名 2. 在声明类类型的同时定义对象3. 不出现类名,直接定义对象,class Student public:void display( ) cout“num:”numendl;cout“name:”nameendl;cout“sex:”sex成员名 3.通过对象的引用变量访问对象中的成员。 引用变量名.成员名,例:,#include using namespace std; class Time public:void set_time( ); void
6、 show_time( ); private: int hour;int minute;int sec; ; int main( ) Time t1,*p= /(2)对象的指针访问,Time t2; Time ,3.1.3 类和结构体类型的比较,结构体中也可以包含成员函数,此时的结构体实际上也就是类。,类class和结构体struct的比较用struct声明的类,系统将其默认为public。也可分别显式声明指定私有成员private和公用成员public。而用class定义的类,系统将其成员默认为private。如果希望成员是公用的,使用struct比较方便,如果希望部分成员是私有的,宜用cl
7、ass。尽量使用class来建立类,写出完全体现C+风格的程序。,3.1.4 类的封装性和信息隐藏,公用接口与私有实现的分离,C+通过类来实现封装性。公用成员函数是类的公用接口(public interface) ,用户主要是通过调用公用的成员函数来实现类提供的功能。在类外不能直接访问私有数据成员,但可以通过调用公用成员函数来引用或修改私有数据成员。通过成员函数对数据成员进行操作称为类的实现。可以看到: 类中被操作的数据是私有的,实现的细节对用户是隐蔽的,这种实现称为私有实现(private implementation)。这种“类的公用接口与私有实现的分离”形成了信息隐蔽。,软件工程的一个最
8、基本的原则就是将接口与实现分离,信息隐蔽的好处在于: (1) 如果想修改或扩充类的功能,只需修改本类中有关的数据成员和与它有关的成员函数。 (2) 如果在编译时发现类中的数据读写有错,只需检查本类中访问这些数据的少数成员函数。,类声明和成员函数定义的分离,在OOP中,一般做法: 将类的声明(其中包含成员函数的声明)放在指定的头文件中; 对类成员函数的定义一般另外放在一个文件中。如果想用该类,只要把有关的头文件包含进来,就可以用该类来定义对象。,例如:可以分别写三个文件: /student.h /类的声明 class Student public:void display( ); private
9、:int num; char name20; char sex; ;,/student.cpp /在此文件中进行函数的定义 #include #include “student.h”/不要漏写否则编译不过 void Student:display( ) /类外定义display类函数 cout“num:”numendl; cout“name:”nameendl; cout“sex:”sexhour;cinminute;cinsec; void Time:show_time( ) couthour“:”minute“:”secendl; int main( ) Time t1; /建立对象t1,
10、同时调用构造函数t1.Time( ) t1.set_time( ); t1.show_time( ); Time t2; /建立对象t2,同时调用构造函数t2.Time( ) t2.show_time( ); return 0; ,说明:(1) 在类对象进入其作用域时调用构造函数。 (2) 构造函数没有返回值,不需要函数声明。 (3) 构造函数不需用户调用,也不能被用户调用。 (4) 如果用户自己没有定义构造函数,则C+系统会自动生成一个构造函数,只是这个构造函数的函数体是空的。,3.2.2 参数化的构造函数,采用带参数的构造函数,在调用不同对象的构造函数时,从外面将不同的数据传递给构造函数,
11、以实现不同的初始化。 构造函数首部的一般格式为 构造函数名(类型 1 形参1,类型2 形参2,) 实参是在定义对象时给出的。 定义对象的一般格式为 类名 对象名(实参1,实参2,);,例3.2 求两个长方柱的体积。#include using namespace std; class Box public:Box(int,int,int); /声明带参数的构造函数int volume( ); private:int height;int width;int length; ; BoxBox(int h,int w,int len) /在类外定义带参数的构造函数 height=h;width=w;l ength=len; ,