1、第4章 类与对象第4章 类与对象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章 类与对象void CRect:SetColor(char*c)strcpy(color,c);void CRect:SetSize(int l,int w)length=l;width=w;void CRect:Move(int t,int
2、 l)top=t;left=l;void CRect:Draw()cout 矩形左上角坐标为(left ,top )endl;cout 矩形长和宽分别为 length ,width endl;cout 矩形的颜色是 color endl;第4章 类与对象域运算符(域运算符(:)用于指出该函数是)用于指出该函数是哪一个类的成员函数,用法:哪一个类的成员函数,用法:类名类名:函数名(参数表)函数名(参数表)void main()CRect r;r.SetColor(Red);r.Move(10,20);r.SetSize(100,200);r.Draw();r.Move(50,50);r.SetC
3、olor(Blue);r.Draw();第4章 类与对象定义定义CRect类的对象,定义对象的类的对象,定义对象的格式:格式:类名类名 对象名对象名1,对象名,对象名2,访问对象的公有成员,格式为:访问对象的公有成员,格式为:对象名对象名.公有成员函数名(参数表)公有成员函数名(参数表)对象名对象名.公有数据成员名公有数据成员名 第4章 类与对象在主函数中不能访问类的私有成员在主函数中不能访问类的私有成员第4章 类与对象第4章 类与对象第4章 类与对象第4章 类与对象 返 回第4章 类与对象class CRectprivate:char color10;public:CRect();CRect
4、(char*c,int t,int left,int len,int wid);void SetColor(char*c);二者是重载函数,在定义对象时,二者是重载函数,在定义对象时,如果不给出参数,就自动调用第一如果不给出参数,就自动调用第一个构造函数,如果给定个构造函数,如果给定5个参数就个参数就自动调用第二个构造函数。自动调用第二个构造函数。第4章 类与对象第4章 类与对象第4章 类与对象程序运行结果:3.14,10,10第4章 类与对象#include#include using namespace std;class CString private:int length;char*c
5、ontents;public:CString();/构造函数构造函数 CString();/析构函数析构函数 int GetLength();void GetContents(char*str);void SetContents(int len,char*cont);void SetContents(char*cont);第4章 类与对象CString:CString()length=0;contents=NULL;cout 字符串对象初始化字符串对象初始化 endl;第4章 类与对象void CString:SetContents(int len,char*cont)length=len;i
6、f(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章 类与对象重载函数重
7、载函数SetContents()都是将要设置的字符串长都是将要设置的字符串长度赋给数据成员度赋给数据成员length,然后判断原来数据成员然后判断原来数据成员contents是否已经有数是否已经有数据(即已经不为空据(即已经不为空NULL了),如果已不为空,则了),如果已不为空,则先释放原来的内存,再根先释放原来的内存,再根据新字符串的长度重新申据新字符串的长度重新申请内存。请内存。void main()CString str1,str2;/两次调用构造函数两次调用构造函数 str1.SetContents(第一个字符串第一个字符串);/调用有一个参数的调用有一个参数的SetContents函
8、数函数 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章 类与对象 第4章 类与对象#include iostream“using namespace std;class CComplex privat
9、e:double real;double imag;public:CComplex();CComplex(double r,double i);CComplex(CComplex&c);/复数类的拷贝构造函数声明复数类的拷贝构造函数声明void Set(double r,double i);void Print();CComplex Add(CComplex c);CComplex Sub(CComplex c);第4章 类与对象CComplex:CComplex()real=0.0;imag=0.0;CComplex:CComplex(double r,double i)real=r;ima
10、g=i;CComplex:CComplex(CComplex&c)/复数类的拷贝构造函数定义复数类的拷贝构造函数定义real=c.real;imag=c.imag;/设置复数类的实部和虚部设置复数类的实部和虚部void CComplex:Set(double r,double i)real=r;imag=i;第4章 类与对象/显示复数值显示复数值void CComplex:Print()cout (real ,imag )endl;/返回两个复数的相加结果返回两个复数的相加结果CComplex CComplex:Add(CComplex c)CComplex temp;temp.real=re
11、al+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.imag;return temp;第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.Pr
12、int();c=b.Add(d);d=a.Sub(d);cout c=;c.Print();cout d=;d.Print();第4章 类与对象 返 回第4章 类与对象#include#include using namespace std;class CPointpublic:CPoint(int x=0,int y=0)X=x;Y=y;cout CPoint 构造函数被调用构造函数被调用 endl;CPoint(CPoint&p);int GetX()return X;int GetY()return Y;private:int X,Y;第4章 类与对象CPoint:CPoint(CPoi
13、nt&p)X=p.X;Y=p.Y;cout CPoint 拷贝构造函数被调用拷贝构造函数被调用 endl;cout (X ,Y )endl;class CLinepublic:CLine(CPoint p1,CPoint p2);float GetDistance();private:CPoint start;CPoint end;第4章 类与对象CLine:CLine(CPoint ps,CPoint pe):start(ps),end(pe)cout CLine 构造函数被调用构造函数被调用 endl;float CLine:GetDistance()double x=double(end
14、.GetX()-start.GetX();double y=double(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章 类与对象 CLine类的对象l的构造过程:第4章 类与对象CLine l(p1,p2)CLine:CLine(CPoint ps,CPoint pe):start(ps),end(pe)CPoint:CPoint(CPoin
15、t&p)(1)(2)(3)(4)返 回第4章 类与对象#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,y1,x2,y2;do
16、uble 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;将函数GetDistance()声明为CPoint类的友元。将CPoint类修改如下:class CPoint public:CPoint(int x=0,int y=0);int Get
17、X();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章 类与对象#include using namespace std;class Aprivate:int x;p
18、ublic:void Display()cout x endl;int Getx()return x;friend class B;第4章 类与对象class Bprivate:A a;public:void 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();第4章 类与对象 返 回第4章 类与对象#include#include using namespace std;class CStudentprivate:
19、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()return total;int CStudent:GetNumber()return number;int CStudent
20、: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()endl;cout s1.GetTotal()endl;void func()CStudent s3(10003,CCCCCC);cout s3.
21、GetNumber()endl;cout s3.GetTotal()endl;第4章 类与对象10001AAAAAA10002BBBBBB10003CCCCCCnumbernametotal s1 s2 s3 第4章 类与对象第4章 类与对象#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()
22、;第4章 类与对象CStudent:CStudent(int xh,char*xm)number=xh;strcpy(name,xm);total+;CStudent:CStudent()total-;int CStudent:GetTotal()return total;int CStudent:GetNumber()return number;int CStudent:total=0;void func();void main()cout CStudent:GetTotal()endl;CStudent s1(10001,AAAAAA);cout CStudent:GetTotal()en
23、dl;CStudent s2(10002,BBBBBB);cout CStudent:GetTotal()endl;func();cout CStudent:GetTotal()endl;void func()CStudent s3(10003,CCCCCC);cout s3.GetTotal()endl;第4章 类与对象可通过类名直接访问静态成员函数,可通过类名直接访问静态成员函数,这样即使未定义这样即使未定义CStudent类的对象,类的对象,也可以访问静态数据成员也可以访问静态数据成员total了了 第4章 类与对象 返 回第4章 类与对象第4章 类与对象第4章 类与对象第4章 类与对象
24、程序运行结果:普通成员函数 10,20 常成员函数 30,40第4章 类与对象第4章 类与对象#include#include using namespace std;class CStudentprivate:int number;char name10;int 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;v
25、oid main()int sum=0;CStudent s5=CStudent(10001,AAAAAA,20),CStudent(10002,BBBBBB,22),CStudent(10003,CCCCCC,24),CStudent(10004,DDDDDD,26),CStudent(10005,EEEEEE,28);for(int i=0;i5;i+)sum+=si.GetAge();cout sum/5 endl;第4章 类与对象第4章 类与对象void main()int sum=0;CStudent*p5;p0=new CStudent(10001,AAAAAA,20);p1=ne
26、w 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章 类与对象 返 回第4章 类与对象可将构造函数改写如下:可将构造函数改写如下:#include using namespace std;class CTreeprivate:int value;/节点的值CTree*
27、left,*right;/节点的左节点指针、右节点指针public:CTree(int v);CTree();int GetValue();/得到节点的值void add(int v);/向二叉树添加一个节点CTree*find(int v);/查找值为v的节点;第4章 类与对象CTree:CTree(int v)value=v;left=NULL;right=NULL;CTree:CTree()if(left)delete left;left=NULL;if(right)delete right;right=NULL;第4章 类与对象valueleftrightvNULLNULL int C
28、Tree:GetValue()return value;void CTree:add(int v)if(v=value)/保证节点的值不重复保证节点的值不重复return;else if(v add(v);/用递归方法将值插入左树用递归方法将值插入左树elseleft=new CTree(v);/新建一个值为新建一个值为v v的节点作为左节点的节点作为左节点elseif(right!=NULL)right-add(v);elseright=new CTree(v);第4章 类与对象 CTree*CTree:find(int v)if(v=value)return this;else if(v
29、find(v);elsereturn NULL;else if(right!=NULL)return right-find(v);elsereturn NULL;第4章 类与对象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()endl;elsecout not found!find(7);if(n2)cout GetValue()endl
30、;elsecout not found!endl;delete root;第4章 类与对象 返 回1022061535 栈是一种特殊的线性表,这种线性表只能在固定的一端进行插入和删除操作,允许插入和删除的一端称为栈顶,另一端称为栈底。一个新元素只能从栈顶一端进入,删除时,只能删除栈顶的元素。因此栈的运算规则是“先进后出”(或称“后进先出”)。栈有三种基本操作:进栈(或入栈),退栈(或出栈)和获取栈顶元素。对于顺序栈类,进栈操作的方法是先将进栈元素赋给栈顶,然后将栈顶元素下标加1。出栈操作的方法是,将栈顶元素下标减1。(具体代码参见程序)第4章 类与对象 分析:计算某天是当年的第几天,只要知道每
31、月由多少天就容易计算了,如1、3、5、7、8、10、12月有31天,4、6、9、11月有30天,如果是闰年2月有29天,否则2月有28天。计算某天是星期几,首先计算从原点日子(公元前1年12月31日为星期日)到当前日期的天数TotalDays,这个天数应该等于这段时间经历多少年的总天数加上当年的天数,然后计算TotalDays除以7的余数,余数是0为星期日、余数是1为星期一、余数是6为星期六。可用下面的公式计算:(year 1)*365 +year /4 -year/100+year/400+days)%7;其中year-1是经历的整年数,year /4 -year/100+year/400是经历的闰年数,闰年一次就要增加一天,days是当年经历的天数。(具体代码参见程序)第4章 类与对象