【教学课件】第五章类和对象(一).ppt

上传人:wuy****n92 文档编号:69884463 上传时间:2023-01-10 格式:PPT 页数:73 大小:498.47KB
返回 下载 相关 举报
【教学课件】第五章类和对象(一).ppt_第1页
第1页 / 共73页
【教学课件】第五章类和对象(一).ppt_第2页
第2页 / 共73页
点击查看更多>>
资源描述

《【教学课件】第五章类和对象(一).ppt》由会员分享,可在线阅读,更多相关《【教学课件】第五章类和对象(一).ppt(73页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

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&)三、拷贝初始化构造函数三、拷贝初始化构造函数所引用的对象不可

26、更新所引用的对象不可更新#include#includetpoint1.h“void main()TPoint P1(5,7);TPoint P2(P1);coutP2=P2.Xcoord(),P2.Ycoord()endl;TPoint:TPoint(const TPoint&p)X=p.X;Y=p.Y;coutCopy_initializationConstructorn;例例5.4所引用的对象不可更新所引用的对象不可更新1.明确表示明确表示由一个对象初始化另一对象由一个对象初始化另一对象时:时:如如:TPoint P2(P1);2.对象作函数实参传递对象作函数实参传递给函数形参时:给函数

27、形参时:如如:P=fun(N);用实参用实参N初始化被调用函数的形参初始化被调用函数的形参3.对象作函数返回值对象作函数返回值时:时:如如:return R;系统用对象系统用对象R初始化一个匿名对象初始化一个匿名对象拷贝初始化函数使用场合拷贝初始化函数使用场合例例5.5#include#include tpoint1.hTPoint f(TPoint Q)coutokn;int x,y;x=Q.Xcoord()+10;y=Q.Ycoord()+20;TPoint R(x,y);return R;void main()TPoint M(20,35),P(0,0);TPoint N(M);/由一个

28、对象初始化另一对象由一个对象初始化另一对象P=f(N);/对象作函数实参传递给形参对象作函数实参传递给形参coutP=P.Xcoord(),P.Ycoord()endl;Copy_initialization Constructor.Copy_initialization Constructor.okCopy_initialization Constructor.Destructor Called.Destructor Called.Destructor Called.P=30,55Destructor Called.Destructor Called.Destructor Called.11

29、.拷贝初始化构造函数共使用了三次:拷贝初始化构造函数共使用了三次:Tpoint N(M);时、调用函数时、调用函数f(),实参,实参N给形参给形参对象对象Q初始化时、执行初始化时、执行f()中的返回语句中的返回语句return R;系统用返回值初始化一个匿名对象;系统用返回值初始化一个匿名对象2.析构函数调用三次:退出析构函数调用三次:退出f()时,释放该函数时,释放该函数中定义的对象中定义的对象Q,R,调用两次。返回,调用两次。返回main()时,用赋值运算将匿名对象赋值给对象时,用赋值运算将匿名对象赋值给对象P,然,然后释放匿名对象时调用。最后退出整个程序,后释放匿名对象时调用。最后退出整

30、个程序,又调用三次析构函数,分别释放又调用三次析构函数,分别释放main()中定义中定义的对象的对象M,P和和N。5.4 成员函数的特性成员函数的特性一、内联函数和外联函数一、内联函数和外联函数二、重载性二、重载性三、设置参数的缺省值三、设置参数的缺省值一、内联函数和外联函数一、内联函数和外联函数1.内联函数内联函数2.外联函数外联函数说明在类体内说明在类体内,定义在类体外定义在类体外;注:在函数头前加注:在函数头前加“inline”,使外联函数变内联函数。,使外联函数变内联函数。1)定义在类体内定义在类体内(函数体在类体内函数体在类体内);2)调用函数处用内联函数体代码来替换,节省调用开调用

31、函数处用内联函数体代码来替换,节省调用开销,提高运行速度;销,提高运行速度;4)在调用前定义,无法递归调用!在调用前定义,无法递归调用!3)优于宏定义,优于宏定义,遵循函数类型和作用域规则遵循函数类型和作用域规则;例例5.6class A public:A(int x,int y)X=x;Y=y;int a()return X;int b()return Y;int c();int d();private:int X,Y;inline int A:c()return a()+b();inline int A:d()return c();内联函数内联函数 外联函数外联函数变变内联函数内联函数二、

32、重载性二、重载性v一个函数名对应多个函数的实现一个函数名对应多个函数的实现v一般成员函数可以一般成员函数可以,构造函数可以构造函数可以,析构函数不可重载析构函数不可重载!例例5.7 class M public:M(int x,int y)X=x;Y=y;M(int x)X=x;Y=x*x;int Add(int x,int y);int Add(int x);int Add();int Xout()return X;int Yout()return Y;private:int X,Y;构造函数重载构造函数重载成员函数重载成员函数重载例例5.7#includevoid main()M a(10

33、,20),b(4);couta=a.Xout(),a.Yout()endl;coutb=b.Xout(),b.Yout()endl;int i=a.Add();/i=10+20int j=a.Add(3,9);/j=3+9int k=b.Add(5);/k=5+5coutiendljendlkendl;int M:Add(int x,int y)X=x;Y=y;return X+Y;int M:Add(int x)X=Y=x;return X+Y;int M:Add()return X+Y;a=10,20 b=4,16301210 M(int x,int y)X=x;Y=y;M(int x)X

34、=x;Y=x*x;三、设置参数的缺省值三、设置参数的缺省值class N public:N(int a=3,int b=5,int c=7);/构造函数缺省值构造函数缺省值 int Aout()return A;int Bout()return B;int Cout()return C;private:int A,B,C;N:N(int a,int b,int c)A=a;B=b;C=c;v一般成员函数和构造函数都可以设置参数缺省值一般成员函数和构造函数都可以设置参数缺省值例例5.8例例5.8#includevoid main()N X,Y(9,11),Z(13,15,17);coutX=X.

35、Aout(),X.Bout(),X.Cout();coutendl;coutY=Y.Aout(),Y.Bout(),Y.Cout();coutendl;coutZ=Z.Aout(),Z.Bout(),Z.Cout();coutendl;class N public:N(int a=3,int b=5,int c=7);;X=3,5,7 Y=9,11,7 Z=13,15,175.5 静态静态成员成员一、静态数据成员一、静态数据成员二、静态成员函数二、静态成员函数数据共享问题:数据共享问题:#includeint g=5;/全局变量全局变量void f1(),f2();void main()g=1

36、0;f1();f2();coutgendl;void f1()g=15;void f2()g=20;例例5.920全局量:可见范围无法控制,全局量:可见范围无法控制,在整个程序内都可见,不仅在整个程序内都可见,不仅仅限定在同一个类的对象内仅限定在同一个类的对象内(不安全不安全)一、静态数据成员一、静态数据成员2.特点:特点:只存储一次只存储一次,节省内存,供类的所有,节省内存,供类的所有对象共享;对象共享;1.作用:实现作用:实现多个对象间的数据共享多个对象间的数据共享,不破,不破坏隐藏原则,保证安全性(值属于整个类,坏隐藏原则,保证安全性(值属于整个类,不仅仅是某个对象的不仅仅是某个对象的)

37、;);静态数据成员的值静态数据成员的值对每个对象都是一样的对每个对象都是一样的;任何一个对象都可以改变静态数据成员的值;任何一个对象都可以改变静态数据成员的值;只要静态数据成员的值更新一次,则所有对象存只要静态数据成员的值更新一次,则所有对象存取更新后相同的值!取更新后相同的值!3.使用方法、注意事项:使用方法、注意事项:1)定义时,加定义时,加“static”;2)初始化初始化 :=;:3)引用引用v 在在类类体外体外,不加,不加static;v 不加访问权限控制符;不加访问权限控制符;/这不用说啊这不用说啊v 用作用域运算符用作用域运算符表明表明它它所属的类所属的类;v 必须进行初始化;必

38、须进行初始化;不在类不在类体内体内不在构造不在构造函数内函数内 例例5.10#include class Myclass public:Myclass(int a,int b,int c);void GetNumber();void GetSum();private:int A,B,C;Static int sum;/定义定义;void Myclass:GetNumber()coutNumber=;coutA,B,Cendl;void Myclass:GetSum()coutSum=sumendl;Myclass:Myclass(int a,int b,int c)A=a;B=b;C=c;su

39、m+=A+B+C;void main()Myclass M(3,7,10),N(14,9,11);M.GetNumber();N.GetNumber();M.GetSum();N.GetSum();Number=3,7,10 Number=14,9,11 Sum=54 Sum=54int Myclass:sum=0;/初始化初始化二、静态成员函数二、静态成员函数1.调用格式调用格式2.用途用途一般用于直接操作静态数据成员一般用于直接操作静态数据成员q 属于类的静态成员,不是对象的成员属于类的静态成员,不是对象的成员:()可以可以直接引用直接引用类中的类中的静态数据成员静态数据成员;不能直接引用

40、类中定义的非静态成员(通不能直接引用类中定义的非静态成员(通过过“对象对象”来引用非静态成员)来引用非静态成员)静态数据成员可以通过对象来引用静态数据成员可以通过对象来引用 例例5.11#include class M public:M(int a)A=a;B+=a;Static void f1(M m);private:int A;static int B;void main()M P(5),Q(10);M:f1(P);/不用对象不用对象 M:f1(Q);/直接引用直接引用 P.f1(P);/可以吗可以吗?对对 A=5 B=15 A=10 B=15int M:B=0;/初始初始化化void

41、M:f1(M m)cout“A=”m.Aendl;/非静态成非静态成员员 cout“B=”Bendl;/静态成员静态成员/cout“B=”m.Bendl;/也可也可以以5.6 友元友元定义在类体外定义在类体外的普通函数;的普通函数;在类体内用在类体内用“friend”说明说明;非成员函数非成员函数,但可以,但可以访问类中的私有成员访问类中的私有成员;提高程序的运行效率,但破坏了类的封装性提高程序的运行效率,但破坏了类的封装性和隐藏性。和隐藏性。一、友元函数一、友元函数#include#include class Point public:Point(double xx,double yy)x=

42、xx;y=yy;void Getxy();friend double Distance(Point&a,Point&b);/友元函数说明友元函数说明 private:double x,y;q能够访问类中私有成员的非成员函数能够访问类中私有成员的非成员函数(普通函数普通函数)例例5.12 私有数据成员私有数据成员 例例5.12 void main()Point p1(3.0,4.0),p2(6.0,8.0);p1.Getxy();p2.Getxy();/成员函数调用成员函数调用 double d=Distance(p1,p2);/友元函数调用友元函数调用 coutDistance is dend

43、l;(3.0,4.0)(6.0,8.0)Distance is 5void Point:Getxy()cout(x,y)endl;double Distance(Point&a,Point&b)double dx=a.x-b.x;double dy=a.y-b.y;return sqrt(dx*dx+dy*dy);友元函数,友元函数,类外的普类外的普通函数通函数访问类中私有数据成员访问类中私有数据成员成员函数成员函数 例例5.13#include#include class Time public:Time(int new_hours,int new_minutes)hours=new_hou

44、rs;minutes=new_minutes;friend void Time24(Time time);friend void Time12(Time time);private:int hours,minutes;私有成员私有成员void Time24(Time time)couttime.hours:time.minutes12)time.hours-=12;couttime.hours:time.minutes PMendl;else couttime.hours:time.minutes AMendl;友元函数友元函数 例例5.13 修改修改class Time public:Tim

45、e(int new_hours,int new_minutes)hours=new_hours;minutes=new_minutes;friend void Time24(Time&time);friend void Time12(Time&time);private:int hours,minutes;void Time24(Time&time)couttime.hours:time.minutes12)time.hours-=12;couttime.hours:time.minutes PMendl;else couttime.hours:time.minutes AMendl;友元函数

46、友元函数void main()Time Time1(20,30),Time2(10,45);Time12(Time1);Time24(Time1);/此时的此时的Time1是被是被 Time12(Time2);/Time12()改过的了改过的了 Time24(Time2);8:30 PM 8:30 10:45 AM 10:45二、友元类二、友元类#include class X friend class Y;public:void Set(int i)x=i;void Display()coutx=x,;couty=yendl;private:int x;static int y;q一个类作为

47、另一个类的友员一个类作为另一个类的友员q友员类的所有成员函数友员类的所有成员函数都是另一个类的都是另一个类的友员函数友员函数 例例5.14 私有成员私有成员说明友元类说明友元类Y 例例5.14 x=5,y=1x=6,y=9x=5,y=9void Y:Display()coutx=a.x,;couty=X:y endl;void main()X b;b.Set(5);b.Display();Y c(6,9);c.Display();b.Display();class Y public:Y(int i,int j);void Display();private:X a;int X:y=1;/初始化

48、初始化Y:Y(int i,int j)a.x=i;X:y=j;友元类友元类访问访问X类中私有成员类中私有成员x、y5.7 类的作用域类的作用域简称简称“类域类域”,指类的作用范围,即,指类的作用范围,即类定类定义义和相应的和相应的成员函数定义成员函数定义范围;范围;类域一般介于文件域和函数域之间;类域一般介于文件域和函数域之间;类域中定义的变量和函数可用类域中定义的变量和函数可用static修饰;修饰;void A:Move(int dx,int dy)/成员函数定义成员函数定义 X+=dx;Y+=dy;class A public:A(int x,int y)X=x;Y=y;int Xcoo

49、rd()return X;int Ycoord()return Y;void Move(int dx,int dy);/成员函数说明成员函数说明 private:int X,Y;5.8 局部类和嵌套类局部类和嵌套类一、局部类一、局部类 定义在定义在函数体内函数体内的类的类;局部类的类名隐藏在函数体内,该类的所有局部类的类名隐藏在函数体内,该类的所有 成员函数都定义在类体内成员函数都定义在类体内;二、嵌套类二、嵌套类 定义在定义在类体内类体内的类;的类;/这在这在C C中是不可想象的中是不可想象的 定义嵌套类的类称外围类定义嵌套类的类称外围类(主从关系主从关系);注:局部类和嵌套类较少使用。注:

50、局部类和嵌套类较少使用。5.9 对象的生存期对象的生存期q生存期:从被生存期:从被创建创建开始到被开始到被释放释放为止的时间为止的时间1)程序开始程序开始时,创建;时,创建;程序结束程序结束时,释放;时,释放;2)作用域:作用域:整个程序整个程序。1.局部对象局部对象1)对象被定义对象被定义时,调用构造函数,创建;时,调用构造函数,创建;退出定义该对象退出定义该对象的函数体或程序块的函数体或程序块时,调用析构函数,释放;时,调用析构函数,释放;2)作用域:作用域:定义该对象的函数体或程序块内定义该对象的函数体或程序块内;2.静态对象静态对象1)程序第一次执行定义的静态对象程序第一次执行定义的静

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

当前位置:首页 > 教育专区 > 大学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁