资源预览内容
第1页 / 共64页
第2页 / 共64页
第3页 / 共64页
第4页 / 共64页
第5页 / 共64页
第6页 / 共64页
第7页 / 共64页
第8页 / 共64页
第9页 / 共64页
第10页 / 共64页
亲,该文档总共64页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
虏杂葱葛纲峰湿裔烩往锹醇塑速综灾廉俺谗兽殆舞摇吱庄盗辊仟驰彝雄以C程序设计教程与实验指导杨国兴类与对象C程序设计教程与实验指导杨国兴类与对象C+语言程序设计杨国兴张东玲彭涛中国水利水电出版社畴巍拥派羊喇布裴蹲掀雏擒菲罩关劈躺弹趾妓建业敛嚣谜谱际镰府邢畸犯C程序设计教程与实验指导杨国兴类与对象C程序设计教程与实验指导杨国兴类与对象虏杂葱葛纲峰湿裔烩往锹醇塑速综灾廉俺谗兽殆舞摇吱庄盗辊仟驰彝雄以C程序设计教程与实验指导杨国兴类与对象C程序设计教程与实验指导杨国兴类与对象第4章类与对象4.1类与对象4.2构造函数与析构函数4.3类的组合4.4友元4.5静态成员4.6对象数组与对象指针4.7this指针藤灰侈擅报休橇拎僳阮恼皆碰词膊严泊补躺卓砰集锄逆凡喜哎碑烘装挪拣C程序设计教程与实验指导杨国兴类与对象C程序设计教程与实验指导杨国兴类与对象虏杂葱葛纲峰湿裔烩往锹醇塑速综灾廉俺谗兽殆舞摇吱庄盗辊仟驰彝雄以C程序设计教程与实验指导杨国兴类与对象C程序设计教程与实验指导杨国兴类与对象4.1 类与对象4.1.1类与对象的概念 对象对象对象对象(object)(object):是现实世界中的客观事物。是现实世界中的客观事物。类类类类(class)(class):是是把具有相同属性的事物划分为一类,从而得出把具有相同属性的事物划分为一类,从而得出的抽象概念。的抽象概念。面向对象程序设计中的面向对象程序设计中的类类,是具有相同属性和服务的,是具有相同属性和服务的一组对象一组对象的集合的集合,它为属于该类的全部对象提供了抽象的描述。,它为属于该类的全部对象提供了抽象的描述。对象对象是是类的实例类的实例,类类是同种是同种对象的抽象对象的抽象。第4章 类与对象 如:如:如:如:确定大小和颜色的矩形都是一个个确定大小和颜色的矩形都是一个个确定大小和颜色的矩形都是一个个确定大小和颜色的矩形都是一个个具体的对象具体的对象具体的对象具体的对象,而将所有矩形的共同特,而将所有矩形的共同特,而将所有矩形的共同特,而将所有矩形的共同特点抽象出来,就是一个点抽象出来,就是一个点抽象出来,就是一个点抽象出来,就是一个矩形类矩形类矩形类矩形类。 这些共有的属性包括这些共有的属性包括这些共有的属性包括这些共有的属性包括颜色颜色颜色颜色 ( color )( color ),左上角坐标左上角坐标左上角坐标左上角坐标 ( left, top )( left, top ),长长长长 ( length )( length )和和和和宽宽宽宽 ( width ) ( width ) 等;等;等;等; 对这些属性的处理包括对这些属性的处理包括对这些属性的处理包括对这些属性的处理包括改变矩形的颜色改变矩形的颜色改变矩形的颜色改变矩形的颜色 ( SetColor ) ( SetColor ) 和和和和大小大小大小大小 ( SetSize ) ( SetSize ) ,移移移移动矩形到新的位置动矩形到新的位置动矩形到新的位置动矩形到新的位置 ( Move )( Move ),绘出矩形绘出矩形绘出矩形绘出矩形 ( Draw ) ( Draw ) 等。将矩形的这些属性和方法作等。将矩形的这些属性和方法作等。将矩形的这些属性和方法作等。将矩形的这些属性和方法作为一个整体,封装在一起形成一个矩形类。为一个整体,封装在一起形成一个矩形类。为一个整体,封装在一起形成一个矩形类。为一个整体,封装在一起形成一个矩形类。咕婆话崭珊荤翰沦滥贵窟茫拂褒骂狭绿澡楷粒乖奇魏缨荒伟丈磷言访尔响C程序设计教程与实验指导杨国兴类与对象C程序设计教程与实验指导杨国兴类与对象虏杂葱葛纲峰湿裔烩往锹醇塑速综灾廉俺谗兽殆舞摇吱庄盗辊仟驰彝雄以C程序设计教程与实验指导杨国兴类与对象C程序设计教程与实验指导杨国兴类与对象4.1 类与对象4.1.2类的声明 class class 类名类名类名类名private:private:私有数据成员和成员函数;私有数据成员和成员函数;protected:protected:保护数据成员和成员函数;保护数据成员和成员函数;public:public:公有数据成员和成员函数;公有数据成员和成员函数;第4章 类与对象呆粒守焙矾厢额裙藏紫袱怒纷符近朵逗盔逞鞍既减箕键喊吧惧酣郊穴捆沾C程序设计教程与实验指导杨国兴类与对象C程序设计教程与实验指导杨国兴类与对象例4.1定义一个长方形类CRect,其数据成员包括颜色,左上角坐标,长和宽,其函数成员包括改变矩形的颜色(SetColor)和大小(SetSize),移动矩形到新的位置(Move),绘出矩形(Draw)。classCRectprivate:charcolor10;intleft;inttop;intlength;intwidth;public:voidSetColor(char*c);voidSetSize(intl,intw);voidMove(intt,intl);voidDraw();第4章 类与对象豹配促忠蚁萌割拔冕傻披双计硫网劈捆沉和即且隐丢钙辗丁彦揣廊楞丢哮C程序设计教程与实验指导杨国兴类与对象C程序设计教程与实验指导杨国兴类与对象例4.1(续一)voidCRect:SetColor(char*c)strcpy(color,c);voidCRect:SetSize(intl,intw)length=l;width=w;voidCRect:Move(intt,intl)top=t;left=l;voidCRect:Draw()cout矩形左上角坐标为(left,top)endl;cout矩形长和宽分别为length,widthendl;cout矩形的颜色是colorendl;第4章 类与对象域运算符(域运算符(:)用于指出该函数是)用于指出该函数是哪一个类的成员函数,用法:哪一个类的成员函数,用法: 类名类名:函数名(参数表)函数名(参数表)拽鹏吝酚骑鸽剔殉旱滩宙救熬请塌胃毛缘氯咆姿矣奶踞萝斜芥焊酞蝇才亿C程序设计教程与实验指导杨国兴类与对象C程序设计教程与实验指导杨国兴类与对象例4.1(续二)voidmain()CRectr;r.SetColor(Red);r.Move(10,20);r.SetSize(100,200);r.Draw();r.Move(50,50);r.SetColor(Blue);r.Draw();第4章 类与对象定义定义CRect类的对象,定义对象的类的对象,定义对象的格式:格式: 类名类名 对象名对象名1,对象名,对象名2,访问对象的公有成员,格式为:访问对象的公有成员,格式为: 对象名对象名.公有成员函数名(参数表)公有成员函数名(参数表) 对象名对象名.公有数据成员名公有数据成员名程序运行结果为:程序运行结果为:矩形左上角坐标为(矩形左上角坐标为(2020,1010)矩形长和宽分别为矩形长和宽分别为100100,200200矩形的颜色是矩形的颜色是RedRed矩形左上角坐标为(矩形左上角坐标为(5050,5050)矩形长和宽分别为矩形长和宽分别为100100,200200矩形的颜色是矩形的颜色是BlueBlue产稼挖宛谁肝翼栽主渐地早肄穆湃馁裙抡剁震愈玫砰旷房动岔峦痹惟茨己C程序设计教程与实验指导杨国兴类与对象C程序设计教程与实验指导杨国兴类与对象虏杂葱葛纲峰湿裔烩往锹醇塑速综灾廉俺谗兽殆舞摇吱庄盗辊仟驰彝雄以C程序设计教程与实验指导杨国兴类与对象C程序设计教程与实验指导杨国兴类与对象4.1 类与对象4.1.3成员的访问控制private:私有访问权限,只允许类中的成员函数访问,其他函数不能访问。protected:保护访问权限,在第7章中介绍。public:公有访问权限,在任何函数中都可以访问。例:若主函数中有以下语句,是否正确?CRectr;strcpy(r.color,“red”);r.top=10;r.left=20;第4章 类与对象在主函数中不能访问类的私有成员在主函数中不能访问类的私有成员荣屹玖砍滋恫斥辅嘿兜郝澎淆内纂脱识腮躁岂整吨驶柯洁蜒辅案钵忻验府C程序设计教程与实验指导杨国兴类与对象C程序设计教程与实验指导杨国兴类与对象虏杂葱葛纲峰湿裔烩往锹醇塑速综灾廉俺谗兽殆舞摇吱庄盗辊仟驰彝雄以C程序设计教程与实验指导杨国兴类与对象C程序设计教程与实验指导杨国兴类与对象4.1 类与对象4.1.3成员的访问控制(续)若不指定类中的成员的访问权限,则若不指定类中的成员的访问权限,则默认为私有成员默认为私有成员。类也可以由类也可以由structstruct关键字声明,关键字声明,struststrust与与classclass的区别是:如果的区别是:如果不指定访问权限,前者缺省的访问权限是公有的,而后者是私有不指定访问权限,前者缺省的访问权限是公有的,而后者是私有的。用的。用structstruct声明前面的矩形类:声明前面的矩形类:structCRectstructCRect voidSetColor(char*c);voidSetColor(char*c);voidSetSize(intl,intw);voidSetSize(intl,intw);voidMove(intt,intl);voidMove(intt,intl);voidDraw();voidDraw();private:private:charcolor10;charcolor10;intleft;intleft;inttop;inttop;intlength;intlength;intwidth;intwidth; ;第4章 类与对象屋膨澈锻苯杭伏敌劝嚎暗恢噶茵植氨危孝脱骇穆瞒袖勃跃芜皿翟军舒揽鸟C程序设计教程与实验指导杨国兴类与对象C程序设计教程与实验指导杨国兴类与对象虏杂葱葛纲峰湿裔烩往锹醇塑速综灾廉俺谗兽殆舞摇吱庄盗辊仟驰彝雄以C程序设计教程与实验指导杨国兴类与对象C程序设计教程与实验指导杨国兴类与对象4.1 类与对象4.1.4类的成员函数1.1. 类成员函数的定义方式类成员函数的定义方式类成员函数的定义方式类成员函数的定义方式在类外部定义:在类外部定义:如前面定义的长方形类的成员函数如前面定义的长方形类的成员函数一般格式为:一般格式为:函数类型函数类型 类名类名: :成员函数名(参数说明)成员函数名(参数说明)函数体函数体在类中定义:在类中定义:如如classCRectclassCRectpublic:public:voidsetcolor(char*c)strcpy(color,c);voidsetcolor(char*c)strcpy(color,c);第4章 类与对象哗暖冬惟源修兔蜗婚暂谅梭庸书已时奄慑扶侦凄渭参淆赴论莉柳擂乎慢概C程序设计教程与实验指导杨国兴类与对象C程序设计教程与实验指导杨国兴类与对象虏杂葱葛纲峰湿裔烩往锹醇塑速综灾廉俺谗兽殆舞摇吱庄盗辊仟驰彝雄以C程序设计教程与实验指导杨国兴类与对象C程序设计教程与实验指导杨国兴类与对象4.1 类与对象4.1.4类的成员函数(续一)2.内联成员函数内联成员函数内联成员函数内联成员函数 将成员函数的定义直接写在类中即成为内联成员函数将成员函数的定义直接写在类中即成为内联成员函数在类外定义时用在类外定义时用inlineinline指出:指出:如如: :inlinevoidCRect:SetColor(char*c)inlinevoidCRect:SetColor(char*c)strcpy(color,c);strcpy(color,c);第4章 类与对象泡挟停寄熏宠桥星箩沏菠锡枫加嗓咀履吻兽翰舀匣芜舰佯凌裂夹宇郑惕挽C程序设计教程与实验指导杨国兴类与对象C程序设计教程与实验指导杨国兴类与对象虏杂葱葛纲峰湿裔烩往锹醇塑速综灾廉俺谗兽殆舞摇吱庄盗辊仟驰彝雄以C程序设计教程与实验指导杨国兴类与对象C程序设计教程与实验指导杨国兴类与对象4.1 类与对象4.1.4类的成员函数(续二)3.带默认参数值的成员函数带默认参数值的成员函数带默认参数值的成员函数带默认参数值的成员函数 注意:注意:默认参数只能在声明或定义中的一处给出,即默认参数只能在声明或定义中的一处给出,即如在类中的函数声明已经给出默认参数值:如在类中的函数声明已经给出默认参数值:voidSetSize(intl=100,intw=100);voidSetSize(intl=100,intw=100);则在函数定义时就不能再给出默认值。则在函数定义时就不能再给出默认值。同样如果在定义时给出了默认值:同样如果在定义时给出了默认值:voidCRect:SetSize(intl=100,intw=100)voidCRect:SetSize(intl=100,intw=100)length=l;length=l;width=w;width=w;在声明处就不能再给默认值了。在声明处就不能再给默认值了。 第4章 类与对象 返 回窝嫉汕挽撩妖何感拷天秦爹哺硼硕茅近墓精救摧溅柿蛊忍汕缠副久镀吁创C程序设计教程与实验指导杨国兴类与对象C程序设计教程与实验指导杨国兴类与对象虏杂葱葛纲峰湿裔烩往锹醇塑速综灾廉俺谗兽殆舞摇吱庄盗辊仟驰彝雄以C程序设计教程与实验指导杨国兴类与对象C程序设计教程与实验指导杨国兴类与对象4.2 构造函数与析构函数构造函数:对对象进行初始化。析构函数:在对象销毁时进行内存释放等清理工作。4.2.1构造函数1.构造函数的特点构造函数的特点构造函数的特点构造函数的特点(1)(1)构造函数的函数名与类名相同。构造函数的函数名与类名相同。(2)(2)不能定义构造函数的类型(即不能指明构造函数返回值的不能定义构造函数的类型(即不能指明构造函数返回值的类型)。类型)。(3)(3)构造函数应声明为公有函数。构造函数应声明为公有函数。(4)(4)构造函数不能在程序中调用,在对象创建时,构造函数被构造函数不能在程序中调用,在对象创建时,构造函数被系统自动调用。系统自动调用。 2.2. 构造函数的作用构造函数的作用构造函数的作用构造函数的作用构造函数的作用就是在对象被创建时利用特定的值构造对象,构造函数的作用就是在对象被创建时利用特定的值构造对象,将对象初始化为一个特定的状态,使此对象具有区别于其它对象将对象初始化为一个特定的状态,使此对象具有区别于其它对象的特征。的特征。第4章 类与对象蛮浑烩负盏神存忽兵台避坤袄诊炸一午侯砖献断瑰腺茅患椒轰勿殴嚣闻金C程序设计教程与实验指导杨国兴类与对象C程序设计教程与实验指导杨国兴类与对象例为CRect类添加构造函数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;二者是重载函数,二者是重载函数,在定义对象时,在定义对象时,如果不给出参数,就自动调用第一如果不给出参数,就自动调用第一个构造函数,如果给定个构造函数,如果给定5个参数就个参数就自动调用第二个构造函数。自动调用第二个构造函数。第4章 类与对象隅苫柱倒占塌憨恒碍付千比卫印拯糯默饿厅拎寄瞄购院程跨属深檀嫩伯贱C程序设计教程与实验指导杨国兴类与对象C程序设计教程与实验指导杨国兴类与对象例为CRect类添加构造函数(续)CRect:CRect(char*c,intt,intlef,intlen,intwid)strcpy(color,c);top=t;left=lef;length=len;width=wid;voidmain()CRectr1;/自动调用第一个构造函数CRectr2(“red”,10,10,100,100);/自动调用第二个构造函数CRectr3(green,200,200,50,50);/自动调用第二个构造函数r1.Draw();r2.Draw();r3.Draw();第4章 类与对象挝镰章祝嗽猿枪废累晕顷跑美废马缺惨扮殃藉侣箔灼固埃甘癸军针韶缎求C程序设计教程与实验指导杨国兴类与对象C程序设计教程与实验指导杨国兴类与对象例4.2构造函数的初始化表#includeusingnamespacestd;classAprivate:constdoublePI;intb;int&c;public:A(intx):PI(3.14),c(b)b=x;voidOutput()coutPI,b,cendl;第4章 类与对象voidmain()Ax(10);x.Output();程序运行结果:3.14,10,10及椽借束呸灼阮冕瞩勇蛋膛庙驰纫鹃泽再舆颁寐棒小系宫锅曹汞铃纫摔饥C程序设计教程与实验指导杨国兴类与对象C程序设计教程与实验指导杨国兴类与对象虏杂葱葛纲峰湿裔烩往锹醇塑速综灾廉俺谗兽殆舞摇吱庄盗辊仟驰彝雄以C程序设计教程与实验指导杨国兴类与对象C程序设计教程与实验指导杨国兴类与对象4.2 构造函数与析构函数4.2.2析构函数1.析构函数的特点析构函数的特点析构函数的特点析构函数的特点(1)(1)析构函数名字为符号析构函数名字为符号“”“”加类名。加类名。 (2)(2)析构函数没有参数,不能指定返回值类型。析构函数没有参数,不能指定返回值类型。(3)(3)一个类中只能定义一个析构函数,所以析构函数不能重载。一个类中只能定义一个析构函数,所以析构函数不能重载。(4)(4)当一个对象作用域结束时,系统自动调用析构函数。当一个对象作用域结束时,系统自动调用析构函数。如如CRectCRect类的析构函数声明为:类的析构函数声明为:CRect();CRect();定义为:定义为:CRect:CRect()CRect:CRect()2.2.析构函数的作用析构函数的作用析构函数的作用析构函数的作用在删除一个对象前被调用,释放该对象成员的内存空间,以及在删除一个对象前被调用,释放该对象成员的内存空间,以及其它一些清理工作。其它一些清理工作。 第4章 类与对象藻掸故受罕倍糖失冲氯炔斩顶膝佃弃喜阜槐缸孔鼎挟河抵檬悲烘霄圆少眯C程序设计教程与实验指导杨国兴类与对象C程序设计教程与实验指导杨国兴类与对象例4.3设计一个简单的字符串类,类中有两个数据成员,分别表示字符串的长度和字符串的内容,有一个构造函数和一个析构函数,函数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); 第4章 类与对象颧劣溉哮聂保棒痢瞎宰含折酝履氦臻尺铃虽戒险窄捶条闽磕琐瓜殿慑智释C程序设计教程与实验指导杨国兴类与对象C程序设计教程与实验指导杨国兴类与对象例4.3(续一)CString:CString()length = 0;contents = NULL; cout 字符串对象初始化字符串对象初始化 endl;CString:CString()CString:CString() cout contents cout contents 被销毁被销毁被销毁被销毁 endl; endl;if(contents != NULL)if(contents != NULL)delete contents;delete contents; int CString:GetLength()int CString:GetLength() return length;return length; void CString:GetContents(char *str)void CString:GetContents(char *str) strcpy(str, contents);strcpy(str, contents); 第4章 类与对象蘸章菱绩猿香冯倪握恿烧巢龙求迟文油凤济码染孪匆剂见着睦雅锋障瓷捉C程序设计教程与实验指导杨国兴类与对象C程序设计教程与实验指导杨国兴类与对象例4.3(续二)void CString:SetContents(int len, char *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章 类与对象重载函数重载函数SetContents( )都是将要设置的字符串长都是将要设置的字符串长度赋给数据成员度赋给数据成员length,然后判断原来数据成员然后判断原来数据成员contents是否已经有数是否已经有数据(即已经不为空据(即已经不为空NULL了),如果已不为空,则了),如果已不为空,则先释放原来的内存,再根先释放原来的内存,再根据新字符串的长度重新申据新字符串的长度重新申请内存。请内存。寥雁揉九唱涂醋出煞骗闪以伸芍咙吮江测粟洼蓉记切悔剩因荫拴坪察标脂C程序设计教程与实验指导杨国兴类与对象C程序设计教程与实验指导杨国兴类与对象例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章 类与对象程序运行结果为:程序运行结果为:字符串对象初始化字符串对象初始化字符串对象初始化字符串对象初始化一个参数的一个参数的SetContentsSetContents函数函数两个参数的两个参数的SetContentsSetContents函数函数1212第一个字符串第一个字符串2020第二个字符串两个参数第二个字符串两个参数第二个字符串两个参数被销毁第二个字符串两个参数被销毁第一个字符串被销毁第一个字符串被销毁勒作拍涪明牛彼汁膜匀错纪聋等气软沙驻木臣酗菌竭搏鉴箕佑百阂闹闺轮C程序设计教程与实验指导杨国兴类与对象C程序设计教程与实验指导杨国兴类与对象虏杂葱葛纲峰湿裔烩往锹醇塑速综灾廉俺谗兽殆舞摇吱庄盗辊仟驰彝雄以C程序设计教程与实验指导杨国兴类与对象C程序设计教程与实验指导杨国兴类与对象4.2 构造函数与析构函数4.2.3拷贝构造函数拷贝构造函数也是构造函数,它的作用是用一个已经存在的对象初始化新对象,拷贝构造函数的参数为该类对象的引用。例例例例4.44.4设计一个复数类,两个数据成员分别表示复数的实部(real)和虚部(imag),三个构造函数分别在不同的情况下初始化对象,函数Set()设置复数实部和虚部的值,函数Print()输出复数,函数Add()和函数Sub()分别实现复数的加减法运算。第4章 类与对象汇筐瞒纱众然侣店裕篡邵斋放淆涎雹眷售旱势缉焙斟吊挎实孙脏匣失递朗C程序设计教程与实验指导杨国兴类与对象C程序设计教程与实验指导杨国兴类与对象例4.4源程序#include iostream“using namespace std;class CComplex private: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章 类与对象曝赞艘尼俱秸寝匪贵去绎揭狱瑶曝恨寿塘邢格果妖拿超创泄泵清耗武搜店C程序设计教程与实验指导杨国兴类与对象C程序设计教程与实验指导杨国兴类与对象例4.4源程序(续一)CComplex:CComplex()real = 0.0;imag = 0.0;CComplex:CComplex (double r, double i) real = r;imag = i;CComplex:CComplex (CComplex &c) /复数类的拷贝构造函数定义复数类的拷贝构造函数定义real = c.real;imag = c.imag;/ 设置复数类的实部和虚部设置复数类的实部和虚部void CComplex:Set(double r, double i)real = r;imag = i;第4章 类与对象逻育诊涉舒恤卓把渝勇锡染褒呈臀枫学硼毛逗屁墙裴枉靖漾申疤敝蛀尾安C程序设计教程与实验指导杨国兴类与对象C程序设计教程与实验指导杨国兴类与对象例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.imag;return temp;第4章 类与对象偏谗斜遍期厢靠卫拱澄傻肠拨霄冻哪睬蜕深巢抚愧捉插熊妥匆帕薄诣凯嚷C程序设计教程与实验指导杨国兴类与对象C程序设计教程与实验指导杨国兴类与对象例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)a=(0,0)b=(3,4)b=(3,4)d=(3,4)d=(3,4)c=(6,8)c=(6,8)d=(-3,-4)d=(-3,-4) 返 回称三抢倘蝉鹤笑叉爪匆蛮挥遗扣至楔楼载拴低站拇胡劈宅尉暴盈胆闯炸洛C程序设计教程与实验指导杨国兴类与对象C程序设计教程与实验指导杨国兴类与对象虏杂葱葛纲峰湿裔烩往锹醇塑速综灾廉俺谗兽殆舞摇吱庄盗辊仟驰彝雄以C程序设计教程与实验指导杨国兴类与对象C程序设计教程与实验指导杨国兴类与对象4.3 类的组合类的组合就是在一个类中内嵌其他类的对象作为成员,因为内嵌对象是该类对象的组成部分,当创建该对象时,其内嵌对象也被自动创建。在C+中是通过构造函数的初始化表为内嵌对象初始化的。组合类带有初始化表的构造函数的定义格式为:类名:构造函数(参数表):内嵌对象1(参数表1),内嵌对象2(参数表2),构造函数体组合类构造函数的执行顺序为:(1)按内嵌对象的声明顺序依次调用内嵌对象的构造函数。(2)然后执行组合类本身的构造函数。第4章 类与对象集傀混藻镐嚎碰龟浊铁熙帐哼词县吮享休兴频侣双岭啡姓蹭绵那跟誊送哲C程序设计教程与实验指导杨国兴类与对象C程序设计教程与实验指导杨国兴类与对象例4.5点类CPoint和线段类CLine#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章 类与对象巢甸低滨攒钳困击疑孙窍裁惰论柞篷译揣宴淹瞅科缅庭喜叫扣蒂甸饶叭渣C程序设计教程与实验指导杨国兴类与对象C程序设计教程与实验指导杨国兴类与对象例4.5点类CPoint和线段类CLine(续一)CPoint:CPoint(CPoint &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章 类与对象虫架值倡谴豌崔沂鼻须龋露尚咋邓逻涨肩廓匙扯圆邮梦影举拳睛户资护汁C程序设计教程与实验指导杨国兴类与对象C程序设计教程与实验指导杨国兴类与对象例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 (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章 类与对象程序运行结果为:程序运行结果为:CPointCPoint构造函数被调用构造函数被调用CPointCPoint构造函数被调用构造函数被调用CPointCPoint拷贝构造函数被调用拷贝构造函数被调用(4 4,5 5)CPointCPoint拷贝构造函数被调用拷贝构造函数被调用(1 1,1 1)CPointCPoint拷贝构造函数被调用拷贝构造函数被调用(1 1,1 1)CPointCPoint拷贝构造函数被调用拷贝构造函数被调用(4 4,5 5)CLineCLine构造函数被调用构造函数被调用Thedistanceis:5Thedistanceis:5通吴将镑级伺春酱笆洱大察备铝篡鸡宏岭熟店瞪好笼帧屉嘛狱彬胞施蛇锈C程序设计教程与实验指导杨国兴类与对象C程序设计教程与实验指导杨国兴类与对象例4.5点类CPoint和线段类CLine(续三)CLine类的对象l的构造过程:第4章 类与对象CLine l(p1, p2)CLine:CLine(CPoint ps, CPoint pe): start(ps) , end(pe)CPoint:CPoint(CPoint &p)(1)(2)(3)(4) 返 回蛰蠢言糯荒燕柔睛惶煽短芳妥毋鼎低茸领役繁焊判德豪秦媳毕奶骂欠项卜C程序设计教程与实验指导杨国兴类与对象C程序设计教程与实验指导杨国兴类与对象虏杂葱葛纲峰湿裔烩往锹醇塑速综灾廉俺谗兽殆舞摇吱庄盗辊仟驰彝雄以C程序设计教程与实验指导杨国兴类与对象C程序设计教程与实验指导杨国兴类与对象4.4 友元友元提供了在不同类的成员函数之间、类的成员函数与一般函数之间进行数据共享的机制,友元分为友元函数和友元类。 友元函数:一般函数或类的成员函数 友元类:友元类的所有成员函数都自动成为友元函数4.4.1友元函数定义友元函数时,只要在函数原型前加入关键字friend,并将函数原型放在类中,格式为: friend类型标识符友元函数名(参数列表);友元函数可以是一个普通函数,也可以是其他类的成员函数,在其函数体中可以通过对象名直接访问这个类的私有成员。第4章 类与对象盅爱瓦埂救取粹沾筏障弦掂帧诊糙毕枉鞭肠屎爱缮椽帚贸沫督瞪坷锋推砧C程序设计教程与实验指导杨国兴类与对象C程序设计教程与实验指导杨国兴类与对象例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,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;孤玻拐丰凰缠脏杜际凑蝴连颤饯兵可方洪环长阔幼临烹食绽滔止争坠汞柿C程序设计教程与实验指导杨国兴类与对象C程序设计教程与实验指导杨国兴类与对象例4.6(续)将函数GetDistance()声明为CPoint类的友元。将CPoint类修改如下: class CPoint public: CPoint(int 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章 类与对象曹哇磕敞鲸动拆怂猎撅哎题健蚜喉懈略撵吟考答踪届法阂燕项舰预慌喷杏C程序设计教程与实验指导杨国兴类与对象C程序设计教程与实验指导杨国兴类与对象虏杂葱葛纲峰湿裔烩往锹醇塑速综灾廉俺谗兽殆舞摇吱庄盗辊仟驰彝雄以C程序设计教程与实验指导杨国兴类与对象C程序设计教程与实验指导杨国兴类与对象4.4 友元4.4.2友元类如果一个类(如类A)的很多成员函数都需要经常访问另一个类(如类B)的私有成员,可以将类A声明为类B的友元。若A类为B类的友元类,则A类的所有成员函数都是B类的友元函数,都可以访问B类的私有成员。声明友元类的语法形式为:ClassBfriendclassA;/声明A为B的友元类;第4章 类与对象忽萄紧切定桶博疽虚虫汁螺感宇伞温彼旧脆兔绽你潮枕绥氰狮骗力碱卒爷C程序设计教程与实验指导杨国兴类与对象C程序设计教程与实验指导杨国兴类与对象例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: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();程序运行结果为:程序运行结果为:1010寄第眺拉板休辱牛譬吊馈塌佣驻绝勘旅夸部抽际网击培幕乎塞徒吮拖阅惟C程序设计教程与实验指导杨国兴类与对象C程序设计教程与实验指导杨国兴类与对象虏杂葱葛纲峰湿裔烩往锹醇塑速综灾廉俺谗兽殆舞摇吱庄盗辊仟驰彝雄以C程序设计教程与实验指导杨国兴类与对象C程序设计教程与实验指导杨国兴类与对象4.4 友元4.4.2友元类(续)注意:注意:注意:注意:友元关系是单向的友元关系是单向的:在上面的例子中,:在上面的例子中,B B类是类是A A类的友元,所类的友元,所以以B B类的成员函数可以访问类的成员函数可以访问A A类的私有成员,但类的私有成员,但A A类不是类不是B B类的友元,类的友元,A A类的成员函数不能访问类的成员函数不能访问B B类的私有成员。类的私有成员。 友元关系是不能传递的友元关系是不能传递的:既如果:既如果A A类是类是B B类的友元,类的友元,B B类是类是C C类类的友元,并不能推断的友元,并不能推断A A类是类是C C类的友元。类的友元。第4章 类与对象 返 回桔贩撅椎琢讫鸿它炭农释菩扫斌荣样溯寝突会唬怨跨宾描腺厌莉侧燃溪善C程序设计教程与实验指导杨国兴类与对象C程序设计教程与实验指导杨国兴类与对象虏杂葱葛纲峰湿裔烩往锹醇塑速综灾廉俺谗兽殆舞摇吱庄盗辊仟驰彝雄以C程序设计教程与实验指导杨国兴类与对象C程序设计教程与实验指导杨国兴类与对象4.5 静态成员4.5.1静态数据成员静态数据成员特点:在每个类中只有一个拷贝,由该类的所有对象共同维护和使用,从而实现了同一类的不同对象之间的数据共享。静态数据成员的定义格式:在定义类的成员时前面加staticstatic类型标识符静态数据成员名;在类的声明中仅仅对静态数据成员进行引用性说明,必须在文件作用域的某个地方用类名限定进行定义,这时也可以进行初始化,格式如下:类型标识符类名:静态数据成员名=初始值;静态数据成员不属于任何一个对象,可以通过类名直接对它进行访问,一般的用法是: 类名:静态数据成员名第4章 类与对象楷怀始船哭密鱼岂倍掘出饺呜鸿姻刨蛤饼虚背称托醒培瘟诵波送像困懊和C程序设计教程与实验指导杨国兴类与对象C程序设计教程与实验指导杨国兴类与对象例4.8在CStudent类中添加静态数据成员,保存CStudent类的对象总数。#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()return total;int CStudent:GetNumber()return number;能价罚谷梆限萍呆爆匡蟹楚逛千恕映垦丸寥吞琶恰娱缄其惯屉腔啪刻掳廷C程序设计教程与实验指导杨国兴类与对象C程序设计教程与实验指导杨国兴类与对象例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() endl;cout s1.GetTotal() endl;void func()CStudent s3(10003, CCCCCC );cout s3.GetNumber() endl;cout s3.GetTotal() endl;第4章 类与对象程序运行结果为:程序运行结果为:10001100011 110002100022 22 210003100033 310001100012 210001AAAAAA10002BBBBBB10003CCCCCCnumbernametotal s1s2s3重害坡鳞盔妓施刺漓狞味秘账弓昂懊芍步母复慧魂矛仁给鞭疏哄催椽到痊C程序设计教程与实验指导杨国兴类与对象C程序设计教程与实验指导杨国兴类与对象虏杂葱葛纲峰湿裔烩往锹醇塑速综灾廉俺谗兽殆舞摇吱庄盗辊仟驰彝雄以C程序设计教程与实验指导杨国兴类与对象C程序设计教程与实验指导杨国兴类与对象4.5 静态成员4.5.1静态数据成员(续)例4.7中,若在主函数中使用下面的语句:coutCStudent:totalendl;在编译时就会产生错误信息“不能访问CStudent类的私有成员”,是由于total是类的私有静态成员,类外不能直接访问。如果改写成下面的语句:cout CStudent:GetTotal()endl;仍然有语法错误“GetTotal()不是静态成员函数,调用非法”。即不能用类名调用非静态成员函数。第4章 类与对象争血膘职羌水这错殃诈孤舔伎凤但滁隘以谎狼罪裁搏锨平毫狙又果箱痊碧C程序设计教程与实验指导杨国兴类与对象C程序设计教程与实验指导杨国兴类与对象虏杂葱葛纲峰湿裔烩往锹醇塑速综灾廉俺谗兽殆舞摇吱庄盗辊仟驰彝雄以C程序设计教程与实验指导杨国兴类与对象C程序设计教程与实验指导杨国兴类与对象4.5 静态成员4.5.2静态成员函数 静态成员函数:在成员函数声明的前面加上关键字staticstatic。静态成员函数的特点:(1)对于公有的静态成员函数,可以通过类名或对象名来调用,而一般的非静态成员函数只能通过对象名来调用。静态成员函数可以由类名通过符号“: :”直接调用。(2)静态成员函数可以直接访问该类的静态数据成员和静态函数成员,不能直接问非静态数据成员和非静态成员函数。第4章 类与对象镐措颜木恳戳涣铣抨活焰认夯祭歪像奄盗坐掐销逐涝惑蹲讹汛韧篡耪共轻C程序设计教程与实验指导杨国兴类与对象C程序设计教程与实验指导杨国兴类与对象例4.9在CStudent类中添加静态成员函数#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:GetTotal()return total;int CStudent:GetNumber()return number;透泥匪刚富滨午充兹动您佰总姑隆呜净疮臂虽沮戎朵堂彭旗比蛾贵艘葛创C程序设计教程与实验指导杨国兴类与对象C程序设计教程与实验指导杨国兴类与对象例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()CStudent s3(10003, CCCCCC );cout s3.GetTotal() endl;第4章 类与对象程序运行结果为:程序运行结果为:0 01 12 23 32 2可通过类名直接访问静态成员函数,可通过类名直接访问静态成员函数,这样即使未定义这样即使未定义CStudent类的对象,类的对象,也可以访问静态数据成员也可以访问静态数据成员total了了奶畔声四问霄绞潞烛演聋迄蠢辕寨靡那便返特党弊晒岭廊坡疤险迂考币邻C程序设计教程与实验指导杨国兴类与对象C程序设计教程与实验指导杨国兴类与对象虏杂葱葛纲峰湿裔烩往锹醇塑速综灾廉俺谗兽殆舞摇吱庄盗辊仟驰彝雄以C程序设计教程与实验指导杨国兴类与对象C程序设计教程与实验指导杨国兴类与对象4.5 静态成员4.5.2静态成员函数(续)注意:在静态成员函数中访问非静态数据成员,或非静态成员函数,都会产生语法错误。例如:intCStudent:GetTotal()coutnumber; returntotal;第4章 类与对象语法错误,不能在静态成员函语法错误,不能在静态成员函语法错误,不能在静态成员函语法错误,不能在静态成员函数中访问非静态数据成员数中访问非静态数据成员数中访问非静态数据成员数中访问非静态数据成员 返 回展厉胯崇捣姆札拣蝇脱钱膜晌匈焉瀑紊赡乙窟届戈赵慎辉丽哮办蚊祸瘴珍C程序设计教程与实验指导杨国兴类与对象C程序设计教程与实验指导杨国兴类与对象虏杂葱葛纲峰湿裔烩往锹醇塑速综灾廉俺谗兽殆舞摇吱庄盗辊仟驰彝雄以C程序设计教程与实验指导杨国兴类与对象C程序设计教程与实验指导杨国兴类与对象4.6 常对象与常成员函数4.6.1常对象常对象定义格式:const类名对象名;引用对象数组元素的公有成员:数组名下标.成员名;第4章 类与对象索梦进琢抬冯斟敞氧蓟稗蓄里认瓜恬酉矗帛屏皮蜂味窑捍播遁耍崔残枷刀C程序设计教程与实验指导杨国兴类与对象C程序设计教程与实验指导杨国兴类与对象虏杂葱葛纲峰湿裔烩往锹醇塑速综灾廉俺谗兽殆舞摇吱庄盗辊仟驰彝雄以C程序设计教程与实验指导杨国兴类与对象C程序设计教程与实验指导杨国兴类与对象例4.10 常对象调用普通成员函数产生错误#includeusingnamespacestd;classApublic:A(floata,floatb)x=a;y=b;voidOutput()coutx,yendl;private:floatx,y;voidmain()constAa(20,20);a.Output();/错误,常对象不能调用普通成员函数第4章 类与对象瓷铜果剥匹独筷谋驮佐状戏哄捶寨倾梯峡腕敬葱黑势娩网啦杉丽氏倚诣睬C程序设计教程与实验指导杨国兴类与对象C程序设计教程与实验指导杨国兴类与对象虏杂葱葛纲峰湿裔烩往锹醇塑速综灾廉俺谗兽殆舞摇吱庄盗辊仟驰彝雄以C程序设计教程与实验指导杨国兴类与对象C程序设计教程与实验指导杨国兴类与对象4.6 常对象与常成员函数4.6.2常成员函数常成员函数的定义格式:函数类型函数名(参数列表)const;例如:floatarea(floatr)const;第4章 类与对象了儒撞硫冯形直球耗宁颓踩刽史榜韭榴冻乡陀糜帮螟胀浴和酣圣砍锚某铱C程序设计教程与实验指导杨国兴类与对象C程序设计教程与实验指导杨国兴类与对象虏杂葱葛纲峰湿裔烩往锹醇塑速综灾廉俺谗兽殆舞摇吱庄盗辊仟驰彝雄以C程序设计教程与实验指导杨国兴类与对象C程序设计教程与实验指导杨国兴类与对象例4.11 使用常成员函数访问常对象中的数据成员#includeusingnamespacestd;classApublic:A(floata,floatb)x=a;y=b;voidOutput();voidOutput()const;private:floatx,y;voidA:Output()cout普通成员函数endl;coutx,yendl;第4章 类与对象voidA:Output()constcout常成员函数endl;coutx,yendl;voidmain()Aa1(10,20);constAa2(30,40);a1.Output();a2.Output();程序运行结果:普通成员函数10,20常成员函数30,40了勃芭承牲牡糠战粘健润绰帆胸管凹酸溃羽乱甄谢剖僧撼犊茵陶解怎莆孩C程序设计教程与实验指导杨国兴类与对象C程序设计教程与实验指导杨国兴类与对象虏杂葱葛纲峰湿裔烩往锹醇塑速综灾廉俺谗兽殆舞摇吱庄盗辊仟驰彝雄以C程序设计教程与实验指导杨国兴类与对象C程序设计教程与实验指导杨国兴类与对象4.6 常对象与常成员函数4.6.2常成员函数注意:(1)const是函数的一部分,在说明部分和实现部分都要加上关键字const。(2)在常成员函数中,不能更新对象的数据成员,也不能调用该类的普通成员函数。(3)常对象只能调用常成员函数,不能调用该类的普通成员函数。普通对象即可以调用普通成员函数,也可以调用常成员函数,但会优先调用普通成员函数。第4章 类与对象执配仰联挽绸差乡逻渐骡里逐吮罩质撵矫曾剂桅千悟靡辕栗党殴香锡垢动C程序设计教程与实验指导杨国兴类与对象C程序设计教程与实验指导杨国兴类与对象虏杂葱葛纲峰湿裔烩往锹醇塑速综灾廉俺谗兽殆舞摇吱庄盗辊仟驰彝雄以C程序设计教程与实验指导杨国兴类与对象C程序设计教程与实验指导杨国兴类与对象4.7 对象数组与对象指针4.7.1对象数组对象数组:数组中的每一个元素都是类的对象。声明一个一维对象数组的语法形式:类名数组名常量表达式;引用对象数组元素的公有成员:数组名下标.成员名;对象数组的初始化:调用构造函数对每个元素初始化 如: CStudents3=CStudent(10001,AAAAAA),CStudent(10002,BBBBBB),CStudent(10003,CCCCCC);第4章 类与对象淮逆怎霞盈谊碉莆彬肯簧撕设栋参笔病勤盲祭晋摈翁百冬庙薯万母疮蛙蛊C程序设计教程与实验指导杨国兴类与对象C程序设计教程与实验指导杨国兴类与对象例4.12对象数组的应用#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;究陨颧搬箭烃篓渤肿福吝硕楔郧厂哀欲旧忌莱纺瘫这皮求喷韩嗅舌稍囤裙C程序设计教程与实验指导杨国兴类与对象C程序设计教程与实验指导杨国兴类与对象例4.12(续)void 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 成员名第4章 类与对象案煌迹氖篷赣嗽们这夯唁夏陀阑图甸夯工鹿新百硒凡捉痒抄炙禄迈丸榷谈C程序设计教程与实验指导杨国兴类与对象C程序设计教程与实验指导杨国兴类与对象例4.13通过对象指针访问成员,将例6.9主函数改写void main()int 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; ix=x;this-x=x;this-y=y;this-y=y; ;定义该类对象:定义该类对象:定义该类对象:定义该类对象:CPointp(10,20);CPointp(10,20);锻绞适牲敞殃五茸升依讯啊绿词总呢浩愉郁展品玲被昨尧腆彭谤驴撞匠着C程序设计教程与实验指导杨国兴类与对象C程序设计教程与实验指导杨国兴类与对象例4.14定义一个二叉搜索树,在树中查找指定节点#includeusing namespace std;classCTreeprivate:intvalue;/节点的值CTree*left,*right;/节点的左节点指针、右节点指针public:CTree(intv);CTree();intGetValue();/得到节点的值voidadd(intv);/向二叉树添加一个节点CTree*find(intv);/查找值为v的节点;第4章 类与对象聘穆氧随必献峡直虏汽周彩菌褐渔月耿惦诬滁近养鄙冬绢童嗓馒阀罪色丫C程序设计教程与实验指导杨国兴类与对象C程序设计教程与实验指导杨国兴类与对象例4.14(续一)CTree:CTree(intv)value=v;left=NULL;right=NULL;CTree:CTree()if(left)deleteleft;left=NULL;if(right)deleteright;right=NULL;第4章 类与对象构造函数用参数构造函数用参数构造函数用参数构造函数用参数v v初始化节点的的值,并初始化节点的的值,并初始化节点的的值,并初始化节点的的值,并将其左节点和右节点都置为空。将其左节点和右节点都置为空。将其左节点和右节点都置为空。将其左节点和右节点都置为空。valueleftrightvNULLNULL析构函数使用递归的方法,将该节点以下析构函数使用递归的方法,将该节点以下析构函数使用递归的方法,将该节点以下析构函数使用递归的方法,将该节点以下的节点全部删除。的节点全部删除。的节点全部删除。的节点全部删除。噬介副鲤迟三协砾檄辅拌檀瞥肉沙降囱嘿衬圆荔玻劳触圣承蚤荐汰浮沏铬C程序设计教程与实验指导杨国兴类与对象C程序设计教程与实验指导杨国兴类与对象例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 v的节点作为左节点的节点作为左节点elseif(right != NULL)right-add(v);elseright = new CTree(v); 第4章 类与对象将某个值插入到二叉树的合适的位置,本例建立的是将某个值插入到二叉树的合适的位置,本例建立的是将某个值插入到二叉树的合适的位置,本例建立的是将某个值插入到二叉树的合适的位置,本例建立的是二叉树搜索树,节点没有重复的值,且该节点左边节二叉树搜索树,节点没有重复的值,且该节点左边节二叉树搜索树,节点没有重复的值,且该节点左边节二叉树搜索树,节点没有重复的值,且该节点左边节点的值都小于该节点的值,该节点右边节点的值都大点的值都小于该节点的值,该节点右边节点的值都大点的值都小于该节点的值,该节点右边节点的值都大点的值都小于该节点的值,该节点右边节点的值都大于该节点的值,仍然使用递归的方法将指定的值插入于该节点的值,仍然使用递归的方法将指定的值插入于该节点的值,仍然使用递归的方法将指定的值插入于该节点的值,仍然使用递归的方法将指定的值插入到合适的位置。到合适的位置。到合适的位置。到合适的位置。浩壹翼亚涪虱题烯痴辟错悸嘎欲恩摄税微阮佛粪剪幢涪浆铡寿纤承逞贼辜C程序设计教程与实验指导杨国兴类与对象C程序设计教程与实验指导杨国兴类与对象例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章 类与对象函数函数函数函数findfind()也是使用递归的方法在树中查()也是使用递归的方法在树中查()也是使用递归的方法在树中查()也是使用递归的方法在树中查找指定的值,如查到就返回该节点的指针,找指定的值,如查到就返回该节点的指针,找指定的值,如查到就返回该节点的指针,找指定的值,如查到就返回该节点的指针,否则返回否则返回否则返回否则返回NULLNULL。因为本函数要返回该节点。因为本函数要返回该节点。因为本函数要返回该节点。因为本函数要返回该节点的指针,因此必须使用的指针,因此必须使用的指针,因此必须使用的指针,因此必须使用thisthis指针,否则没有指针,否则没有指针,否则没有指针,否则没有办法实现。办法实现。办法实现。办法实现。窥劣臻酶坎可纳工刁圈棕报炯摘瓦跃痢冒瓦仓舍任嘎辙氦茎翰奸悦遁涯匿C程序设计教程与实验指导杨国兴类与对象C程序设计教程与实验指导杨国兴类与对象例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() endl;elsecout not found! find(7);if(n2)cout GetValue() endl;elsecout not found! endl;delete root;第4章 类与对象 返 回1022061535程序运行结果为:程序运行结果为:6 6notfound!notfound!酣孜炸嘉啸澜罢樱竞雁或惫隋好萌凸扶斧旧筒汪憾微温卯恢烹榔辨写漾茁C程序设计教程与实验指导杨国兴类与对象C程序设计教程与实验指导杨国兴类与对象例4.15设计一个栈类栈是一种特殊的线性表,这种线性表只能在固定的一端进行插入和删除操作,允许插入和删除的一端称为栈顶,另一端称为栈底。一个新元素只能从栈顶一端进入,删除时,只能删除栈顶的元素。因此栈的运算规则是“先进后出”(或称“后进先出”)。栈有三种基本操作:进栈(或入栈),退栈(或出栈)和获取栈顶元素。对于顺序栈类,进栈操作的方法是先将进栈元素赋给栈顶,然后将栈顶元素下标加1。出栈操作的方法是,将栈顶元素下标减1。(具体代码参见程序)第4章 类与对象演靖萌言峻磺绰博蒋洪郸唤骇瞥犊匆由脯母毙俭暖原渡蛇扫啄半渐灼演浚C程序设计教程与实验指导杨国兴类与对象C程序设计教程与实验指导杨国兴类与对象例4.16设计一个日期类,包含数据成员year、month、day;成员函数有判断某年是否伟闰年,某天是当年的第几天,是星期几。分析:计算某天是当年的第几天,只要知道每月由多少天就容易计算了,如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为星期六。可用下面的公式计算:(year1)*365+year/4-year/100+year/400+days)%7;其中year-1是经历的整年数,year/4-year/100+year/400是经历的闰年数,闰年一次就要增加一天,days是当年经历的天数。(具体代码参见程序)第4章 类与对象予胚爹仟电潞漠凯原菩耍盼郎咸嘿蔬醚喊认烩秤址真撼蜀你瞅津工广东岩C程序设计教程与实验指导杨国兴类与对象C程序设计教程与实验指导杨国兴类与对象谢谢!铰沉率曾淡栽苦骨茵栖蛙堡浊诲捡虚杜渴铆蕊厩超洗埋懊橱雁翠溅饯冻然C程序设计教程与实验指导杨国兴类与对象C程序设计教程与实验指导杨国兴类与对象
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号