C++程序设计:第8章 类和对象

上传人:努力****83 文档编号:127522009 上传时间:2022-07-30 格式:PPTX 页数:68 大小:214.70KB
收藏 版权申诉 举报 下载
C++程序设计:第8章 类和对象_第1页
第1页 / 共68页
C++程序设计:第8章 类和对象_第2页
第2页 / 共68页
C++程序设计:第8章 类和对象_第3页
第3页 / 共68页
资源描述:

《C++程序设计:第8章 类和对象》由会员分享,可在线阅读,更多相关《C++程序设计:第8章 类和对象(68页珍藏版)》请在装配图网上搜索。

1、第第八八章章 类和对象类和对象 面向对象的程序设计面向对象的程序设计1手机(手机(对象对象)具有属性具有属性品牌,型号,价格,颜色,是否触摸屏品牌,型号,价格,颜色,是否触摸屏具有功能(行为)具有功能(行为)打电话,发短信,发微信,打电话,发短信,发微信,QQ聊天聊天2任何一个对象都应当具有这两个要素任何一个对象都应当具有这两个要素,一一是属性是属性(attribute)二二是行为是行为(behavior),即即能根据外界给的信息进行能根据外界给的信息进行相应的操作相应的操作。对象对象是由一组属性和一组行为构成的。是由一组属性和一组行为构成的。3面向对象的程序设计采用了以上人们所熟悉的这面向对

2、象的程序设计采用了以上人们所熟悉的这种思路。使用面向对象的程序设计方法设计一个种思路。使用面向对象的程序设计方法设计一个复杂的软件系统时,复杂的软件系统时,首要的问题是确定该系统是首要的问题是确定该系统是由哪些对象组成的,并且设计这些对象。在由哪些对象组成的,并且设计这些对象。在C+中,中,每个对象都是由数据和函数每个对象都是由数据和函数(即操作代码即操作代码)这两部分这两部分组成的。组成的。4使用对象的人完全可以不必知道对象内部的使用对象的人完全可以不必知道对象内部的具体细节,只需了解其外部功能即可自如地具体细节,只需了解其外部功能即可自如地操作对象。操作对象。面向对象的编程:面向对象的编程

3、:把把对象的内部实现和外部行为分隔开来。对象的内部实现和外部行为分隔开来。5传统的面向过程程序设计是围绕功能进行的,用传统的面向过程程序设计是围绕功能进行的,用一个函数实现一个功能。一个函数实现一个功能。所有的数据都是公用的所有的数据都是公用的,一个函数可以使用任何一组数据,而一组数据又一个函数可以使用任何一组数据,而一组数据又能被多个函数所使用。程序设计者必须考虑每一能被多个函数所使用。程序设计者必须考虑每一个细节,什么时候对什么数据进行操作个细节,什么时候对什么数据进行操作。面向对象程序设计采取的是另外一种思路。它面面向对象程序设计采取的是另外一种思路。它面对的是一个个对象。实际上,每一组

4、数据都是有对的是一个个对象。实际上,每一组数据都是有特定的用途的,是某种操作的对象。也就是说,特定的用途的,是某种操作的对象。也就是说,一组操作调用一组数据一组操作调用一组数据。6程序设计者的任务包括两个方面:一是程序设计者的任务包括两个方面:一是设计所需的各种类和对象,即决定把哪些数设计所需的各种类和对象,即决定把哪些数据和操作封装在一起;二是考虑怎样向有关据和操作封装在一起;二是考虑怎样向有关对象发送消息,以完成所需的任务。对象发送消息,以完成所需的任务。各个对各个对象的操作完成了,整体任务也就完成了。象的操作完成了,整体任务也就完成了。因此人们设想把相关的数据和操作放在因此人们设想把相关

5、的数据和操作放在一起,形成一个整体,与外界相对分隔一起,形成一个整体,与外界相对分隔。这。这就是面向对象的程序设计中的对象。就是面向对象的程序设计中的对象。7程序程序=算法数据结构算法数据结构在面向过程的结构化程序设计中,人们常使在面向过程的结构化程序设计中,人们常使用这样的公式来表述程序用这样的公式来表述程序 8对象对象 =算法算法 数据结构数据结构程序程序=(=(对象对象+对象对象+对象对象+)+)+消息消息 消息的作用就是对对象的控制。消息的作用就是对对象的控制。程序设计的关键是设计好每一个对象以及确程序设计的关键是设计好每一个对象以及确定向这些对象发出的命令,使各对象完成相定向这些对象

6、发出的命令,使各对象完成相应的操作。应的操作。面向对象的程序组成:面向对象的程序组成:9每一个实体都是对象。有一些对象是具有相每一个实体都是对象。有一些对象是具有相同的结构和特性的。同的结构和特性的。每个对象都属于一个特定的类型。每个对象都属于一个特定的类型。在在C+C+中对象的类型称为类中对象的类型称为类(class)(class)。类代表类代表了某一批对象的共性和特征。了某一批对象的共性和特征。类是对象的抽类是对象的抽象,而对象是类的具体实例象,而对象是类的具体实例(instance)(instance)。10类是一种复杂的数据类是一种复杂的数据类型类型,它是将,它是将不同类型不同类型的数

7、据的数据和和与这些数据相关的运算与这些数据相关的运算封装在一起封装在一起的的 集合体。集合体。类的定义类的定义类将一些数据及与数据相关的类将一些数据及与数据相关的函数函数封装在一封装在一起,使类中的数据得到很好的起,使类中的数据得到很好的“保护保护”。在。在大型程序中不会被随意修改。大型程序中不会被随意修改。11类的定义格式:类的定义格式:class 类名类名 private:成员数据成员数据;成员函数;成员函数;public:成员数据成员数据;成员函数;成员函数;protected:成员数据成员数据;成员函数;成员函数;;关键字关键字类名类名私有私有公有公有保护保护class Student

8、 private:char Name20;float Math;float Chiese;public:float average;void SetName(char*name);void SetMath(float math);void SetChinese(float ch);float GetAverage(void);分号不能少分号不能少12用关键字用关键字priviate限定的成员称为限定的成员称为私有成员私有成员,对私有成员对私有成员限定在该类的内部使用限定在该类的内部使用,即,即只只允许该类中的成员函数使用私有的成员数允许该类中的成员函数使用私有的成员数据据,对于私有的成员函数,

9、只能被,对于私有的成员函数,只能被该类内该类内的成员函数调用的成员函数调用;类就相当于私有成员的;类就相当于私有成员的作用域。作用域。13用关键字用关键字public限定的成员称为限定的成员称为公有成员公有成员,公有成员的数据或函数不受类的限制,公有成员的数据或函数不受类的限制,可以可以在类内或类外自由使用在类内或类外自由使用;对类而言是透明的。;对类而言是透明的。14而用关键字而用关键字protected所限定的成员称为所限定的成员称为保保护成员护成员,只允许在类内及该类的派生类中使,只允许在类内及该类的派生类中使用保护的数据或函数。即保护成员的作用域用保护的数据或函数。即保护成员的作用域是

10、是该类及该类的派生类该类及该类的派生类。15私有成员私有成员公有成员公有成员保护成员保护成员类内函数类内函数可以调用可以调用可以调用可以调用可以调用可以调用类外函数类外函数不可调用不可调用可以调用可以调用不可调用不可调用私有函数私有函数 公有函数公有函数保护函数保护函数类内函数类内函数可以调用可以调用 可以调用可以调用可以调用可以调用类外函数类外函数不可调用不可调用 可以调用可以调用不可调用不可调用16每一个限制词每一个限制词(private等等)在类体中可使用多在类体中可使用多次。一旦使用了限制词,该限制词一直有效,次。一旦使用了限制词,该限制词一直有效,直到下一个限制词开始为止。直到下一个

11、限制词开始为止。如果未加说明,类中成员默认的访问权限是如果未加说明,类中成员默认的访问权限是private,即私有的。,即私有的。17class Studentchar Name20;float Math;float Chiese;public:float average;void SetName(char*name);void SetMath(float math);void SetChinese(float ch);float GetAverage(void);均为私有权限均为私有权限均为公有权限均为公有权限18class A float x,y;public:void Setxy(flo

12、at a,float b)x=a;y=b;void Print(void)coutxtyendl;xySetxy()Print()A私有数据私有数据公有函数公有函数在在类外不能直接使用类外不能直接使用 x 或或 y,必须通过,必须通过Setxy()给给 x 或或 y 赋值,通过赋值,通过Print()输出输出 x 或或 y。19成员函数与成员数据的定义不分先后,可以先说成员函数与成员数据的定义不分先后,可以先说明明函数原型函数原型,再在类体外定义函数体。,再在类体外定义函数体。class A float x,y;public:void Setxy(float a,float b)x=a;y=b

13、;void Print(void)coutxtyendl;在类体内定在类体内定义成员函数义成员函数20class A float x,y;public:void Setxy(float a,float b);void Print(void);;void A:Setxy(float a,float b)x=a;y=b;void A:Print(void)coutxtyendl;在类体内说明在类体内说明成员函数原型成员函数原型在类体外定在类体外定义成员函数义成员函数21 :()./函数体函数体在类体外定义成员函数的格式:在类体外定义成员函数的格式:void A:Setxy(float a,floa

14、t b)x=a;y=b;函数类型函数类型类名类名函数名函数名形参列表形参列表函数体函数体22在定义一个类时,要注意如下几点:在定义一个类时,要注意如下几点:1、类具有封装性,并且类只是定义了一种结构(样板),、类具有封装性,并且类只是定义了一种结构(样板),所以所以类中的任何成员数据均不能使用关键字类中的任何成员数据均不能使用关键字extern,auto或或register限定其存储类型限定其存储类型。2、在定义类时,只是定义了一种导出的数据类型,、在定义类时,只是定义了一种导出的数据类型,并不并不为类分配存储空间为类分配存储空间,所以,在定义类中的数据成员时,所以,在定义类中的数据成员时,不

15、能对其初始化不能对其初始化。如:。如:class Test int x=5,y=6;/是不允许的是不允许的 extern float x;/是不允许的是不允许的 23在在C+语言中,语言中,结构体类型结构体类型只是类的一个特只是类的一个特例。结构体类型与类的唯一的区别在于:例。结构体类型与类的唯一的区别在于:在在类中,其成员的缺省的存取权限是私有的;类中,其成员的缺省的存取权限是私有的;而在结构体类型中,其成员的缺省的存取权而在结构体类型中,其成员的缺省的存取权限是公有的。限是公有的。24 内联成员函数内联成员函数 当我们定义一个类时,当我们定义一个类时,可以可以在类中直接定义函数体在类中直接

16、定义函数体。这时成员函数在编译时是作为。这时成员函数在编译时是作为内联内联函数函数来实现的。来实现的。同时,我们也可以在类体外定义类的内联成员函数,在类体内说明函数,同时,我们也可以在类体外定义类的内联成员函数,在类体内说明函数,在类体外定义在类体外定义时,在成员函数的定义前面加上关键字时,在成员函数的定义前面加上关键字inline。class A float x,y;public:void Setxy(float a,float b);void Print(void);;inline void A:Setxy(float a,float b)x=a;y=b;inline void A:Pri

17、nt(void)coutxtyendl;说明该成员函数为内联说明该成员函数为内联25对象对象只有在定义了属于类的变量后,系统才会为只有在定义了属于类的变量后,系统才会为类的类的变量变量分配空间。分配空间。在定义类时,只是定义了一种在定义类时,只是定义了一种数据类型数据类型,即即说明程说明程序中可能会出现该类型的数据,序中可能会出现该类型的数据,并不为类分配存储并不为类分配存储空间。空间。类的变量我们称之为类的变量我们称之为对象对象。对象是类的实例对象是类的实例,定义对象之前,一定要先说明该,定义对象之前,一定要先说明该对象的类。对象的类。26不同对象占据内存中的不同区域,它们所保存的不同对象占

18、据内存中的不同区域,它们所保存的数据各不相同,但数据各不相同,但对成员数据进行操作的成员函对成员数据进行操作的成员函数的程序代码均是一样的数的程序代码均是一样的。存储类型存储类型类名类名 对象对象1,对象,对象2,.;Student st1,st2;对象的定义格式:对象的定义格式:类名类名对象名对象名在建立对象时,只为对象分配用于保存数据成员的内存空在建立对象时,只为对象分配用于保存数据成员的内存空间,间,而成员函数的代码为该类的每一个对象所共享而成员函数的代码为该类的每一个对象所共享。27对象的定义方法同结构体定义变量的方法一样,对象的定义方法同结构体定义变量的方法一样,也分三种,也分三种,

19、当类中有数据成员的访问权限为私有当类中有数据成员的访问权限为私有时,不允许对对象进行初始化时,不允许对对象进行初始化。class A float x,y;public:void Setxy(float a,float b )x=a;y=b;void Print(void)coutxtyendl;a1,a2;void main(void)A a3,a4;定义全局对象定义全局对象定义局部对象定义局部对象28对象的使用对象的使用一个对象的成员就是该对象的类所定义的成员,一个对象的成员就是该对象的类所定义的成员,有有成员数据和成员函数成员数据和成员函数,引用时同结构体变量类,引用时同结构体变量类似,用

20、似,用“.”运算符。运算符。29class A float x,y;public:float m,n;void Setxy(float a,float b )x=a;y=b;void Print(void)coutxtyendl;void main(void)A a1,a2;/定义对象定义对象 a1.m=10;a1.n=20;/为公有成员数据赋值为公有成员数据赋值 a1.Setxy(2.0,5.0);/为私有成员数据赋值为私有成员数据赋值 a1.Print();Print()Setxy()a1nmyxPrint()Setxy()a2nmyx10202.05.0输出:输出:2 530用成员选择运

21、算符用成员选择运算符“.”只能访问对象的只能访问对象的公有公有成员成员,而不能访问对象的私有成员或保护成,而不能访问对象的私有成员或保护成员。员。若要访问对象的私有的数据成员,只能若要访问对象的私有的数据成员,只能通过对象的公有成员函数来获取通过对象的公有成员函数来获取。31class A float x,y;public:float m,n;void Setxy(float a,float b )x=a;y=b;void Print(void)coutxtyendl;void main(void)A a1,a2;a1.m=10;a1.n=20;/为公有成员数据赋值为公有成员数据赋值 a1.x

22、=2;a1.y=5;a1.Setxy(2.0,5.0);a1.Print();必须通过类内公有函必须通过类内公有函数访问私有数据成员数访问私有数据成员非法,私有成员非法,私有成员不能在类外访问不能在类外访问32同类型的对象之间可以整体赋值,这种赋值与对象的成员的访问权限无关。同类型的对象之间可以整体赋值,这种赋值与对象的成员的访问权限无关。class A float x,y;public:float m,n;void Setxy(float a,float b )x=a;y=b;void Print(void)coutxtyendl;void main(void)A a1,a2;a1.m=10

23、;a1.n=20;/为公有成员数据赋值为公有成员数据赋值 a1.Setxy(2.0,5.0);a2=a1;a1.Print();a2.Print();同类型的对象之间可以同类型的对象之间可以整体赋值整体赋值相当于成员数据间相当于成员数据间相互赋值相互赋值33对象可以作函数的入口参数(实参、形参),也对象可以作函数的入口参数(实参、形参),也可以作函数可以作函数的的返回返回参数参数。这与一般变量作为函数。这与一般变量作为函数的参数是完全相同的。的参数是完全相同的。可以定义类类型的指针,类类型的引用,对象数可以定义类类型的指针,类类型的引用,对象数组,指向类类型的指针数组和指向一维或多维数组,指向

24、类类型的指针数组和指向一维或多维数组的指针变量组的指针变量 一个类的对象,可作为另一个类的成员一个类的对象,可作为另一个类的成员 34类体的区域称为类体的区域称为类作用域类作用域。类的成员函数与。类的成员函数与成员数据,其作用域都是属于类的作用域,成员数据,其作用域都是属于类的作用域,仅在该类的范围内有效,仅在该类的范围内有效,故不能在主函数中故不能在主函数中直接通过函数名和成员名来调用函数直接通过函数名和成员名来调用函数。类作用域、类类型的作用域和对象的作用域类作用域、类类型的作用域和对象的作用域 35class A float x,y;public:float m,n;void Setxy

25、(float a,float b )x=a;y=b;void Print(void)coutxtyendl;void main(void)A a1,a2;a1.m=20;a1.n=10;a1.Setxy(2.0,5.0);a1.Print();void main(void)A a1,a2;m=20;n=10;Setxy(2.0,5.0);Print();用对象名调用用对象名调用不能直接调用不能直接调用36类类型的作用域:类类型的作用域:在函数定义之外定义的类,在函数定义之外定义的类,其类名的作用域为其类名的作用域为文件作用域文件作用域;而在函数体;而在函数体内定义的类,其类名的作用域为内定义的

26、类,其类名的作用域为块作用域块作用域。对象的作用域对象的作用域与前面介绍的变量作用域完全与前面介绍的变量作用域完全相同相同,全局对象、局部对象、局部静态对象全局对象、局部对象、局部静态对象等。等。37class A float x,y;public:float m,n;void Setxy(float a,float b )x=a;y=b;void Print(void)coutxtyendl;a3,a4;void main(void)A a1,a2;class B int i,j;public:void Setij(int m,int n)i=m;j=n;B b1,b2;a1.Setxy(2

27、.0,5.0);b1.Setij(1,2);类类A:文件作用域,在整个文件:文件作用域,在整个文件中有效中有效类类B:块作用域,在函数:块作用域,在函数内有效。内有效。全局对象全局对象局部对象局部对象38类的嵌套在定义一个类时在定义一个类时,在其类体中又包含了一个在其类体中又包含了一个类的完整定义,称为类的嵌套类的完整定义,称为类的嵌套。类是允许嵌套定义的类是允许嵌套定义的。39class A class B int i,j;public:void Setij(int m,int n)i=m;j=n;float x,y;public:B b1,b2;void Setxy(float a,flo

28、at b )x=a;y=b;void Print(void)coutxtyendl;类类B包含在类包含在类A中,中,为嵌套定义为嵌套定义嵌套类的对象嵌套类的对象在类在类A的定义中,并不为的定义中,并不为b1,b2分配空间,分配空间,只只有在定义类有在定义类A的对象时,才为嵌套类的对象的对象时,才为嵌套类的对象分配空间分配空间。嵌套类的作用域在类嵌套类的作用域在类A的定义结的定义结束时结束束时结束。40类的对象如何引用私有数据成员类的对象如何引用私有数据成员1、通过公有函数为私有成员赋值、通过公有函数为私有成员赋值class Testint x,y;public:void Setxy(int a

29、,int b)x=a;y=b;void Printxy(void)coutx=xty=yendl;void main(void)Test p1,p2;p1.Setxy(3,5);p1.Printxy();调用公有函数为调用公有函数为私有对象赋值私有对象赋值412、利用指针访问私有数据成员利用指针访问私有数据成员class Testint x,y;public:void Setxy(int a,int b)x=a;y=b;void Getxy(int *px,int*py)*px=x;*py=y;/提取提取x,y值值 void Printxy(void)coutx=xty=yendl;void

30、main(void)Test p1,p2;p1.Setxy(3,5);int a,b;p1.Getxy(&a,&b);/将将 a=x,b=y coutatbendl;Setxy()Getxy()Printxy()xy35ba&apx&bpy35输出:输出:3 5423、利用函数访问私有数据成员、利用函数访问私有数据成员class Testint x,y;public:void Setxy(int a,int b)x=a;y=b;int Getx(void)return x;/返回返回x值值 int Gety(void)return y;/返回返回y值值 void Printxy(void)co

31、utx=xty=yendl;void main(void)Test p1,p2;p1.Setxy(3,5);int a,b;a=p1.Getx();b=p1.Gety();/将将 a=x,b=y coutatbendl;函数值就是私有函数值就是私有成员变量的值成员变量的值434、利用引用访问私有数据成员、利用引用访问私有数据成员class Testint x,y;public:void Setxy(int a,int b)x=a;y=b;void Getxy(int&px,int&py)px=x;py=y;/提取提取x,y值值 void Printxy(void)coutx=xty=yendl

32、;void main(void)Test p1,p2;p1.Setxy(3,5);int a,b;p1.Getxy(a,b);/将将 a=x,b=y coutatbendl;Setxy()Getxy()Printxy()xy35bapxpy35输出:输出:3 544类引用举例(三角形类:三角形的三边及与三边相关的运算)类引用举例(三角形类:三角形的三边及与三边相关的运算)class Triangleprivate:float a,b,c;/三边为私有成员数据三边为私有成员数据public:void Setabc(float x,float y,float z);/置三边的值置三边的值void

33、Getabc(float&x,float&y,float&z);/取三边的值取三边的值float Perimeter(void);/计算三角形的周长计算三角形的周长float Area(void);/计算三角形的面积计算三角形的面积void Print(void);/打印相关信息打印相关信息;45void Triangle:Setabc(float x,float y,float z)a=x;b=y;c=z;/置三边的值置三边的值void Triangle:Getabc(float&x,float&y,float&z)/取三边的值取三边的值x=a;y=b;z=c;float Triangle:

34、Perimeter(void)return(a+b+c)/2;/计算三角形的周长计算三角形的周长float Triangle:Area(void)/计算三角形的面积计算三角形的面积float area,p;p=Perimeter();area=sqrt(p-a)*(p-b)*(p-c)*p);return area;void Triangle:Print(void)/打印相关信息打印相关信息coutPeri=Perimeter()tArea=Area()endl;46void main(void)Triangle Tri1;/定义三角形类的一个实例(对象)定义三角形类的一个实例(对象)Tri1

35、.Setabc(4,5,6);/为三边置初值为三边置初值float x,y,z;Tri1.Getabc(x,y,z);/将三边的值为将三边的值为x,y,z赋值赋值coutxtytzendl;cout“s=”Tri1.Perimeter()endl;/求三角形的周长求三角形的周长cout“Area=”Tri1.Area()endl;/求三角形的面积求三角形的面积coutTri1:endl;Tri1.Print();/打印有关信息打印有关信息47类引用举例(学生类:学生的姓名成绩及相关的运算)类引用举例(学生类:学生的姓名成绩及相关的运算)class Stuchar Name20;/学生姓名学生姓

36、名float Chinese;/语文成绩语文成绩float Math;/数学成绩数学成绩public:float Average(void);/计算平均成绩计算平均成绩float Sum(void);/计算总分计算总分void Show(void);/打印信息打印信息void SetStudent(char*,float,float);/为对象置姓名、成绩为对象置姓名、成绩void SetName(char*);/为对象置姓名为对象置姓名char*GetName(void);/取得学生姓名取得学生姓名;48float Stu:Average(void)return(Chinese+Math)/

37、2;/平均成绩float Stu:Sum(void)return Chinese+Math;/总分void Stu:Show(void)/打印信息 coutName:NameendlScore:Chineset Mathtaverage:Average()tSum:Sum()endl;void Stu:SetStudent(char*name,float chinese,float math)strcpy(Name,name);/置姓名Chinese=chinese;/置语文成绩Math=math;/置数学成绩char*Stu:GetName(void)return Name;/返回姓名49v

38、oid main(void)Stu p1,p2;p1.SetStudent(“Li qing”,98,96);/对象置初值对象置初值p2.SetStudent(Wang Gang,90,88);/对象置初值对象置初值p1.Show();/打印信息打印信息p2.Show();/打印信息打印信息p1.SetName(“Zhao jian”);/重新置重新置p1对象的名字对象的名字p1.Show();cout“p1.Name:”p1.GetName()endl;/打印对象的名字打印对象的名字 cout“p1.average:”p1.Average()endl;/打印对象的成绩打印对象的成绩50成员函

39、数的重载成员函数的重载 类中的成员函数与前面介绍的普通函数一样,类中的成员函数与前面介绍的普通函数一样,成员函数可以成员函数可以带有缺省的参数带有缺省的参数,也可以,也可以重载重载成员函数成员函数。重载时,函数的形参必须在重载时,函数的形参必须在类型类型或或数目数目上不上不同。同。51class Testint x,y;int m,n;public:void Setxy(int a,int b)x=a;y=b;void Setxy(int a,int b,int c,int d)x=a;y=b;m=c;n=d;void Printxy(int x)cout“m=mt“n=nendl;void

40、Printxy(void)coutx=xty=yendl;void main(void)Test p1,p2;p1.Setxy(3,5);p2.Setxy(10,20,30,40);/参数不同参数不同 p1.Printxy();p2.Printxy();p2.Printxy(2);/参数、类型不同参数、类型不同输出:输出:x=3 y=5x=10 y=20m=30 n=4052class Stuchar Name20;float Chinese;float Math;float English;float Physical;public:float Average(void);/语文、数学平均成

41、绩float Average(int n);/四门课的平均成绩float Sum(void);/语文、数学总分float Sum(int n);/四门课总分void Show(void);void SetStudent(char*,float,float);/置姓名、语文、数学初值void SetStudent(char*,float,float,float,float);/置姓名、成绩void SetName(char*);char*GetName(void);53可以有缺省参数的成员函数,若形参不完全可以有缺省参数的成员函数,若形参不完全缺省,则必须从形参的缺省,则必须从形参的右边右边开始

42、缺省。开始缺省。54缺省参数的成员函数缺省参数的成员函数class Afloat x,y;public:float Sum(void)return x+y;void Set(float a,float b=10.0)x=a;y=b;void Print(void)coutx=xty=yendl;void main(void)A a1,a2;a1.Set(2.0,4.0);couta1:;a1.Print();couta1.sum=a1.Sum()endl;a2.Set(20.0);couta2:;a2.Print();couta2.sum=a2.Sum()endl;不缺省参数,不缺省参数,a1

43、.x=2,a1.y=4缺省参数,缺省参数,a2.x=20,a2.y=1055定义类的指针及如何用指针来引用对象定义类的指针及如何用指针来引用对象class Afloat x,y;public:float Sum(void)return x+y;void Set(float a,float b)x=a;y=b;void Print(void)coutx=xty=ySet(2.0,3.0);/通过指针引用对象的成员函数通过指针引用对象的成员函数 p-Print();coutSum()endl;a2.Set(10.0,20.0);a2.Print();Setxy()Getxy()Printxy()x

44、y2.03.0pa156定义类的数组及数组中元素的引用定义类的数组及数组中元素的引用void main(void)Stu stu3;/定义类的数组定义类的数组Stu *pstu;/定义类的指针定义类的指针pstu=stu;/为指针赋值为指针赋值int i;stu0.SetStudent(“A”,90,90);/通过数组元素的引用赋值通过数组元素的引用赋值stu1.SetStudent(B,80,80);stu2.SetStudent(C,70,70);for(i=0;iShow();/指针变量指向数组元素指针变量指向数组元素pstu+;/指针变量加一,指向下一元素指针变量加一,指向下一元素st

45、upstupstu57返回引用类型的成员函数返回引用类型的成员函数(可以返回私有数据成员的引用可以返回私有数据成员的引用)class Afloat x,y;public:float&Getx(void)return x;/返回返回x的的引用引用void Set(float a,float b)x=a;y=b;void Print(void)coutxtyendl;void main(void)A a1,a2;a1.Set(3,5);couta1:;a1.Print();a1.Getx()=30;/将将a1对象中的对象中的x成员赋值成员赋值coutnMax)/空间不够,动态开辟存储空间空间不够,

46、动态开辟存储空间int*list;list=new intnMax+1;/开辟一较大的空间开辟一较大的空间for(int i=0;ix=a;this-y=b;系统自动将对象的指系统自动将对象的指针带到成员函数中针带到成员函数中63当对一个对象调用成员函数时,当对一个对象调用成员函数时,编译程序先编译程序先将对象的地址赋给将对象的地址赋给this指针,然后调用成员指针,然后调用成员函数,函数,每次成员函数存取数据成员时,也隐每次成员函数存取数据成员时,也隐含使用含使用this指针。指针。this指针具有如下形式的缺省说明:指针具有如下形式的缺省说明:Stu *const this;类名类名即即

47、this 指针里的地址是一个常指针里的地址是一个常量量64class Spublic:char *strp;int length;void Ini(char*s);void Print(void);void Copy(S&s);void main(void)S s1,s2;s1.Ini(“China”);s2.Ini(“”“”);s1.Print();s2.Copy(s1);s2.Print();s1.Copy(s1);void S:Ini(char*s)length=strlen(s);strp=new charlength+1;strcpy(strp,s);void S:Print(voi

48、d)coutstrpendl;void S:Copy(S&s)if(strp)delete strp;length=s.length;strp=new charlength+1;strcpy(strp,s.strp);65void S:Ini(char*s)length=strlen(s);strp=new charlength+1;strcpy(strp,s);void S:Copy(S&s)if(strp)delete strp;length=s.length;strp=new charlength+1;strcpy(strp,s.strp);*strplengthIni()Print()

49、Copy()S字符串首址字符串首址字符串长度字符串长度s1.Ini(“China”);求长度求长度对象动态开辟对象动态开辟空间空间空间赋值空间赋值length=5strpC hina 0s2.Copy(s1);0strpC hina 066void S:Copy(S&s)if(strp)delete strp;length=s.length;strp=new charlength+1;strcpy(strp,s.strp);s1.Copy(s1);strpC hina 0length=5随机随机随机随机随机随机随机随机随机随机随机随机失去了原来的内容,失去了原来的内容,不能正确复制不能正确复制67void S:Copy(S&s)if(&s=this)cout“不能复制本身不能复制本身n”;else if(strp)delete strp;length=s.length;strp=new charlength+1;strcpy(strp,s.strp);判断是否是自身复制判断是否是自身复制this为正在调用该函为正在调用该函数的数的对象对象的地址的地址s2.Copy(s1);s1.Copy(s1);if(s=*this)68

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


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