《第4章C程序设计教程与实验指导杨国兴类与对象.ppt》由会员分享,可在线阅读,更多相关《第4章C程序设计教程与实验指导杨国兴类与对象.ppt(64页珍藏版)》请在三一办公上搜索。
1、C+语言程序设计,杨国兴 张东玲 彭涛,中国水利水电出版社,第4章 类与对象,4.1 类与对象4.2 构造函数与析构函数4.3 类的组合4.4 友元4.5 静态成员4.6 对象数组与对象指针4.7 this指针,4.1 类与对象,4.1.1 类与对象的概念 对象(object):是现实世界中的客观事物。类(class):是把具有相同属性的事物划分为一类,从而得出的抽象概念。面向对象程序设计中的类,是具有相同属性和服务的一组对象的集合,它为属于该类的全部对象提供了抽象的描述。对象是类的实例,类是同种对象的抽象。,第4章 类与对象,如:确定大小和颜色的矩形都是一个个具体的对象,而将所有矩形的共同特
2、点抽象出来,就是一个矩形类。这些共有的属性包括颜色(color),左上角坐标(left,top),长(length)和宽(width)等;对这些属性的处理包括改变矩形的颜色(SetColor)和大小(SetSize),移动矩形到新的位置(Move),绘出矩形(Draw)等。将矩形的这些属性和方法作为一个整体,封装在一起形成一个矩形类。,4.1 类与对象,4.1.2 类的声明 class 类名 private:私有数据成员和成员函数;protected:保护数据成员和成员函数;public:公有数据成员和成员函数;,第4章 类与对象,例4.1 定义一个长方形类CRect,其数据成员包括颜色,左上
3、角坐标,长和宽,其函数成员包括改变矩形的颜色(SetColor)和大小(SetSize),移动矩形到新的位置(Move),绘出矩形(Draw)。,class CRectprivate:char color10;int left;int top;int length;int width;public:void SetColor(char*c);void SetSize(int l,int w);void Move(int t,int l);void Draw();,第4章 类与对象,例4.1(续一),void CRect:SetColor(char*c)strcpy(color,c);void
4、CRect:SetSize(int l,int w)length=l;width=w;void CRect:Move(int t,int l)top=t;left=l;void CRect:Draw()cout 矩形左上角坐标为(left,top)endl;cout 矩形长和宽分别为 length,width endl;cout 矩形的颜色是 color endl;,第4章 类与对象,域运算符(:)用于指出该函数是哪一个类的成员函数,用法:类名:函数名(参数表),例4.1(续二),void main()CRect r;r.SetColor(Red);r.Move(10,20);r.SetSiz
5、e(100,200);r.Draw();r.Move(50,50);r.SetColor(Blue);r.Draw();,第4章 类与对象,定义CRect类的对象,定义对象的格式:类名 对象名1,对象名2,,访问对象的公有成员,格式为:对象名.公有成员函数名(参数表)对象名.公有数据成员名,程序运行结果为:矩形左上角坐标为(20,10)矩形长和宽分别为100,200矩形的颜色是Red矩形左上角坐标为(50,50)矩形长和宽分别为100,200矩形的颜色是Blue,4.1 类与对象,4.1.3 成员的访问控制 private:私有访问权限,只允许类中的成员函数访问,其他函数不能访问。protec
6、ted:保护访问权限,在第7章中介绍。public:公有访问权限,在任何函数中都可以访问。例:若主函数中有以下语句,是否正确?CRect r;strcpy(r.color,“red”);r.top=10;r.left=20;,第4章 类与对象,4.1 类与对象,4.1.3 成员的访问控制(续)若不指定类中的成员的访问权限,则默认为私有成员。类也可以由struct关键字声明,strust与class的区别是:如果不指定访问权限,前者缺省的访问权限是公有的,而后者是私有的。用struct声明前面的矩形类:struct CRectvoid SetColor(char*c);void SetSize(
7、int l,int w);void Move(int t,int l);void Draw();private:char color10;int left;int top;int length;int width;,第4章 类与对象,4.1 类与对象,4.1.4 类的成员函数 1.类成员函数的定义方式在类外部定义:如前面定义的长方形类的成员函数 一般格式为:函数类型 类名:成员函数名(参数说明)函数体 在类中定义:如 class CRect public:void setcolor(char*c)strcpy(color,c);,第4章 类与对象,4.1 类与对象,4.1.4 类的成员函数(续
8、一)2.内联成员函数 将成员函数的定义直接写在类中即成为内联成员函数在类外定义时用inline指出:如:inline void CRect:SetColor(char*c)strcpy(color,c);,第4章 类与对象,4.1 类与对象,4.1.4 类的成员函数(续二)3.带默认参数值的成员函数 注意:默认参数只能在声明或定义中的一处给出,即如在类中的函数声明已经给出默认参数值:void SetSize(int l=100,int w=100);则在函数定义时就不能再给出默认值。同样如果在定义时给出了默认值:void CRect:SetSize(int l=100,int w=100)le
9、ngth=l;width=w;在声明处就不能再给默认值了。,第4章 类与对象,4.2 构造函数与析构函数,构造函数:对对象进行初始化。析构函数:在对象销毁时进行内存释放等清理工作。4.2.1 构造函数 1.构造函数的特点(1)构造函数的函数名与类名相同。(2)不能定义构造函数的类型(即不能指明构造函数返回值的类型)。(3)构造函数应声明为公有函数。(4)构造函数不能在程序中调用,在对象创建时,构造函数被系统自动调用。2.构造函数的作用 构造函数的作用就是在对象被创建时利用特定的值构造对象,将对象初始化为一个特定的状态,使此对象具有区别于其它对象的特征。,第4章 类与对象,例 为CRect类添加
10、构造函数,class CRectprivate:char color10;public:CRect();CRect(char*c,int t,int left,int len,int wid);void SetColor(char*c);CRect:CRect()strcpy(color,Black);top=0;left=0;length=0;width=0;,第4章 类与对象,例 为CRect类添加构造函数(续),CRect:CRect(char*c,int t,int lef,int len,int wid)strcpy(color,c);top=t;left=lef;length=le
11、n;width=wid;void main()CRect r1;/自动调用第一个构造函数 CRect r2(“red”,10,10,100,100);/自动调用第二个构造函数CRect r3(green,200,200,50,50);/自动调用第二个构造函数r1.Draw();r2.Draw();r3.Draw();,第4章 类与对象,例4.2 构造函数的初始化表,#include using namespace std;class Aprivate:const double PI;int b;int,第4章 类与对象,void main()A x(10);x.Output();,程序运行结果
12、:3.14,10,10,4.2 构造函数与析构函数,4.2.2 析构函数 1.析构函数的特点(1)析构函数名字为符号“”加类名。(2)析构函数没有参数,不能指定返回值类型。(3)一个类中只能定义一个析构函数,所以析构函数不能重载。(4)当一个对象作用域结束时,系统自动调用析构函数。如CRect类的析构函数声明为:CRect();定义为:CRect:CRect()2.析构函数的作用 在删除一个对象前被调用,释放该对象成员的内存空间,以及其它一些清理工作。,第4章 类与对象,例4.3 设计一个简单的字符串类,类中有两个数据成员,分别表示字符串的长度和字符串的内容,有一个构造函数和一个析构函数,函数
13、GetLength()返回字符串长度,函数GetContents()获得字符串的内容,重载函数SetContents()给字符串设置值。,#include#include using namespace std;class CString private:int length;char*contents;public:CString();/构造函数 CString();/析构函数 int GetLength();void GetContents(char*str);void SetContents(int len,char*cont);void SetContents(char*cont);,
14、第4章 类与对象,例4.3(续一),CString:CString()length=0;contents=NULL;cout 字符串对象初始化 endl;CString:CString()cout contents 被销毁 endl;if(contents!=NULL)delete contents;int CString:GetLength()return length;void CString:GetContents(char*str)strcpy(str,contents);,第4章 类与对象,例4.3(续二),void CString:SetContents(int len,char*
15、cont)length=len;if(contents!=NULL)delete contents;contents=new charlen+1;strcpy(contents,cont);cout 两个参数的SetContents函数 endl;void CString:SetContents(char*cont)length=strlen(cont);if(contents!=NULL)delete contents;contents=new charlength+1;strcpy(contents,cont);cout 一个参数的SetContents函数 endl;,第4章 类与对象,
16、例4.3(续三),void main()CString str1,str2;/两次调用构造函数 str1.SetContents(第一个字符串);/调用有一个参数的SetContents函数 str2.SetContents(20,第二个字符串两个参数);/调用有两个参数的SetContents函数 int i=str1.GetLength();char string100;str1.GetContents(string);cout i string endl;i=str2.GetLength();str2.GetContents(string);cout i string endl;,第4章
17、 类与对象,程序运行结果为:字符串对象初始化字符串对象初始化一个参数的SetContents函数两个参数的SetContents函数12 第一个字符串20 第二个字符串两个参数第二个字符串两个参数被销毁第一个字符串被销毁,4.2 构造函数与析构函数,4.2.3 拷贝构造函数 拷贝构造函数也是构造函数,它的作用是用一个已经存在的对象初始化新对象,拷贝构造函数的参数为该类对象的引用。例4.4 设计一个复数类,两个数据成员分别表示复数的实部(real)和虚部(imag),三个构造函数分别在不同的情况下初始化对象,函数Set()设置复数实部和虚部的值,函数Print()输出复数,函数Add()和函数S
18、ub()分别实现复数的加减法运算。,第4章 类与对象,例4.4 源程序,#include iostream“using namespace std;class CComplex private:double real;double imag;public:CComplex();CComplex(double r,double i);CComplex(CComplex,第4章 类与对象,例4.4 源程序(续一),CComplex:CComplex()real=0.0;imag=0.0;CComplex:CComplex(double r,double i)real=r;imag=i;CCompl
19、ex:CComplex(CComplex,第4章 类与对象,例4.4 源程序(续二),/显示复数值void CComplex:Print()cout(real,imag)endl;/返回两个复数的相加结果CComplex CComplex:Add(CComplex c)CComplex temp;temp.real=real+c.real;temp.imag=imag+c.imag;return temp;/返回复数相减的结果CComplex CComplex:Sub(CComplex c)CComplex temp;temp.real=real-c.real;temp.imag=imag-c
20、.imag;return temp;,第4章 类与对象,例4.4 源程序(续三),void main(void)CComplex a,b(3.0,4.0),c;CComplex d(b);/调用复数类的拷贝构造函数cout a=;a.Print();cout b=;b.Print();cout d=;d.Print();c=b.Add(d);d=a.Sub(d);cout c=;c.Print();cout d=;d.Print();,第4章 类与对象,程序运行结果为:a=(0,0)b=(3,4)d=(3,4)c=(6,8)d=(-3,-4),4.3 类的组合,类的组合就是在一个类中内嵌其他类
21、的对象作为成员,因为内嵌对象是该类对象的组成部分,当创建该对象时,其内嵌对象也被自动创建。在C+中是通过构造函数的初始化表为内嵌对象初始化的。组合类带有初始化表的构造函数的定义格式为:类名:构造函数(参数表):内嵌对象1(参数表1),内嵌对象2(参数表2),构造函数体 组合类构造函数的执行顺序为:(1)按内嵌对象的声明顺序依次调用内嵌对象的构造函数。(2)然后执行组合类本身的构造函数。,第4章 类与对象,例4.5 点类CPoint和线段类CLine,#include#include using namespace std;class CPointpublic:CPoint(int x=0,in
22、t y=0)X=x;Y=y;cout CPoint 构造函数被调用 endl;CPoint(CPoint,第4章 类与对象,例4.5 点类CPoint和线段类CLine(续一),CPoint:CPoint(CPoint,第4章 类与对象,例4.5 点类CPoint和线段类CLine(续二),CLine:CLine(CPoint ps,CPoint pe):start(ps),end(pe)cout CLine 构造函数被调用 endl;float CLine:GetDistance()double x=double(end.GetX()-start.GetX();double y=double
23、(end.GetY()-start.GetY();return(float)sqrt(x*x+y*y);void main()CPoint p1(1,1),p2(4,5);CLine l(p1,p2);cout The distance is:;cout l.GetDistance()endl;,第4章 类与对象,程序运行结果为:CPoint 构造函数被调用CPoint 构造函数被调用CPoint 拷贝构造函数被调用(4,5)CPoint 拷贝构造函数被调用(1,1)CPoint 拷贝构造函数被调用(1,1)CPoint 拷贝构造函数被调用(4,5)CLine 构造函数被调用The dista
24、nce is:5,例4.5 点类CPoint和线段类CLine(续三),CLine类的对象l的构造过程:,第4章 类与对象,4.4 友元,友元提供了在不同类的成员函数之间、类的成员函数与一般函数之间进行数据共享的机制,友元分为友元函数和友元类。友元函数:一般函数或类的成员函数 友元类:友元类的所有成员函数都自动成为友元函数4.4.1 友元函数 定义友元函数时,只要在函数原型前加入关键字friend,并将函数原型放在类中,格式为:friend 类型标识符 友元函数名(参数列表);友元函数可以是一个普通函数,也可以是其他类的成员函数,在其函数体中可以通过对象名直接访问这个类的私有成员。,第4章 类
25、与对象,例4.6 定义点类CPoint,写一个函数计算两点之间的距离。,#include#include using namespace std;class CPointpublic:CPoint(int x=0,int y=0);int GetX();int GetY();private:int X,Y;CPoint:CPoint(int x,int y)X=x;Y=y;int CPoint:GetX()return X;,第4章 类与对象,int CPoint:GetY()return Y;double GetDistance(CPoint start,CPoint end)int x1,
26、y1,x2,y2;double d;x1=start.GetX();y1=start.GetY();x2=end.GetX();y2=end.GetY();d=sqrt(x2-x1)*(x2-x1)+(y2-y1)*(y2-y1);return d;void main()CPoint p1(1,1),p2(4,5);double d;d=GetDistance(p1,p2);cout The distance is:d endl;,例4.6(续),将函数GetDistance()声明为CPoint类的友元。将CPoint类修改如下:class CPoint public:CPoint(int
27、x=0,int y=0);int GetX();int GetY();friend double GetDistance(CPoint start,CPoint end);private:int X,Y;函数GetDistance()改写如下:double GetDistance(CPoint start,CPoint end)double d;d=sqrt(end.X-start.X)*(end.X-start.X)+(end.Y-start.Y)*(end.Y-start.Y);return d;,第4章 类与对象,4.4 友元,4.4.2 友元类 如果一个类(如类A)的很多成员函数都需要
28、经常访问另一个类(如类B)的私有成员,可以将类A声明为类B的友元。若A类为B类的友元类,则A类的所有成员函数都是B类的友元函数,都可以访问B类的私有成员。声明友元类的语法形式为:Class B friend class A;/声明A为B的友元类;,第4章 类与对象,例4.7 友元类的使用,#include using namespace std;class Aprivate:int x;public:void Display()cout x endl;int Getx()return x;friend class B;,第4章 类与对象,class Bprivate:A a;public:vo
29、id Set(int i);void Display();void B:Set(int i)a.x=i;void B:Display()cout a.x endl;void main()B b;b.Set(10);b.Display();,程序运行结果为:10,4.4 友元,4.4.2 友元类(续)注意:友元关系是单向的:在上面的例子中,B类是A类的友元,所以B类的成员函数可以访问A类的私有成员,但A类不是B类的友元,A类的成员函数不能访问B类的私有成员。友元关系是不能传递的:既如果A类是B类的友元,B类是C类的友元,并不能推断A类是C类的友元。,第4章 类与对象,4.5 静态成员,4.5.1
30、 静态数据成员 静态数据成员特点:在每个类中只有一个拷贝,由该类的所有对象共同维护和使用,从而实现了同一类的不同对象之间的数据共享。静态数据成员的定义格式:在定义类的成员时前面加static static 类型标识符 静态数据成员名;在类的声明中仅仅对静态数据成员进行引用性说明,必须在文件作用域的某个地方用类名限定进行定义,这时也可以进行初始化,格式如下:类型标识符 类名:静态数据成员名=初始值;静态数据成员不属于任何一个对象,可以通过类名直接对它进行访问,一般的用法是:类名:静态数据成员名,第4章 类与对象,例4.8 在CStudent类中添加静态数据成员,保存CStudent类的对象总数。
31、,#include#include using namespace std;class CStudentprivate:int number;char name10;static int total;public:CStudent(int xh,char*xm);CStudent();int GetTotal();int GetNumber();,第4章 类与对象,CStudent:CStudent(int xh,char*xm)number=xh;strcpy(name,xm);total+;CStudent:CStudent()total-;int CStudent:GetTotal()r
32、eturn total;int CStudent:GetNumber()return number;,例4.7(续),int CStudent:total=0;void func();void main()CStudent s1(10001,AAAAAA);cout s1.GetNumber()endl;cout s1.GetTotal()endl;CStudent s2(10002,BBBBBB);cout s2.GetNumber()endl;cout s1.GetTotal()endl;cout s2.GetTotal()endl;func();cout s1.GetNumber()en
33、dl;cout s1.GetTotal()endl;void func()CStudent s3(10003,CCCCCC);cout s3.GetNumber()endl;cout s3.GetTotal()endl;,第4章 类与对象,程序运行结果为:1000111000222100033100012,4.5 静态成员,4.5.1 静态数据成员(续)例4.7中,若在主函数中使用下面的语句:cout CStudent:total endl;在编译时就会产生错误信息“不能访问CStudent类的私有成员”,是由于total是类的私有静态成员,类外不能直接访问。如果改写成下面的语句:cout C
34、Student:GetTotal()endl;仍然有语法错误“GetTotal()不是静态成员函数,调用非法”。即不能用类名调用非静态成员函数。,第4章 类与对象,4.5 静态成员,4.5.2 静态成员函数 静态成员函数:在成员函数声明的前面加上关键字static。静态成员函数的特点:(1)对于公有的静态成员函数,可以通过类名或对象名来调用,而一般的非静态成员函数只能通过对象名来调用。静态成员函数可以由类名通过符号“:”直接调用。(2)静态成员函数可以直接访问该类的静态数据成员和静态函数成员,不能直接问非静态数据成员和非静态成员函数。,第4章 类与对象,例4.9 在CStudent类中添加静态
35、成员函数,#include#include using namespace std;class CStudentprivate:int number;char name10;static int total;public:CStudent(int xh,char*xm);CStudent();static int GetTotal();int GetNumber();,第4章 类与对象,CStudent:CStudent(int xh,char*xm)number=xh;strcpy(name,xm);total+;CStudent:CStudent()total-;int CStudent:
36、GetTotal()return total;int CStudent:GetNumber()return number;,例4.8(续),int CStudent:total=0;void func();void main()cout CStudent:GetTotal()endl;CStudent s1(10001,AAAAAA);cout CStudent:GetTotal()endl;CStudent s2(10002,BBBBBB);cout CStudent:GetTotal()endl;func();cout CStudent:GetTotal()endl;void func()
37、CStudent s3(10003,CCCCCC);cout s3.GetTotal()endl;,第4章 类与对象,程序运行结果为:01232,可通过类名直接访问静态成员函数,这样即使未定义CStudent类的对象,也可以访问静态数据成员total了,4.5 静态成员,4.5.2 静态成员函数(续)注意:在静态成员函数中访问非静态数据成员,或非静态成员函数,都会产生语法错误。例如:int CStudent:GetTotal()cout number;return total;,第4章 类与对象,语法错误,不能在静态成员函数中访问非静态数据成员,4.6 常对象与常成员函数,4.6.1 常对象
38、常对象定义格式:const 类名 对象名;引用对象数组元素的公有成员:数组名下标.成员名;,第4章 类与对象,例4.10 常对象调用普通成员函数产生错误,#include using namespace std;class Apublic:A(float a,float b)x=a;y=b;void Output()cout x,y endl;private:float x,y;void main()const A a(20,20);a.Output();/错误,常对象不能调用普通成员函数,第4章 类与对象,4.6 常对象与常成员函数,4.6.2 常成员函数 常成员函数的定义格式:函数类型 函
39、数名(参数列表)const;例如:float area(float r)const;,第4章 类与对象,例4.11 使用常成员函数访问常对象中的数据成员,#include using namespace std;class Apublic:A(float a,float b)x=a;y=b;void Output();void Output()const;private:float x,y;void A:Output()cout 普通成员函数 endl;cout x,y endl;,第4章 类与对象,void A:Output()const cout 常成员函数 endl;cout x,y e
40、ndl;void main()A a1(10,20);const A a2(30,40);a1.Output();a2.Output();,程序运行结果:普通成员函数 10,20 常成员函数 30,40,4.6 常对象与常成员函数,4.6.2 常成员函数注意:(1)const是函数的一部分,在说明部分和实现部分都要加上关键字const。(2)在常成员函数中,不能更新对象的数据成员,也不能调用该类的普通成员函数。(3)常对象只能调用常成员函数,不能调用该类的普通成员函数。普通对象即可以调用普通成员函数,也可以调用常成员函数,但会优先调用普通成员函数。,第4章 类与对象,4.7 对象数组与对象指针
41、,4.7.1 对象数组 对象数组:数组中的每一个元素都是类的对象。声明一个一维对象数组的语法形式:类名 数组名常量表达式;引用对象数组元素的公有成员:数组名下标.成员名;对象数组的初始化:调用构造函数对每个元素初始化 如:CStudent s3=CStudent(10001,AAAAAA),CStudent(10002,BBBBBB),CStudent(10003,CCCCCC);,第4章 类与对象,例4.12 对象数组的应用,#include#include using namespace std;class CStudentprivate:int number;char name10;in
42、t age;public:CStudent(int xh,char*xm,int a);int GetAge();,第4章 类与对象,CStudent:CStudent(int xh,char*xm,int a)number=xh;strcpy(name,xm);age=a;int CStudent:GetAge()return age;,例4.12(续),void main()int sum=0;CStudent s5=CStudent(10001,AAAAAA,20),CStudent(10002,BBBBBB,22),CStudent(10003,CCCCCC,24),CStudent(
43、10004,DDDDDD,26),CStudent(10005,EEEEEE,28);for(int i=0;i5;i+)sum+=si.GetAge();cout sum/5 endl;,第4章 类与对象,程序运行结果为:24,4.7 对象数组与对象指针,4.7.2 对象指针 对象指针:用于存放对象地址的变量。声明对象指针的语法形式:类名*对象指针名;例如:CStudent*p;CStudent s(1001,”AAAAAA”,20);p=&s;通过对象指针访问成员的方法为:对象指针名-成员名,第4章 类与对象,例4.13 通过对象指针访问成员,将例6.9主函数改写,void main()i
44、nt sum=0;CStudent*p5;p0=new CStudent(10001,AAAAAA,20);p1=new CStudent(10002,BBBBBB,22);p2=new CStudent(10003,CCCCCC,24);p3=new CStudent(10004,DDDDDD,26);p4=new CStudent(10005,EEEEEE,28);for(int i=0;iGetAge();cout sum/5 endl;for(i=0;i5;i+)delete pi;,第4章 类与对象,程序运行结果为:24,4.8 this指针,this指针:类的每个普通成员函数都有一
45、个隐含的this指针参数,不需要显示说明。this指针指向调用该函数的对象。例:class CPoint public:CPoint(int x=0,int y=0);int GetX();int GetY();private:int x,y;CPoint:CPoint(int x,int y)x=x;y=y;,第4章 类与对象,此处的x和y都是函数形参中的x和y,因为参数是局部变量,在函数体中优先访问(同名覆盖),因此此处无法访问到类成员中的x和y,可将构造函数改写如下:CPoint:CPoint(int x,int y)this-x=x;this-y=y;定义该类对象:CPoint p(1
46、0,20);,例4.14 定义一个二叉搜索树,在树中查找指定节点,#include using namespace std;class CTreeprivate:int value;/节点的值CTree*left,*right;/节点的左节点指针、右节点指针public:CTree(int v);CTree();int GetValue();/得到节点的值void add(int v);/向二叉树添加一个节点CTree*find(int v);/查找值为v的节点;,第4章 类与对象,例4.14(续一),CTree:CTree(int v)value=v;left=NULL;right=NULL
47、;CTree:CTree()if(left)delete left;left=NULL;if(right)delete right;right=NULL;,第4章 类与对象,例4.14(续二),int CTree:GetValue()return value;void CTree:add(int v)if(v=value)/保证节点的值不重复return;else if(v add(v);/用递归方法将值插入左树elseleft=new CTree(v);/新建一个值为v的节点作为左节点elseif(right!=NULL)right-add(v);elseright=new CTree(v)
48、;,第4章 类与对象,将某个值插入到二叉树的合适的位置,本例建立的是二叉树搜索树,节点没有重复的值,且该节点左边节点的值都小于该节点的值,该节点右边节点的值都大于该节点的值,仍然使用递归的方法将指定的值插入到合适的位置。,例4.14(续三),CTree*CTree:find(int v)if(v=value)return this;else if(v find(v);elsereturn NULL;else if(right!=NULL)return right-find(v);elsereturn NULL;,第4章 类与对象,函数find()也是使用递归的方法在树中查找指定的值,如查到就返
49、回该节点的指针,否则返回NULL。因为本函数要返回该节点的指针,因此必须使用this指针,否则没有办法实现。,例4.14(续四),void main()CTree*root;root=new CTree(10);root-add(20);root-add(2);root-add(6);root-add(35);root-add(15);CTree*n1,*n2;n1=root-find(6);if(n1)cout GetValue()find(7);if(n2)cout GetValue()endl;elsecout not found!endl;delete root;,第4章 类与对象,程
50、序运行结果为:6not found!,例4.15 设计一个栈类,栈是一种特殊的线性表,这种线性表只能在固定的一端进行插入和删除操作,允许插入和删除的一端称为栈顶,另一端称为栈底。一个新元素只能从栈顶一端进入,删除时,只能删除栈顶的元素。因此栈的运算规则是“先进后出”(或称“后进先出”)。栈有三种基本操作:进栈(或入栈),退栈(或出栈)和获取栈顶元素。对于顺序栈类,进栈操作的方法是先将进栈元素赋给栈顶,然后将栈顶元素下标加1。出栈操作的方法是,将栈顶元素下标减1。(具体代码参见程序),第4章 类与对象,例4.16 设计一个日期类,包含数据成员year、month、day;成员函数有判断某年是否伟