【教学课件】第五章类和对象(一).ppt
《【教学课件】第五章类和对象(一).ppt》由会员分享,可在线阅读,更多相关《【教学课件】第五章类和对象(一).ppt(73页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第五章第五章 类和对象类和对象(一一)5.15.1 类的定义类的定义5.25.2 对象的定义对象的定义5.35.3 对象的初始化对象的初始化5.45.4 成员函数的特性成员函数的特性5.55.5 静态成员静态成员5.65.6 友员友员5.75.7 类的作用域类的作用域5.85.8 局部类和嵌套类局部类和嵌套类5.95.9 对象的生存期对象的生存期5.1 类的定义类的定义v类是面向对象程序设计的核心,是一种新的数据类型类是面向对象程序设计的核心,是一种新的数据类型一、什么是类一、什么是类二、类的定义格式二、类的定义格式三、定义类时注意事项三、定义类时注意事项q用户定义的抽象数据类型,是实现数据封
2、装用户定义的抽象数据类型,是实现数据封装的工具;的工具;一种复杂的数据类型,是一种复杂的数据类型,是不同类型的数据不同类型的数据以及对这些数据的以及对这些数据的相关操作相关操作的的封装体。封装体。q通过类的内部数据结构和相关操作确定一类通过类的内部数据结构和相关操作确定一类对象的行为,行为通过操作接口来描述。对象的行为,行为通过操作接口来描述。q创建对象的模板;创建对象的模板;一、什么是类一、什么是类二、类的定义格式二、类的定义格式class public:private:;说明部分说明部分 实现部分实现部分q类的定义分为两部分:类的定义分为两部分:说明部分说明部分和和实现部分实现部分q类的成
3、员包括类的成员包括数据成员数据成员和和成员函数成员函数(方法方法)注:如果所有成员函数都在类体内定义,实现部分可省略!但注:如果所有成员函数都在类体内定义,实现部分可省略!但 那是内联函数那是内联函数1.类中成员的访问权限类中成员的访问权限1)公有的公有的public:通常是一些通常是一些成员函数成员函数(操作操作/方法方法),作为类的,作为类的对外接口对外接口,可以被类体内外的程序访问,可以被类体内外的程序访问;2)私有的私有的private:通常是通常是数据成员数据成员,描述对象的属,描述对象的属性,用来隐藏的部分,性,用来隐藏的部分,类体外不可见类体外不可见,只有成员函,只有成员函数和友
4、员函数可以访问数和友员函数可以访问;3)保护的保护的protected:类内及派生类的成员函数类内及派生类的成员函数可以访问。可以访问。访问权限修饰符访问权限修饰符private、public、protected 在类体内出现的先后次序无关,允许多次出现在类体内出现的先后次序无关,允许多次出现 缺省访问权限控制符:缺省访问权限控制符:private例:日期类例:日期类 TDateclass TDate public:void SetDate(int y,int m,int d);int IsLeapYear();void Print();private:int year,month,day;类
5、名类名说说明明部部分分成员函数成员函数数据成员数据成员例:日期类例:日期类 Tdate void TDate:Print()coutyear“-”month“-”dayendl;int TDate:IsLeapYear()return(year%4=0&year%100!=0)|(year%400=0);void TDate:SetDate(int y,int m,int d)year=y;month=m;day=d;类名类名成员函数成员函数作用域运算符作用域运算符2.作用域运算符作用域运算符q 成员函数定义在类体外成员函数定义在类体外时,应标识成员函数所属的类时,应标识成员函数所属的类:()
6、void Tdate:SetDate(int y,int m,int d)year=y;month=m;day=d;作用域运算符作用域运算符v若成员函数定义在类体内,则无需标识所属类;若成员函数定义在类体内,则无需标识所属类;v若所有成员函数都在类体内定义,则若所有成员函数都在类体内定义,则“实现部分实现部分”省省略!略!v定义在类体内的成员函数是定义在类体内的成员函数是inlineinline函数。函数。class TDate public:void SetDate(int y,int m,int d)year=y;month=m;day=d;int IsLeapYear()return(y
7、ear%4=0&year%100!=0)|(year%400=0);void Print()coutyear“.”month“.”dayendl;private:int year,month,day;成员函数定义成员函数定义三、定义类时应注意事项三、定义类时应注意事项1.类体中不允许对所定义的数据成员初始化类体中不允许对所定义的数据成员初始化 class TDate public:private:int year(1998),month(4),day(9);()a)整形、浮点型、字符型、数组、指针、引用整形、浮点型、字符型、数组、指针、引用;b)另一个类的对象;另一个类的对象;c)自身类的指针
8、或引用,但自身类的指针或引用,但自身类的对象不可以自身类的对象不可以!class N;class M public:private:N n;/n是是N类的对象类的对象;class N ;例:例:/类类N的提前说明的提前说明 2.类中数据成员的类型任意类中数据成员的类型任意4.习惯上将类的说明部分或整个定义部分习惯上将类的说明部分或整个定义部分(包包括实现部分括实现部分)放在一个头文件中放在一个头文件中比较方便。如:定义日期类如:定义日期类TDate的头文件的头文件 tdate.h3.一般在类体内先说明公有成员,后说明私有一般在类体内先说明公有成员,后说明私有成员;成员;比较方便。程序中引用时:
9、程序中引用时:#include“tdate.h”5.2 对象的定义对象的定义一、对象的定义格式一、对象的定义格式二、对象成员的表示方法二、对象成员的表示方法v对象是类的具体实例对象是类的具体实例v定义对象前,先定义该对象所属的类定义对象前,先定义该对象所属的类一、对象的定义格式一、对象的定义格式 中可以是一般的对象名、指向对象的中可以是一般的对象名、指向对象的指针或引用名、对象数组名等指针或引用名、对象数组名等例:例:TDate date1,date2,*Pdate,date31;例:例:TStack stack1,stack2,*Pstack,&rstack=stack1;对象指针对象指针对
10、象引用对象引用对象数组对象数组二、对象成员的表示二、对象成员的表示注:引用对象的成员表示与一般对象的成员表示相同注:引用对象的成员表示与一般对象的成员表示相同数据成员:数据成员:.成员函数:成员函数:.()例:例:date1.year,date1.month,date1.day例:例:date1.SetDate(int y,int m,int d)例:例:rstack.number1.一般对象一般对象成员运算符成员运算符例:例:Pdateyear,Pdatemonth,Pdateday例:例:PdateSetDate(int y,int m,int d)2.指向对象的指针指向对象的指针数据成员
11、数据成员(*).成员函数成员函数()(*).()成员运算符成员运算符作用对象:指针作用对象:指针例:例:Pdateyear (*Pdate).year例例5.1#include#include“tdate.h”/文件包含命令文件包含命令 void main()TDate date1,date2;/定义定义Tdate类的两个对象类的两个对象date1.SetDate(1996,5,4);/通过成员函数为对象赋值通过成员函数为对象赋值date2.SetDate(1998,4,9);int leap=date1.IsLeapYear();coutleapendl;date1.Print();date
12、2.Print();/调用成员函数显示数据成员调用成员函数显示数据成员值值 1 1996-5-4 1998-4-9例例5.2头文件头文件tpoint.hclass TPoint public:void SetPoint(int x,int 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
13、;void TPoint:Move(int xOffset,int yOffset)X+=xOffset;Y+=yOffset;例例5.2#include#includetpoint.h void main()TPoint p1,p2;p1.SetPoint(3,5);p2.SetPoint(8,10);p1.Move(2,1);p2.Move(1,-2);coutx1=p1.Xcoord(),y1=p1.Ycoord()endl;coutx2=p2.Xcoord(),y2=p2.Ycoord()endl;x1=5,y1=6x2=9,y2=8 class TPoint public:int X
14、coord()return X;int Ycoord()return Y;调用成员函数显示数据成员的值调用成员函数显示数据成员的值例例5.2#include#includetpoint.hvoid main()TPoint p1,p2;p1.SetPoint(3,5);p2.SetPoint(8,10);p1.Move(2,1);p2.Move(1,-2);coutx1=p1.X ,y1=p1.Ycoord()endl;coutx2=p2.X ,y2=p2.Ycoord()endl;Error:can not access private member!class TPoint public:
15、private:int X,Y;?类体外直接访问数据成员类体外直接访问数据成员5.3 对象的初始化对象的初始化一、构造函数和析构函数一、构造函数和析构函数二、缺省构造函数和缺省析构函数二、缺省构造函数和缺省析构函数三、拷贝初始化构造函数三、拷贝初始化构造函数q定义一个对象时,系统通过调用构造函数对该对象定义一个对象时,系统通过调用构造函数对该对象进行初始化进行初始化一、构造函数和析构函数一、构造函数和析构函数q在类体中说明的两种在类体中说明的两种特殊的成员函数特殊的成员函数;q函数体可以写在类体内或类体外;函数体可以写在类体内或类体外;构造构造函数:函数:创建对象创建对象时,为对象作初始化时,
16、为对象作初始化析构析构函数:函数:释放对象释放对象,与构造函数功能相反,与构造函数功能相反class TDate1 public:TDate1(int y,int m,int d);/构造函数说明构造函数说明 TDate1();/析构函数说明析构函数说明 void Print();private:int year,month,day;TDate1:TDate1(int y,int m,int d)/构造函数定义构造函数定义 year=y;month=m;day=d;coutConstructor called.n;/无法声明不初始化的对象,否则必须有不初始化的构造函数无法声明不初始化的对象,否
17、则必须有不初始化的构造函数TDate1:TDate1()/析构函数定义析构函数定义 cout Destructor called.n;void TDate1:Print()coutyear-month-dayendl;例:例:头文件头文件tdate1.h1)函数名函数名同类名同类名;2)定义时定义时不指定类型不指定类型;3)0个、个、1个或多个参数个或多个参数;4)可以重载可以重载、设置默认参数、设置默认参数;5)创建对象时创建对象时由系统自动调由系统自动调用用。构造函数特点:构造函数特点:1)同类名同类名,前面加前面加“”;2)定义时定义时不指定类型不指定类型;3)没有参数没有参数;4)不能
18、重载不能重载,在类中唯一在类中唯一;5)可以由系统调用,也可以可以由系统调用,也可以在程序中被调用。在程序中被调用。析构函数特点:析构函数特点:析构函数的自动调用:析构函数的自动调用:a)函数体内定义的对象,当函数体内定义的对象,当函数结束时函数结束时,自动调用析构函数;,自动调用析构函数;b)new动态创建的对象,用动态创建的对象,用delete释放释放时,自动调用析构函数。时,自动调用析构函数。#include#includetdate1.hvoid main()TDate1 today(1998,4,6),tomorrow(1998,4,7);couttoday is ;today.Pr
19、int();couttomorrow is ;tomorrow.Print();TDate1:TDate1(int y,int m,int d)year=y;month=m;day=d;coutConstructor called.n;TDate1:TDate1()coutDestructor called.n;Constructor Called.Constructor Called.today is 1998-4-6tomorrow is 1998-4-7 Destructor Called.Destructor Called.例例5.3思考:析构函数调用的顺序?思考:析构函数调用的顺序?
20、TDate1:TDate1()/析构函数析构函数 coutyear“-month“-day“Destructor.n;1998-4-6 Constructor.1998-4-7 Constructor.today is 1998-4-6tomorrow is 1998-4-7 1998-4-7 Destructor.1998-4-6 Destructor.TDate1:TDate1(int y,int m,int d)/构造函数构造函数 year=y;month=m;day=d;coutyear-month-dayConstructor.n;例例5.3 修改修改析构函数的调用顺序与构析构函数的
21、调用顺序与构造函数的调用顺序相反造函数的调用顺序相反!二、缺省构造函数和缺省析构函数二、缺省构造函数和缺省析构函数1.缺省构造函数缺省构造函数:()无参数无参数1)未定义未定义任何任何构造函数时构造函数时,编译器,编译器自动生成自动生成;2)用户可自定义缺省构造函数用户可自定义缺省构造函数;3)程序中定义对象但程序中定义对象但没有指明初始化没有指明初始化时,则时,则按缺省按缺省构造函数初始化对象构造函数初始化对象。注:注:VC+环境下,对象数据成员的值是随机的!环境下,对象数据成员的值是随机的!2.缺省析构函数缺省析构函数:()1)未定义析构函数时,由编译器自动生成;未定义析构函数时,由编译器
22、自动生成;2)空函数。空函数。二、缺省构造函数和缺省析构函数二、缺省构造函数和缺省析构函数无参无参数数三、拷贝初始化构造函数三、拷贝初始化构造函数1)是是一种一种构造函数构造函数,不指定返回值类型;,不指定返回值类型;2)只有一个参数只有一个参数,是对某个,是对某个对象的引用对象的引用;3)每个类必有;若无,编译器自动生成。每个类必有;若无,编译器自动生成。2.特点:特点:用一个已知对象来初始化一个被创建的同类对象用一个已知对象来初始化一个被创建的同类对象(拷贝已知对象的数据成员的值)(拷贝已知对象的数据成员的值)1.功能:功能::(&)例例5.4class TPoint public:TPo
23、int(int x,int y)X=x;Y=y;/构造函数构造函数TPoint(TPoint&p);/拷贝初始化构造函数说明拷贝初始化构造函数说明TPoint()cout“Destructor called.n”;/析构函数析构函数int Xcoord()return X;int Ycoord()return Y;private:int X,Y;头文件头文件tpoint1.hTPoint:TPoint(TPoint&p)/拷贝初始化构造函数定义拷贝初始化构造函数定义 X=p.X;Y=p.Y;/p.X=0;p.Y=0;/compare with the const declarationcout
24、Copy_initialization Constructorn;用已知对象初始化被创建的同类对象用已知对象初始化被创建的同类对象#include#includetpoint1.hvoid main()TPoint P1(5,7);TPoint P2(P1);coutP2=P2.Xcoord(),P2.Ycoord()endl;TPoint:TPoint(TPoint&p)X=p.X;Y=p.Y;coutCopy_initializationConstructorn;Copy_ initialization Constructor.P2=5,7 Destructor Called.Destru
25、ctor Called.例例5.41)是是一种构造函数,不指定返回值类型;一种构造函数,不指定返回值类型;2)只有一个参数,是对某个对象的引用;只有一个参数,是对某个对象的引用;3)每个类必有;若无,编译器自动生成。每个类必有;若无,编译器自动生成。4)无法在新对象内改变被拷贝的原对象属性(见前例)无法在新对象内改变被拷贝的原对象属性(见前例)2.特点:特点:用一个已知对象来初始化一个被创建的同类对象用一个已知对象来初始化一个被创建的同类对象(拷贝已知对象的数据成员的值)(拷贝已知对象的数据成员的值)1.功能:功能::(const&)三、拷贝初始化构造函数三、拷贝初始化构造函数所引用的对象不可
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 教学课件 教学 课件 第五 对象
限制150内