《第三章类和对象(一)》由会员分享,可在线阅读,更多相关《第三章类和对象(一)(43页珍藏版)》请在金锄头文库上搜索。
1、第三章 类和对象(一)类类对象对象构造函数和析构函数构造函数和析构函数3.1 类一、类的定义一、类的定义一、类的定义一、类的定义 类是一种复杂的数据类型,它是将不同类是一种复杂的数据类型,它是将不同类型的数据和这些数据相关的运算封装在一类型的数据和这些数据相关的运算封装在一起的复合体。起的复合体。3.1 类class public: /公有部分公有部分 private: /私有部分私有部分 protected: /保护部分保护部分 ;说明部分说明部分 实现部分实现部分出现的出现的顺序和顺序和次数没次数没有限制有限制3.1 类class Date public: void Display( );
2、 /成员函数成员函数 void SetDate( ); /成员函数成员函数 private: /数据成员,缺省为私有部分数据成员,缺省为私有部分 int year, month, day; ;3.1 类class C ;#include “c.h” int C:fun1( ) ; void C:fun2( ) 类界面类界面(c.h)类实现类实现(c.cpp)#include “c.cpp” void main( ) C obj; int i; i=obj.fun1( ); 类使用类使用A(a.cpp)二、访问权限二、访问权限二、访问权限二、访问权限私有类型成员私有类型成员私有类型成员私有类型成
3、员privateprivate :只允许本类中:只允许本类中:只允许本类中:只允许本类中的函数访问,类外部的任何函数都不能访问。的函数访问,类外部的任何函数都不能访问。的函数访问,类外部的任何函数都不能访问。的函数访问,类外部的任何函数都不能访问。公有类型成员公有类型成员公有类型成员公有类型成员public public :类与外部的接口,类与外部的接口,类与外部的接口,类与外部的接口,任何外部函数都可以访问。任何外部函数都可以访问。任何外部函数都可以访问。任何外部函数都可以访问。受保护类型成员受保护类型成员受保护类型成员受保护类型成员protected protected :允许本类允许本类
4、允许本类允许本类及其派生类中的函数访问,类外部的任何函及其派生类中的函数访问,类外部的任何函及其派生类中的函数访问,类外部的任何函及其派生类中的函数访问,类外部的任何函数不能访问。数不能访问。数不能访问。数不能访问。3.1 类class Account public: char *name; long balance;/账户类账户类void main() Account Joe; Joe.balance=-20000; /取走取走20000 /Joe.balance=20000; /漏写减号漏写减号账户账户存款存款取款取款class Account prviate: char *name; l
5、ong balance; public: long getbalance(); void credit(long);/贷贷 void debit(long);/借借 ;/账户类账户类#include class MyClass private:int i; protected: int j; public: int k;int geti() return i;int getj() return j; int getk() return k;MyClass a;a.i /非法非法a.j /非法非法a.k /合法合法三、类定义中需注意的问题三、类定义中需注意的问题三、类定义中需注意的问题三、类定义
6、中需注意的问题在类定义体中不允许对所定义的数据成员进在类定义体中不允许对所定义的数据成员进行初始化。行初始化。class Dateclass Dateprivate:private:int month=1;int month=1; int day=1; int day=1; int year=1; int year=1; ; ;3.1 类三、类定义中需注意的问题三、类定义中需注意的问题三、类定义中需注意的问题三、类定义中需注意的问题数据成员可以是任何数据数据成员可以是任何数据类型,如整型、浮点型、字符类型,如整型、浮点型、字符型、数组、指针、引用等,也型、数组、指针、引用等,也可以是另外一个类
7、的对象或指可以是另外一个类的对象或指向对象的指针,但向对象的指针,但不能是自身不能是自身类的对象类的对象。此外,数据成员。此外,数据成员不不能指定为自动能指定为自动(auto)、寄存器、寄存器(register)和外部和外部(extern)存存储类型。储类型。class A;class Bprivate: int a; A obja1; /正确正确 A *obja2; /正确正确 B b1; /错误错误 auto int b; /错误错误 extern int c; /错误错误public:;3.1 类 class Tpoint public: void SetPoint(int x,int
8、y);); int Xcoord( ) return X; int Ycoord( ) return Y; void Move(int xOffset,int yOffset); private: int X,Y; void Tpoint:SetPoint(int x,int y) X=x;Y=y; void Tpoint:Move(int xOffset,int yOffset) X+=xOffset;Y+=yOffset;三、类定义中需注意的问题三、类定义中需注意的问题三、类定义中需注意的问题三、类定义中需注意的问题3.3.成员函成员函数若在类数若在类外说明时外说明时要加上类要加上类名和类
9、作名和类作用域限定用域限定符符:。一、对象的定义和使用一、对象的定义和使用一、对象的定义和使用一、对象的定义和使用汽车对象汽车对象汽车对象汽车对象汽车类3.2 对象一、对象的定义和使用一、对象的定义和使用一、对象的定义和使用一、对象的定义和使用3.2 对象Windows程序设计语言程序设计语言窗窗口口菜菜单单按按钮钮对对话话框框程程序序模模块块其对象通其对象通常是常是WindowsWindows的的规范部件规范部件, ,对象特征对象特征是具有规是具有规范形态和范形态和操作模式操作模式一、对象的定义和使用一、对象的定义和使用一、对象的定义和使用一、对象的定义和使用定义格式:定义格式: ; (参数
10、表)(参数表);如:如:Tpoint a1,d3,*p; Date MyBirthday(8,13,1980);3.2 对象一、对象的定义和使用一、对象的定义和使用一、对象的定义和使用一、对象的定义和使用一般对象的成员表示如下:一般对象的成员表示如下: . .()如:如:Tpoint a1; a1.x,a1.y,a1.get( )3.2 对象一、对象的定义和使用一、对象的定义和使用一、对象的定义和使用一、对象的定义和使用指向对象的指针的成员表示如下:指向对象的指针的成员表示如下: ()如:如: Tpoint *p; pi,pgeti( )或或(*p).i,(*p).geti( ) 3.2 对象
11、 1. 假定假定MyClass是一个类,是一个类,dd是它的一个是它的一个对象,对象,pp是指向是指向dd的指针,的指针,cc是是dd的引用,的引用,则对成员的访问,对象则对成员的访问,对象dd可通过可通过 进进行,指针行,指针pp可通过可通过 进行,引用进行,引用cc可可通过通过 进行。进行。练 习B D B A. : B. . C. & D. - 2. 编写程序,定义一个学生类编写程序,定义一个学生类student,私,私有数据成员为学号有数据成员为学号num和平均分和平均分ave,公有成,公有成员函数员函数setvalue用来设定用来设定num和和ave的值,公有的值,公有成员函数成员函
12、数printvalue用来打印用来打印num和和ave的值。的值。现有两名学生学号分别为现有两名学生学号分别为101和和102,要求给定,要求给定他们的平均成绩,并且显示所有信息。他们的平均成绩,并且显示所有信息。练 习对象对象stud1numnamesetvalueprintvalue对象对象stud2numnamesetvalueprintvalue类类student公用区公用区 #include class student /定义定义student类类 public: void setvalue(int n,int a) num=n;ave=a; void printvalue( ) c
13、out“学号学号”num“,平均分平均分:”aveendl; private: int num,ave; ;void main( ) student stud1,stud2; /定义定义student类的两个对象类的两个对象 stud1.setvalue(101,85); stud2.setvalue(102,92); stud1.printvalue( ); stud2.printvalue( );执行结果执行结果:101:101,平均分,平均分:85:85 102 102,平均分,平均分:92:92二、对象的赋值运算二、对象的赋值运算二、对象的赋值运算二、对象的赋值运算赋值语句如下:赋值语
14、句如下:stud2=stud1;stud2=stud1;3.2 对象对象对象stud1对象对象stud2对象对象stud2练习:编制一个小游戏。 创建一个宠物类创建一个宠物类Critter,为每一个宠物,为每一个宠物指定一个饥饿级别指定一个饥饿级别Hunger,并且每一个宠物,并且每一个宠物都能够说出一句问候并向世界宣告自己的饥都能够说出一句问候并向世界宣告自己的饥饿级别。饿级别。3.3 构造函数和析构函数一、构造函数一、构造函数1. 构造函数的需要性构造函数的需要性变量初始化变量初始化int a=1; int *p=&a; int b =1,2;结构初始化结构初始化struct studen
15、t int semesHours; /总学时数总学时数 float gpa; /平均成绩平均成绩 ; void fn( )student s=100,3.5; /创建结构变量并初始化创建结构变量并初始化 一、构造函数一、构造函数1. 构造函数的需要性构造函数的需要性 class student public: /公有成员公有成员 private: int semesHours; float gpa; ; void fn( ) student s=100,3.5; /errorvoid fn( ) s.semesHours=100; s.gpa=3.5; ?3.3 构造函数和析构函数一、构造函数
16、一、构造函数1. 构造函数的需要性构造函数的需要性 class student public: void init( ) semesHours=100; gpa=3.5; private: int semesHours; float gpa; ;void fn( ) student s; s.init( ); /初始化初始化 ?3.3 构造函数和析构函数一、构造函数一、构造函数 称为称为称为称为构造函数构造函数构造函数构造函数的成员函数,在定义对象的的成员函数,在定义对象的的成员函数,在定义对象的的成员函数,在定义对象的同时根据提供的参数个数和类型自动隐式地被同时根据提供的参数个数和类型自动隐
17、式地被同时根据提供的参数个数和类型自动隐式地被同时根据提供的参数个数和类型自动隐式地被调用,完成对象的初始化工作。构造函数的作调用,完成对象的初始化工作。构造函数的作调用,完成对象的初始化工作。构造函数的作调用,完成对象的初始化工作。构造函数的作用就是在对象被创建时利用特定的值构造对象,用就是在对象被创建时利用特定的值构造对象,用就是在对象被创建时利用特定的值构造对象,用就是在对象被创建时利用特定的值构造对象,将对象初始化为一个特定的状态,使其具有区将对象初始化为一个特定的状态,使其具有区将对象初始化为一个特定的状态,使其具有区将对象初始化为一个特定的状态,使其具有区别于其他对象的特征。别于其
18、他对象的特征。别于其他对象的特征。别于其他对象的特征。2. 构造函数的作用构造函数的作用3.3 构造函数和析构函数3. 构造函数的特点构造函数的特点构造函数名必须和类名相同;构造函数名必须和类名相同;构造函数名必须和类名相同;构造函数名必须和类名相同;构造函数没有返回值;构造函数没有返回值;构造函数没有返回值;构造函数没有返回值;构造函数只能由构造函数只能由构造函数只能由构造函数只能由系统自动调用系统自动调用系统自动调用系统自动调用,其他任何过程都,其他任何过程都,其他任何过程都,其他任何过程都 无法再调用它;无法再调用它;无法再调用它;无法再调用它;通常构造函数被定义在通常构造函数被定义在通
19、常构造函数被定义在通常构造函数被定义在公有公有公有公有部分;部分;部分;部分;3. 构造函数的特点构造函数的特点构造函数名必须和类名相同;构造函数名必须和类名相同;构造函数名必须和类名相同;构造函数名必须和类名相同;构造函数没有返回值;构造函数没有返回值;构造函数没有返回值;构造函数没有返回值;构造函数只能由构造函数只能由构造函数只能由构造函数只能由系统自动调用系统自动调用系统自动调用系统自动调用,其他任何过程都,其他任何过程都,其他任何过程都,其他任何过程都 无法再调用它;无法再调用它;无法再调用它;无法再调用它;通常构造函数被定义在通常构造函数被定义在通常构造函数被定义在通常构造函数被定义
20、在公有公有公有公有部分;部分;部分;部分;如果没有定义构造函数系统会自动生成一个如果没有定义构造函数系统会自动生成一个如果没有定义构造函数系统会自动生成一个如果没有定义构造函数系统会自动生成一个默认默认默认默认 的构造函数的构造函数的构造函数的构造函数; Time( ) hour=0; minute=0; sec=0; class Timeclass Time public: public: void set_time( ); void set_time( ); void show_time( ); void show_time( ); private: / private: /私有数据成员私
21、有数据成员私有数据成员私有数据成员 int hour; int hour; int minute; int minute; int sec; int sec; ; 可以这样定义对象:可以这样定义对象:Time worktime,bedtime;则两个对象的数据成员都初则两个对象的数据成员都初始化为始化为0缺省参数的默认构造函数缺省参数的默认构造函数缺省参数的默认构造函数缺省参数的默认构造函数3. 构造函数的特点构造函数的特点构造函数名必须和类名相同;构造函数名必须和类名相同;构造函数名必须和类名相同;构造函数名必须和类名相同;构造函数没有返回值;构造函数没有返回值;构造函数没有返回值;构造函数
22、没有返回值;构造函数只能由构造函数只能由构造函数只能由构造函数只能由系统自动调用系统自动调用系统自动调用系统自动调用,其他任何过程都,其他任何过程都,其他任何过程都,其他任何过程都 无法再调用它;无法再调用它;无法再调用它;无法再调用它;通常构造函数被定义在通常构造函数被定义在通常构造函数被定义在通常构造函数被定义在公有公有公有公有部分;部分;部分;部分;如果没有定义构造函数系统会自动生成一个如果没有定义构造函数系统会自动生成一个如果没有定义构造函数系统会自动生成一个如果没有定义构造函数系统会自动生成一个默认默认默认默认 的构造函数的构造函数的构造函数的构造函数;构造函数具有普通成员函数的特征
23、,并且构造函数具有普通成员函数的特征,并且构造函数具有普通成员函数的特征,并且构造函数具有普通成员函数的特征,并且可以重可以重可以重可以重 载载载载;3. 构造函数的特点构造函数的特点构造函数名必须和类名相同;构造函数名必须和类名相同;构造函数名必须和类名相同;构造函数名必须和类名相同;构造函数没有返回值;构造函数没有返回值;构造函数没有返回值;构造函数没有返回值;构造函数只能由构造函数只能由构造函数只能由构造函数只能由系统自动调用系统自动调用系统自动调用系统自动调用,其他任何过程都,其他任何过程都,其他任何过程都,其他任何过程都 无法再调用它;无法再调用它;无法再调用它;无法再调用它;通常构
24、造函数被定义在通常构造函数被定义在通常构造函数被定义在通常构造函数被定义在公有公有公有公有部分;部分;部分;部分;如果没有定义构造函数系统会自动生成一个如果没有定义构造函数系统会自动生成一个如果没有定义构造函数系统会自动生成一个如果没有定义构造函数系统会自动生成一个默认默认默认默认 的构造函数的构造函数的构造函数的构造函数;构造函数具有普通成员函数的特征,并且构造函数具有普通成员函数的特征,并且构造函数具有普通成员函数的特征,并且构造函数具有普通成员函数的特征,并且可以重可以重可以重可以重 载载载载;(7)(7)(7)(7)当类对象创建时,构造函数也会自动执行。当类对象创建时,构造函数也会自动
25、执行。当类对象创建时,构造函数也会自动执行。当类对象创建时,构造函数也会自动执行。 class Tpoint public: Tpoint(int x1,int y1) x=x1;y=y1; void disp() coutx“,”yendl; private: int x,y; ; void main() Tpoint a(12,6); *p=new Tpoint(5,12); cout”; a.disp(); cout”; p-disp(); First Point=12,6Second Point=5,12一、构造函数一、构造函数 复制构造函数常用于将一个已知对象的数复制构造函数常用于将
26、一个已知对象的数复制构造函数常用于将一个已知对象的数复制构造函数常用于将一个已知对象的数据成员复制给正在创建的另一个同类的对象。据成员复制给正在创建的另一个同类的对象。据成员复制给正在创建的另一个同类的对象。据成员复制给正在创建的另一个同类的对象。复制构造函数可以像其他构造函数一样定义和复制构造函数可以像其他构造函数一样定义和复制构造函数可以像其他构造函数一样定义和复制构造函数可以像其他构造函数一样定义和使用。使用。使用。使用。4. 复制构造函数复制构造函数3.3 构造函数和析构函数类名类名:复制构造函数复制构造函数(类名类名 &引用名引用名) class Tpoint public: Tpo
27、int(int x1,int y1) x=x1;y=y1; Tpoint(Tpoint &obj) x=obj.x;y=obj.y; void disp() coutx“,”yendl; private: int x,y; ; void main() Tpoint a(12,16),b(a); cout”; a.disp(); cout”; b.disp(); First Point=12,16Second Point=12,16练习:编制一个小游戏。 创建一个宠物类创建一个宠物类Critter,为每一个宠物,为每一个宠物指定一个饥饿级别指定一个饥饿级别Hunger,并且每一个宠物,并且每一个
28、宠物都能够说出一句问候并向世界宣告自己的饥都能够说出一句问候并向世界宣告自己的饥饿级别。饿级别。要求利用构造函数宣告一个新宠物要求利用构造函数宣告一个新宠物的诞生,然后由它确定新宠物的饥饿级别。的诞生,然后由它确定新宠物的饥饿级别。二、析构函数二、析构函数 析构函数的作用与构造函数正好相反,析构函数的作用与构造函数正好相反,析构函数的作用与构造函数正好相反,析构函数的作用与构造函数正好相反,它是用来完成对象被删除前的清理工作的。它是用来完成对象被删除前的清理工作的。它是用来完成对象被删除前的清理工作的。它是用来完成对象被删除前的清理工作的。通常,析构函数是在对象的生存期即将结通常,析构函数是在
29、对象的生存期即将结通常,析构函数是在对象的生存期即将结通常,析构函数是在对象的生存期即将结束时,由系统自动调用的。随后这个对象束时,由系统自动调用的。随后这个对象束时,由系统自动调用的。随后这个对象束时,由系统自动调用的。随后这个对象就消失了,对象所占的内存空间也被释放就消失了,对象所占的内存空间也被释放就消失了,对象所占的内存空间也被释放就消失了,对象所占的内存空间也被释放了。了。了。了。3.3 构造函数和析构函数析构函数的特点:析构函数的特点:析构函数的特点:析构函数的特点:析构函数名是由析构函数名是由析构函数名是由析构函数名是由“” ” ” ” 和类名组成的;和类名组成的;和类名组成的;
30、和类名组成的; 如:如:如:如:TimeTimeTimeTime()()()(); ; ; ;析构函数没有返回值;析构函数没有返回值;析构函数没有返回值;析构函数没有返回值;析构函数没有任何参数;析构函数没有任何参数;析构函数没有任何参数;析构函数没有任何参数;通常析构函数由系统自动调用;通常析构函数由系统自动调用;通常析构函数由系统自动调用;通常析构函数由系统自动调用;析构函数被定义在公有部分;析构函数被定义在公有部分;析构函数被定义在公有部分;析构函数被定义在公有部分; 3.3 构造函数和析构函数#include class COUNT public: COUNT( ); COUNT( ); void process( ); private: int num;COUNT:COUNT( ) num=0;COUNT:COUNT( ) cout“字符数字符数:”numendl;void COUNT: process( ) while(cin.get( )!=n) num+; coutendl; void main( ) COUNT c; cout“输入一个句子输入一个句子:”; c.process( ); 结果结果输入一个句子输入一个句子:Good morning字符数字符数:12