W09-类对象 .ppt

上传人(卖家):hyngb9260 文档编号:6040734 上传时间:2023-05-23 格式:PPT 页数:51 大小:430.50KB
下载 相关 举报
W09-类对象 .ppt_第1页
第1页 / 共51页
W09-类对象 .ppt_第2页
第2页 / 共51页
W09-类对象 .ppt_第3页
第3页 / 共51页
W09-类对象 .ppt_第4页
第4页 / 共51页
W09-类对象 .ppt_第5页
第5页 / 共51页
点击查看更多>>
资源描述

1、9.1 概述概述9.2 类类9.3 对象对象9.4 成员函数重载成员函数重载9.5 this指针指针第第9章章 类和对象类和对象9.1 概述概述 n传统面向过程程序设计方法传统面向过程程序设计方法n用函数实现对数据的操作,描述某一事物的用函数实现对数据的操作,描述某一事物的数据与对数据进行操作的函数是分开的。导数据与对数据进行操作的函数是分开的。导致在较大型程序中:致在较大型程序中:n对数据与函数组织的复杂度提高;对数据与函数组织的复杂度提高;n程序中所表示的概念不清晰;程序中所表示的概念不清晰;n程序维护,调试等工作难度加大;程序维护,调试等工作难度加大;n程序代码的复用性降低等问题;程序代

2、码的复用性降低等问题;n面向对象的程序设计方法面向对象的程序设计方法(OOP)n将描述某一类事物的数据与处理这些数据的将描述某一类事物的数据与处理这些数据的函数封装成一个整体。在很大程度上解决了函数封装成一个整体。在很大程度上解决了前述的问题。前述的问题。(见例9-19-2)n面向对象程序设计三大要素:封装、继承和面向对象程序设计三大要素:封装、继承和多态。多态。nOOP优势:优势:n提高程序模块的独立性和可维护性提高程序模块的独立性和可维护性;封装封装n提高代码的可重用性;提高代码的可重用性;继承继承n可编写通用灵活和可扩展的程序;可编写通用灵活和可扩展的程序;多态多态9.1 概述概述 回顾

3、回顾:处理一份档案,它包括:name、sex、age、grade.等等数据。由于这些数据分属不同的数据类型,在面向过程的程序设计中,这些数据被作为结构体的成员封装在结构体中。若要访问其中任一个成员时,只要写出结构体变量加上被访问的成员名即可。Struct student s;s.age=18;9.2 类类新教材:第6章 6.6 类我们先回顾一下结构体的概念。我们先回顾一下结构体的概念。struct student char name5;char sex;int age;void main()student s1,s2;cins1.sexs1.age;.定义结构体类型定义结构体类型的关键字的关键

4、字被定义的结构体被定义的结构体类型名类型名结构体成员结构体成员(公有成员公有成员)被定义的结构体被定义的结构体变量变量通过结构体变量通过结构体变量访问结构体成员访问结构体成员9.2 类类设想设想:n 从结构体的封装性出发,如果把处理这些数据的从结构体的封装性出发,如果把处理这些数据的函数及其算法也能封装到结构体内,使它们也成为结函数及其算法也能封装到结构体内,使它们也成为结构体成员,从而使处理这份档案的所有功能都包含在构体成员,从而使处理这份档案的所有功能都包含在结构体内,那么,整个程序的功能就可由结构体包揽。结构体内,那么,整个程序的功能就可由结构体包揽。n要执行这个程序时,只要在主函数中定

5、义结构体变量,要执行这个程序时,只要在主函数中定义结构体变量,并用该变量调用成员函数,就能完成所有的处理功能。并用该变量调用成员函数,就能完成所有的处理功能。n这样一来,程序设计就变成这样一来,程序设计就变成面向结构体变量面向结构体变量了。了。s.inputs.input();s.renames.rename();s.prints.print()();9.2 类类 上述设想在C+中已经成为现实,即,结构体变量不但可以包括成员数据,还可以包括对数据进行操作的函数成员函数(例 9.3)。此外,C+还提供了与上述结构体特征非常类似的另一种数据类型,这就是类class。如果将定义结构体的标识符stru

6、ct换成class,那么结构体类型就变成类类型。用结构体类型名定义的变量称为结构体变量,而用类类型名定义的变量则称为对象。那么,当以类这种数据类型为基础进行程序设计时,就可称为面向对象的程序设计。下面,我们通过结构体与类的对比来介绍类和对象。9.2 类类如果将关键字如果将关键字struct改成改成class,那么,那么struct student char name5;char sex;int age;void main()student s1,s2;cins1.sexs1.age;.被定义的被定义的类类类型名类型名被缺省定义的被缺省定义的类类成员,成员,它们都是它们都是私有成员私有成员被被类

7、类类型名定义的类型名定义的对象对象这是试图通过这是试图通过对象对象访问访问私有成员,是错误的私有成员,是错误的class 定义定义类类类型类型的关键字的关键字请注意,这是请注意,这是类类与结构体在使用中的唯一区别。与结构体在使用中的唯一区别。9.2 类类 9.2 类类class Stu private:char name5;protected:char sex;int age;public:void RegisterStu(const char*,int,const char*);void Getname(char*);int Getarg(void);void Getsex(char*);显

8、然,若要建立一个显然,若要建立一个对象对象,这个,这个对象对象就必须用就必须用类类名来名来定义。即首先定义定义。即首先定义类类,再用,再用类类名名来定义来定义对象对象。称为成员函数称为成员函数其余称为成员数据其余称为成员数据 9.2 类类class Stu private:char name5;protected:char sex;int age;public:void RegisterStu(const char*,int,const char*);void Getname(char*);int Getarg(void);void Getsex(char*);私有成员及其作用域私有成员及其作

9、用域定义定义类类时,时,类类的成员一般采用显式说明。的成员一般采用显式说明。三个关键字的作用是限制各种成员被访问的权限。三个关键字的作用是限制各种成员被访问的权限。保护成员及其作用域保护成员及其作用域公有成员及其作用域公有成员及其作用域class Stu private:char name5;protected:char sex;int age;public:void RegisterStu(const char*,int,const char*);void Getname(char*);int Getarg(void);void Getsex(char*);说明的先后顺序无关紧要。说明的先后

10、顺序无关紧要。私有、公有和保护成员即可私有、公有和保护成员即可以是成员数据,也可以是成员函数。其各自的约定为:以是成员数据,也可以是成员函数。其各自的约定为:9.2 类类class Stu private:char name5;protected:char sex;int age;public:void RegisterStu(const char*,int,const char*);void Getname(char*);int Getarg(void);void Getsex(char*);私有私有和和保护成员保护成员(包括成员数据和成员函数包括成员数据和成员函数),仅允许),仅允许本类中

11、本类中的成员函数的成员函数访问和调用,不允许访问和调用,不允许本类之外的变量和函数本类之外的变量和函数访问。访问。因此它们具有封装性,类外的元素看不见它们。因此它们具有封装性,类外的元素看不见它们。9.2 类类class Stu private:char name5;protected:char sex;int age;public:void RegisterStu(const char*,int,const char*);void Getname(char*);int Getarg(void);void Getsex(char*);保护成员保护成员还允许该类的派生类的成员函数存取或调用。还允

12、许该类的派生类的成员函数存取或调用。公有的成员公有的成员数据和函数既允许数据和函数既允许本类本类的成员函数访问和调用,的成员函数访问和调用,也允许也允许本类之外本类之外的函数访问。的函数访问。9.2 类类class Stu private:char name5;protected:char sex;int age;public:void RegisterStu(const char*,int,const char*);void Getname(char*);int Getarg(void);void Getsex(char*);类类中的成员函数,既可以给出函数原型,也可以定义中的成员函数,既可

13、以给出函数原型,也可以定义完整的函数体完整的函数体(参见参见P206207例题例题9.4,9.5内联成员函数内联成员函数)。成员函数使用前必须先给出定义。成员函数使用前必须先给出定义。如果将成员函数的函数体定义在如果将成员函数的函数体定义在类类体体中,则称为中,则称为内联成员函数内联成员函数。9.2 类类class Stu private:int left,top;public:int right,bottom;void setcoord(int,int,int,int);.;如果在如果在类类中定义的成员函数仅是函数原型,那么,这个中定义的成员函数仅是函数原型,那么,这个函数在使用前必须给出它

14、的定义。例如函数在使用前必须给出它的定义。例如void Stu:setcoord(int L,int R,int T,int B)left=L;top=T;right=R;bottom=B;函数的原型说明函数的原型说明函数定义函数定义 9.2 类类class Stu private:int left,top;public:int right,bottom;void setcoord(int,int,int,int);.;void Stu:setcoord(int L,int R,int T,int B)left=L;top=T;right=R;bottom=B;返回值类型返回值类型类类名名作用

15、域运算符,它表示作用域运算符,它表示setcoord属于属于Stu类类的的成员函数成员函数访问私有成员访问私有成员不违法不违法 9.2 类类 此外,此外,类类的说明可分为引用性说明和定义性说明。引用性说明也的说明可分为引用性说明和定义性说明。引用性说明也象函数原型那样没有实体,这种说明不能用来建立对象,只用于说象函数原型那样没有实体,这种说明不能用来建立对象,只用于说明指向明指向类类的指针以及函数的形参等。例如的指针以及函数的形参等。例如class AA;class B AA*pc;.类类的引用性说明的引用性说明类类 B 的成员,说明为的成员,说明为指向指向类类 AA的指针的指针 9.2 类类

16、 此外,此外,类类的说明可分为引用性说明和定义性说明。引用性说明的说明可分为引用性说明和定义性说明。引用性说明也象函数原型那样没有实体,这种说明不能用来建立对象,只也象函数原型那样没有实体,这种说明不能用来建立对象,只用于说明指向用于说明指向类类的指针以及函数的形参等。例如的指针以及函数的形参等。例如class AA;class B AA*pc;.错误,引用性说明错误,引用性说明不能建立对象不能建立对象AA s;AA x,y;错误,引用性说明错误,引用性说明不能建立对象成员不能建立对象成员 9.2 类类 class Crect private:int left,top;public:int r

17、ight,bottom;void setcoord(int,int,int,int);void setcoord(int*L,int*R,int*T,int*B)*L=left;*R=right;*T=top;*B=bottom;void Print(void)cout”面积面积=”fabc(right-left)*fabc(bottom-top)n;;定义类定义类Crect私有数据成员及其作用域私有数据成员及其作用域公有成员及其作用域公有成员及其作用域 缺省定义,默认为私有数据成员缺省定义,默认为私有数据成员 9.2 类类 9.3 对象对象 class Crect private:int l

18、eft,top;public:int right,bottom;void setcoord(int,int,int,int);void setcoord(int*L,int*R,int*T,int*B)*L=left;*R=right;*T=top;*B=bottom;void Print(void)cout”面积面积=”fabc(right-left)*fabc(bottom-top)n;;两个重载的公有函数两个重载的公有函数两个公有数据成员两个公有数据成员 class Crect private:int left,top;public:int right,bottom;void setco

19、ord(int,int,int,int);void setcoord(int*L,int*R,int*T,int*B)*L=left;*R=right;*T=top;*B=bottom;void Print(void)cout”面积面积=”fabc(right-left)*fabc(bottom-top)n;;成员函数体在类体中定义,成员函数体在类体中定义,称为内联函数称为内联函数 9.3 对象对象Inline 定义内联函数定义内联函数 9.3 对象对象 class Crect private:int left,top;public:int right,bottom;void setcoord

20、(int,int,int,int);void setcoord(int*L,int*R,int*T,int*B)*L=left;*R=right;*T=top;*B=bottom;void Print(void)cout”面积面积=”fabc(right-left)*fabc(bottom-top)n;;这个原型的函数体这个原型的函数体还必须在类体外定义还必须在类体外定义 9.3 对象对象 class Crect .public:void setcoord(int,int,int,int);.;原型的函数体定义原型的函数体定义void Crect:setcoord(int L,int R,in

21、t T,int B)left=L;right=R;top=T;bottom=B;下面来看对象的定义和使用下面来看对象的定义和使用给私有成员赋值给私有成员赋值给公有成员赋值给公有成员赋值void Crect:setcoord(int L,int R,int T,int B)left=L;right=R;top=T;bottom=B;9.3 对象对象 class Crect .public:void setcoord(int,int,int,int);.;类名定义的对象类名定义的对象等同于结构体变量等同于结构体变量void main(void)Crect r,rr;r.setcoord(100,3

22、00,50,200);对象调用成员函数对象调用成员函数“.”运算符只能访问运算符只能访问对象的公有成员对象的公有成员void Crect:setcoord(int L,int R,int T,int B)left=L;right=R;top=T;bottom=B;9.3 对象对象 class Crect .public:void setcoord(int,int,int,int);.;应是调用这个函数应是调用这个函数void main(void)Crect r,rr;r.setcoord(100,300,50,200);这是重载函数,根据形、实参性质这是重载函数,根据形、实参性质 结果使得:结

23、果使得:left=100 right=300 top=50 bottom=200void Crect:setcoord(int L,int R,int T,int B)left=L;right=R;top=T;bottom=B;9.3 对象对象 class Crect .public:void setcoord(int,int,int,int);.;void main(void)Crect r,rr;r.setcoord(100,300,50,200);这个函数没有返回值,调用它只是使数据成员初始化这个函数没有返回值,调用它只是使数据成员初始化 结果使得:结果使得:left=100 right

24、=300 top=50 bottom=200显然,这里的初始化是通过调用成员函数实现的显然,这里的初始化是通过调用成员函数实现的void Crect:setcoord(int L,int R,int T,int B)left=L;right=R;top=T;bottom=B;9.3 对象对象 class Crect .public:void setcoord(int,int,int,int);.;void main(void)Crect r,rr;r.setcoord(100,300,50,200);对于公有成员,可以直接用对象将它们初始化,例如对于公有成员,可以直接用对象将它们初始化,例如

25、结果使得:结果使得:left=100 right=300 top=50 bottom=200r.right=300;r.bottom=200;void Crect:setcoord(int L,int R,int T,int B)left=L;right=R;top=T;bottom=B;9.3 对象对象 class Crect .public:void setcoord(int,int,int,int);.;void main(void)Crect r,rr;r.setcoord(100,300,50,200);如果是私有成员,如果是私有成员,结果使得:结果使得:left=100 right

26、=300 top=50 bottom=200r.left=100;r.top=50;则不允许!则不允许!因为对象无权直接访问私有和保护成员因为对象无权直接访问私有和保护成员显然也不能对它们初始化显然也不能对它们初始化void Crect:setcoord(int L,int R,int T,int B)left=L;right=R;top=T;bottom=B;9.3 对象对象 class Crect .public:void setcoord(int,int,int,int);.;void main(void)Crect r,rr;r.setcoord(100,300,50,200);私有和

27、保护成员的初始化只能通过调用成员函数来实现私有和保护成员的初始化只能通过调用成员函数来实现 结果使得:结果使得:left=100 right=300 top=50 bottom=200为了解决这个问题,为了解决这个问题,C+专门提供了用于初始化的函数专门提供了用于初始化的函数称为称为构造函数构造函数,将在下一章介绍,将在下一章介绍void Crect:setcoord(int L,int R,int T,int B)left=L;right=R;top=T;bottom=B;9.3 对象对象 class Crect .public:void setcoord(int,int,int,int);

28、.;void main(void)Crect r,rr;r.setcoord(100,300,50,200);结果使得:结果使得:left=100 right=300 top=50 bottom=200r.Print();如果还有语句如果还有语句 9.3 对象对象 class Crect .public:void setcoord(int,int,int,int);.;void main(void)Crect r,rr;r.setcoord(100,300,50,200);结果使得:结果使得:left=100 right=300 top=50 bottom=200r.Print();.void

29、 Print(void)cout”面积面积=”fabc(right-left)*fabc(bottom-top)n;则是调用成员函数则是调用成员函数 Print面积面积=30000 9.3 对象对象 从上面的例题分析可知,所谓从上面的例题分析可知,所谓对象对象,就是用,就是用类类类型名定义类型名定义的变量。这就说明,的变量。这就说明,对象对象的用法与结构体变量是相同的。实际的用法与结构体变量是相同的。实际上,就象结构体变量把结构体的程序意图变为现实一样,上,就象结构体变量把结构体的程序意图变为现实一样,对象对象则是把则是把类类的程序意图变为现实。的程序意图变为现实。由于类与结构体的惟一区别就是

30、缺省定义的成员访问权不由于类与结构体的惟一区别就是缺省定义的成员访问权不同,因此,结构体的其它定义方法,包括嵌套定义、成员函数同,因此,结构体的其它定义方法,包括嵌套定义、成员函数重载等也完全适用于类。重载等也完全适用于类。详细描述请见详细描述请见P208例题例题9.6和和P209212。n例例98 处理一个数组构成的线性表,动态产处理一个数组构成的线性表,动态产生线性表,并输出线性表中的数据。生线性表,并输出线性表中的数据。9.4 类成员函数的重载类成员函数的重载 class ListClass int*List;unsigned nMax;unsigned nElem;/指向线性表/指明线

31、性表的长度(大小)/当前线性表中实际存放的整数个数均为私有成员q 类成员函数的重载在类定义中使用非常普遍。类成员函数的重载在类定义中使用非常普遍。重载的方法符合一般函数重载规则。重载的方法符合一般函数重载规则。各个成员函数,包括构造函数都可以重载,但析构各个成员函数,包括构造函数都可以重载,但析构函数除外。函数除外。class ListClass public:void Init(int n=10)List=new intn;nMax=n;nElem=0;int Elem(int);int&Elem(unsigned n)return Listn;unsigned Elem(void)retu

32、rn nElem;9.4 类成员函数的重载类成员函数的重载/初始化指针表,缺省最大长度为10/动态分配线性表的空间/空表/返回线性表中第n个元素的引用/返回当前元素的个数类listClass中有三个重载了的公有成员函数。/成员函数原形,定义在后class ListClass public:unsigned Max(void)void Print(void);int GetElem(int);void Destroy(void)delete nMax list;/收回线性表占用的存储空间 ;9.4 类成员函数的重载类成员函数的重载略略 int ListClass:Elem(int elem)if

33、(nElem nMax)List nElem+=elem;return nElem;else int*list;list=new int nMax+1;for(int i=0;inElem;i+)listi=Listi;deletenMax List;nMax+;List=list;ListnElem+=elem;return nElem;9.4 类成员函数的重载类成员函数的重载/在线性表尾增加一个元素/若线性表不满,直接输入新元素/若线性表满,重新申请存储空间/nMax+可否可否?/nMax+可否可否?原因原因void main(void)ListClass list,list1;list.

34、Init(10);list1.Init(20);for(int i=0;i10;i+)list1.Elem(i);coutlist.Elem()list.Max()n;coutlist1.Elem()list1.Max()n;list1.Print();list1.Elem(3u)=100;list1.Elem(20);list1.Elem(200);list1Print();listDestroy();list1Destroy();/两个对象list无初始化,输出:0 10list1经初始化输出:10 20 int ListClass:Elem(int elem)if(nElem nMax)

35、List nElem+=elem;return nElem;list1.Elem(i);void main(void)ListClass list,list1;list.Init(10);list1.Init(20);for(int i=0;i10;i+)list1.Elem(i);coutlist.Elem()list.Max()n;coutlist1.Elem()list1.Max()n;list1.Print();list1.Elem(3u)=100;C list1.Elem(20);list1.Elem(200);list1Print();listDestroy();list1Dest

36、roy();/两个对象输出:输出:0 1 2 3 4 5 6 7 8 9void main(void)ListClass list,list1;list.Init(10);list1.Init(20);for(int i=0;i10;i+)list1.Elem(i);coutlist.Elem()list.Max()n;coutlist1.Elem()list1.Max()n;list1.Print();list1.Elem(3u)=100;C list1.Elem(20);list1.Elem(200);list1Print();listDestroy();list1Destroy();/两

37、个对象输出:输出:0 1 2 100 4 5 6 7 8 9重载成员函数int&Elem(unsigned n)return Listn;/返回线性表中第n个元素的引用/则第3个元素的值改为100list1.Elem(3u)=void main(void)ListClass list,list1;list.Init(10);list1.Init(20);for(int i=0;i10;i+)list1.Elem(i);coutlist.Elem()list.Max()n;coutlist1.Elem()list1.Max()n;list1.Print();list1.Elem(3u)=100;

38、list1.Elem(20);list1.Elem(200);list1Print();listDestroy();list1Destroy();/两个对象输出:输出:0 1 2 100 4 5 6 7 8 9 20 200重载成员函数 int ListClass:Elem(int elem)if else List=list;ListnElem+=elem;return nElem;Elem(20);Elem(200);void main(void)ListClass list,list1;list.Init(10);list1.Init(20);for(int i=0;i10;i+)lis

39、t1.Elem(i);coutlist.Elem()list.Max()n;coutlist1.Elem()list1.Max()n;list1.Print();list1.Elem(3u)=100;list1.Elem(20);list1.Elem(200);list1.Print();list.Destroy();list1.Destroy();/两个对象List.Destroy();List1.Destroy();当对象当对象list和和list1结束其生存期时,系统可结束其生存期时,系统可以自动地收回这两个对象所占用的存储空以自动地收回这两个对象所占用的存储空间,但系统不能自动地收回用

40、运算符间,但系统不能自动地收回用运算符new动态分配的存储空间,所以该函数的作用动态分配的存储空间,所以该函数的作用是收回线性表已经占用的存储空间。是收回线性表已经占用的存储空间。void Destroy(void)delete nMax list;例如,在处理线性表的类中,增加一个拷贝线性表的成员例如,在处理线性表的类中,增加一个拷贝线性表的成员函数函数CopyList();”,它的原型为:,它的原型为:void CopyList(ListClass);该函数的定义为:void ListClass:CopyList(ListClass L)nMax=L.Max();nElem=L.Elem(

41、);if(List)delete List;List=new int nMax;/E for(int i=0;i nElem;i+)/F Listi=L.GetElem(i);函数成员访问数据成员函数成员访问数据成员nMax和和nElem时都没有用到时都没有用到成员选择成员选择运算符运算符“.”。为什么为什么?9.5 this指针指针 void CopyList(ListClass);该函数的定义为:void ListClass:CopyList(ListClass L)nMax=L.Max();nElem=L.Elem();if(List)delete List;List=new int n

42、Max;/E for(int i=0;i nElem;i+)/F Listi=L.GetElem(i);实际上,这是实际上,这是C+隐含了一个参数,这个参数称隐含了一个参数,这个参数称为为this指针。指针。调用一个函数成员时,调用一个函数成员时,C+会自动将这个会自动将这个this指针指指针指向接受函数调用的向接受函数调用的对象对象。例如。例如9.5 this指针指针 void CopyList(ListClass);该函数的定义为:void ListClass:CopyList(ListClass L)nMax=L.Max();nElem=L.Elem();if(List)delete L

43、ist;List=new int nMax;/E for(int i=0;i nElem;i+)/F Listi=L.GetElem(i);当程序中出现 ListClass m1;m1.CopyList(list);this此时此时C+为被调用的函数自动传递一个为被调用的函数自动传递一个this指针,并指向那个指针,并指向那个对象对象9.5 this指针指针 void CopyList(ListClass);该函数的定义为:void ListClass:CopyList(ListClass L)nMax=L.Max();nElem=L.Elem();if(List)delete List;Li

44、st=new int nMax;for(int i=0;ithis-this-由于是由于是C+自动操作,因此不需要作显式说明自动操作,因此不需要作显式说明9.5 this指针指针 void CopyList(ListClass);该函数的定义为:void ListClass:CopyList(ListClass L)nMax=L.Max();nElem=L.Elem();if(List)delete List;List=new int nMax;for(int i=0;i 当程序中出现 ListClass m1;m1.CopyList(list);this调用函数时同时,该指调用函数时同时,该

45、指针又作为一个参数传递针又作为一个参数传递给被调用的函数。给被调用的函数。this-this-this指针只限于类指针只限于类(对象对象)的成员,使用时也的成员,使用时也不允许改变指针值不允许改变指针值9.5 this指针指针This 的缺省说明是这样的:Classname*const this;n中文里表示某一个人自身的词汇是中文里表示某一个人自身的词汇是“我我”。nC+里,表示某一个类对象本身的保留字是里,表示某一个类对象本身的保留字是this,这,这是一个常量指针,它指向对象本身,其值不可修改。是一个常量指针,它指向对象本身,其值不可修改。n程序设计者通常不必关心该指针程序设计者通常不必

46、关心该指针,它是由系统自动维护它是由系统自动维护的的,但特殊场合可能要用到该指针但特殊场合可能要用到该指针.n例子见例子见P215-2169.5 this指针指针9.5 this指针指针 void CopyList(ListClass);该函数的定义为:void ListClass:CopyList(ListClass L)nMax=L.Max();nElem=L.Elem();if(List)delete List;List=new int nMax;/E for(int i=0;i nElem;i+)/F Listi=L.GetElem(i);但出现如下拷贝时:list.CopyList(

47、list)即出现同一对象中的线性表自己拷贝到自己的情况,执行E行时,因List指向当前的线性表,用new运算符为线性表动态分配存储空间,并将所分配存储空间的指针值赋给List时,线性表中的数据会全部丢失。9.5 this指针指针 void CopyList(ListClass);该函数的定义为:void ListClass:CopyList(ListClass L)nMax=L.Max();nElem=L.Elem();if(List)delete List;List=new int nMax;/E for(int i=0;i nElem;i+)/F Listi=L.GetElem(i);为了

48、防止这种情况的发生,该成员函数必须改写为:void ListClass:CopyList(ListClass L)if(&L!=this)nMax=L.Max();nElem=L.Elem();if(List)delete List;List=new int nMax;for(int i=0;i nElem;i+)listi=L.GetElem(i);当出现一个线性表自己拷贝到自己的情况时,if 条件不成立条件不成立本章习题:本章习题:P216217 2,3,5,7第第9章章 类对象类对象-学习要求学习要求n理解面向对象的概念,面向对象的思想理解面向对象的概念,面向对象的思想(封装(封装-属性与行为,访问权限控制),属性与行为,访问权限控制),掌握面向对象程序设计的特点;掌握面向对象程序设计的特点;n掌握类的定义、数据成员和成员函数的掌握类的定义、数据成员和成员函数的定义;定义;n掌握对象与类的关系,掌握建立对象的掌握对象与类的关系,掌握建立对象的不同方法;不同方法;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 办公、行业 > 各类PPT课件(模板)
版权提示 | 免责声明

1,本文(W09-类对象 .ppt)为本站会员(hyngb9260)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|