资源预览内容
第1页 / 共138页
第2页 / 共138页
第3页 / 共138页
第4页 / 共138页
第5页 / 共138页
第6页 / 共138页
第7页 / 共138页
第8页 / 共138页
第9页 / 共138页
第10页 / 共138页
亲,该文档总共138页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第7章 类与数据抽象,7.1 类 的 定 义 7.2 对 象 的 定 义 7.3 构造函数和析构函数 7.4 成员函数的特征 7.5 静 态 成 员 7.6 友 元 7.7 对象的指针和对象的引用 7.8 对 象 数 组 7.9 常 类 型,类的基本特征有:封装性、继承性、多态性。 类中的成员,根据访问权限分为三类:私有、保护和公有。,7.1 类 的 定 义,类的一般定义格式如下: class public: private: ; ,其中,class是定义类的关键字,是符合C+规定的标识符。花括号内部是类的说明部分(包括前面的类头),用来说明该类的成员。类的成员包含数据成员和成员函数两部分。从访问权限上来分,类的成员又分为:公有的(public)、私有的(private)和保护的(protected)三类。公有的成员用public来说明,公有部分往往是一些操作(即成员函数),它是提供给用户的接口功能。,这部分成员可以在程序中引用。私有的成员用private来说明,私有部分通常是一些数据成员,这些成员用来描述该类中的对象的属性,用户是无法访问它们的,只有成员函数或经特殊说明的函数才可以引用它们,它们是被用来隐藏的部分。 是类定义中成员函数具体功能的实现部分,这部分包含所有在类体内说明函数的具体功能。,【例7.1】下面给出一个关于时间的类的定义,该类是对时间的抽象,该类的对象将是一个具体的时间。 /类的说明部分: class Time private: int hour; int minute; int second;,public: Time(); void SetTime(int,int,int); void printMilitary(); void printStandard(); ; /类的实现部分 Time:Time() hour= minute = second =0;,void Time:SetTime(int h, int m, int s) hour = (h=0 ,void Time:PrintMilitary() cout(hour10? “0“: “)hour“:“(minute10? “0“: “) minute endl; ,void Time:PrintStandard() cout(hour=0| hour=12? 12: hour%12) “:“(minute10? “0“: “) minute “:“(second10? “0“: “) second(hour12? “ AM“: “ PM“)endl; ,如果成员函数定义在类体外,则在函数头的前面必须加上作用域运算符“:”,以表明该函数所属类的标识。 在定义类时应注意以下几点: (1)在类体中不允许对所定义的数据成员进行初始化。,(2)类中的数据成员的类型可以是任意的,包括基本类型、数组、指针和引用等。也可以是对象。 (3)经常习惯地将类定义的说明部分或者整个定义部分(包含实现部分)放到一个头文件中。,7.2 对 象 的 定 义,7.2.1 对象的定义 对象定义的一般格式为: 例如: Time t1,*t2,t33;,7.2.2 对象成员的表示方法 对象成员有数据成员和成员函数,其表示方式如下: . 或者 .(),7.3 构造函数和析构函数,7.3.1 构造函数和析构函数 7.3.1.1 构造函数 构造函数是一个特殊的成员函数,构造函数的功能是在创建对象时,使用给定的值将对象初始化。该函数的名字与类名相同,该函数不指定类型说明,它有隐含的返回值,该值由系统内部使用。,该函数可以有一个参数,也可以有多个参数,即构造函数可以重载。函数体可以写在类体内,也可以写在类体外。程序中不能直接调用构造函数,在创建对象时系统自动调用构造函数。,【例7.3】构造函数应用举例。 class Date public: Date(int y); Date(int y, int m) year= y;month=m;day=0; Date(int y, int m, int d); int IsLeapYear();,void Print(); private: int year, month, day; ; /类的实现部分,Date:Date(int y) year= y;month=day=0; cout“1个参数的构造函数已被调用。n“; ,Date:Date(int y, int m) year= y;month=m;day=0; cout“2个参数的构造函数已被调用。n“; ,Date: Date(int y, int m, int d) year = y; month = m; day = d; cout“3个参数的构造函数已被调用。n“; ,int Date:IsLeapYear() return(year%4=0 ,7.3.1.2 析构函数 析构函数也是一个特殊的函数,其功能与构造函数的功能正好相反,是用来释放一个对象,在对象删除前,用它来做一些清理工作。析构函数的名字同类名,并在前面加上“”字符,用来与构造函数加以区别。,析构函数不指定数据类型,也没有参数。一个类中只能定义一个析构函数。析构函数是成员函数,函数体可写在类体内,也可写在类体外。析构函数可以被调用,也可以被系统调用。在下面两种情况下,析构函数会被系统自动调用。,(1)如果一个对象被定义在一个函数体内,则当这个函数结束时,该对象的析构函数被自动调用。 (2)当一个对象是使用new运算符动态创建的,在使用delete运算符释放它时,delete将会自动调用析构函数。,【例7.4】下面程序说明构造函数和析构函数的应用。 #include “iostream.h“ class Date public: Date(int y=0, int m=0, int d=0); Date(); int IsLeapYear();,void Print(); private: int year, month, day; ; /类的实现部分,Date: Date(int y, int m, int d) year = y; month = m; day = d; cout“构造函数已被调用。n“; ,Date: Date() cout“析构函数被调用。n“; int Date:IsLeapYear() return(year%4=0 ,void Date:Print() coutyear“.“month“.“dayendl; ,void main() Date today(2004, 3, 15), tomorrow(2004, 3, 16); cout“Today is:“; today.Print(); cout“Tomorrow is:“; tomorrow.Print(); ,运行结果为: 构造函数已被调用。 构造函数已被调用。 Today is:2004.3.15 Tomorrow is:2004.3.16 析构函数被调用。 析构函数被调用。,7.3.2 缺省构造函数和缺省析构函数 在类定义时没有定义任何构造函数时,则编译器会自动生成一个不带参数的缺省构造函数,其格式如下: :() ,在程序中定义一个对象而没有进行初始化时,则编译器便按缺省构造函数来初始化该对象。用缺省构造函数初始化对象时,对象的所有数据成员都初始化为零或空。,如果一个类中没有定义析构函数时,则编译系统也生成一个缺省析构函数,其格式如下: : 缺省析构函数是一个空函数。,7.3.3 拷贝初始化构造函数 拷贝初始化构造函数是一种特殊的成员函数,它的功能是用一个已知的对象来初始化一个被创建的同类的对象。,拷贝初始化构造函数的特点如下: (1)该函数名同类名,因为它也是一种构造函数,并且该函数不被指定返回类型。 (2)该函数只有一个参数,并且是对某个对象的引用。 (3)每个类都必须有一个拷贝初始化构造函数。,拷贝初始化构造函数格式如下: :(const & ),在下述三种情况下,需要用拷贝初始化构造函数来用一个对象初始化另一个对象。 (1)明确表示由一个对象初始化另一个对象时,如TPoint P2(P1)。 (2)当对象作为函数实参传递给函数形参时,如上例中的P = f(N)。 (3)当对象用为函数返回值时,如上例中的return R。,【例7.5】拷贝初始化构造函数应用举例。 #include “iostream.h“ class Tpoint public: TPoint(int x, int y) X=x; Y=y; TPoint(TPoint ,int Xcoord() return X; int Ycoord() return Y; private: int X, Y; ;,TPoint:TPoint(TPoint ,void main() TPoint P1(5, 7); TPoint P2(P1); cout“P2=“P2.Xcoord()“,“P2.Ycoord()endl; ,运行程序,输出结果为: 拷贝初始化构造函数被调用。 P2=5,7 析构函数被调用。 析构函数被调用。,【例7.6】关于拷贝初始化构造函数的其他用法。 #include “iostream.h“ class TPoint public: TPoint(int x,int y) X=x;Y=y; TPoint(TPoint ,TPoint() cout“析构函数被调用。n“; int Xcoord() return X; int Ycoord() return Y; private: int X,Y; ;,TPoint:TPoint(TPoint ,void main() TPoint M(20, 35),P(0, 0); TPoint N(M); P = f(N); cout“P=“P.Xcoord()“,“P.Ycoord()endl; ,TPoint f(TPoint Q) cout“okn“; int x, y; x = Q.Xcoord()+25; y= Q.Ycoord()+30; TPoint R(x, y); return R; ,运行程序,输出结果如下: 拷贝初始化构造函数被调用。 拷贝初始化构造函数被调用。 ok 拷贝初始化构造函数被调用。 析构函数被调用。 析构函数被调用。 析构函数被调用。,P=45,65 析构函数被调用。 析构函数被调用。 析构函数被调用。,7.4 成员函数的特征,7.4.1 成员函数的重载 【例7.7】成员函数重载。 #include “iostream.h“ class myclass private: int x;,int y; int z; public: void set()x=10;y=20;z=30; void set(int xx)x=10;y=20;z=30; void set(int xx,int yy )x=xx;y=yy;z=30; void set(int xx,int yy ,int zz) x=xx;y=yy;z=zz;,void print()cout xt yt zn; ; void main() myclass b1; cout “x y zn“; b1.set ();,b1.print (); b1.set (11); b1.print (); b1.set (11,22); b1.print (); b1.set (11,22,33); b1.print (); ,运行结果: x y z 10 20 30 11
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号