您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 经营企划 > C++ 第13章 多态性(例子)
例13.5在类中,用字符数组实现字符串。#includeiostream.h#includestring.hclassStudent{charNum[10];//学号,注意:用数组实现charName[10];//姓名,注意:用数组实现intScore;//成绩public:Student(charnum[]=NULL,charname[]=NULL,intscore=0){if(num)strcpy(Num,num);elseNum[0]='\0';if(name)strcpy(Name,name);elseName[0]='\0';Score=score;}voidShow(){coutNum=Num'\t'Name=Name'\t'Score=Scoreendl;}};voidmain(){Studentstud1(01201,Mary,88),stud2;stud2=stud1;//Astud1.Show();stud2.Show();}程序的运行结果是:Num=01201Name=MaryScore=88Num=01201Name=MaryScore=88返回ppt讲稿例13.7+=运算符重载函数的返回值为void#includeiostream.hclassComplex{doubleReal,Image;public:Complex(doubler=0,doublei=0){Real=r;Image=i;}voidoperator+=(constComplex&c)//返回值为void型{Real+=c.Real;Image+=c.Image;}voidShow(){coutReal;if(Image0)cout'+'Image'i';//如果是正数,必须输出正号elseif(Image0)coutImage'i';//如果是负数,自动输出负号coutendl;}};voidmain(){Complexc1(2,3),c2(4,-2);coutc1=;c1.Show();coutc2=;c2.Show();c1+=c2;//Acoutc1+=c2;c1=;c1.Show();}运行结果如下:c1=2+3ic2=4-2ic1+=c2;c1=6+1i程序中的A行被处理成c1.operator+=(c2)。如果有连续赋值的表达式,如c1+=c2+=c3,编译器会处理成c1.operator+=(c2.operator+=(c3)),注意划线部分是第一次赋值,表达式的结果是void类型,此时若欲做第二个赋值就不行了。将上例中的operator+=()重载函数改写成:Complexoperator+=(constComplex&c)//返回值为本类类型的对象{Real+=c.Real;Image+=c.Image;return*this;}此时处理c1+=c2+=c3就没有问题了。返回ppt讲稿例13.8对于字符串类,重载=运算符,返回对象自身的引用。就本例而言,可以不定义拷贝构造函数,程序能正确运行。#includeiostream.h#includestring.hclassString{char*Strp;public:String(char*s=0)//构造函数{if(s){Strp=newchar[strlen(s)+1];strcpy(Strp,s);}elseStrp=0;}String&operator=(String&s)//A赋值运算符重载函数{if(Strp)delete[]Strp;if(s.Strp){Strp=newchar[strlen(s.Strp)+1];strcpy(Strp,s.Strp);}elseStrp=0;return*this;}~String()//析构函数{if(Strp)delete[]Strp;}voidShow(){coutStrpendl;}};voidmain(){Stringstr1(SampleString1);Stringstr2;str2=str1;//对象赋值运算str2.Show();//输出SampleString1}但是若将程序中A行的函数头部改为:Stringoperator=(String&s),即返回本类对象,因类中有动态申请的字符串空间,则必须增加定义拷贝构造函数。因为要使用返回的对象去初始化内存临时对象,所以应在类体中增加定义拷贝构造函数如下:String(String&s)//拷贝构造函数{if(s.Strp){Strp=newchar[strlen(s.Strp)+1];strcpy(Strp,s.Strp);}elseStrp=0;}返回ppt讲稿例13.11成员函数和类型转换函数的比较#includeiostream.hclassRMB//定义一个“人民币”类{intYuan,Jiao,Fen;//元、角、分public:RMB(inty=0,intj=0,intf=0){Yuan=y;Jiao=j;Fen=f;}operatorint()//转换成整数值(结果单位:分){return(Yuan*100+Jiao*10+Fen);}operatordouble()//转换成实数值(结果单位:元){return(Yuan+double(Jiao)/10+double(Fen)/100);}intGetFen()//用成员函数转换成“分”值{return(Yuan*100+Jiao*10+Fen);}};voidmain(void){RMBr(23,8,6);intr1,r2,r3;r1=r;//A处理成r1=int(r);本质与B行一致r2=int(r);//B处理成r2=r.operatorint();r3=r.GetFen();//C调用成员函数得到分值coutr1=r1endl;coutr2=r2endl;coutr3=r3endl;doubled;d=r;//D处理成d=r.operatordouble();coutd=dendl;}程序的运行结果如下:r1=2386r2=2386r3=2386d=23.86返回ppt讲稿假定一种货币只有元和角两种单位,一元等于10角,++和--表示加减1角。定义一个类Money用于实现++和--运算。例13.12实现++和--的前置和后置运算符重载#includeiostream.h++--表示家减1角classMoney{intYuan,Jiao;//元、角public:Money(inty=0,intj=0){Yuan=y;Jiao=j;}Money(doubled){Yuan=int(d);Jiao=int((d-Yuan)*10);}Moneyoperator++();//①用成员函数实现前置++Moneyoperator++(int);//②用成员函数实现后置++friendMoneyoperator--(Money&m);//③用友元函数实现前置--friendMoneyoperator--(Money&m,int);//④用友元函数实现后置--voidShow(char*s){couts':'Yuan,Jiaoendl;}};MoneyMoney::operator++()//①用成员函数实现前置++{Jiao++;if(Jiao=10){Yuan+=1;Jiao-=10;}return*this;}MoneyMoney::operator++(int)//②用成员函数实现后置++{Moneytemp=*this;//保存对象原始的值Jiao++;if(Jiao=10){Yuan+=1;Jiao-=10;}returntemp;//返回对象原始的值调用方式:m1=++m;解释为m.operator++()调用方式:m2=m++;解释为m.operator++(int)}Moneyoperator--(Money&m)//③用友元函数实现前置--{if(m.Jiao==0){m.Yuan-=1;m.Jiao=10;}m.Jiao--;returnm;}Moneyoperator--(Money&m,int)//④用友元函数实现后置--{Moneytemp=m;//保存对象原始的值if(m.Jiao==0){m.Yuan-=1;m.Jiao=10;}m.Jiao--;returntemp;//返回对象原始的值}调用方式:m3=--m;解释operator--(m)调用方式:m4=m--;解释为operator--(m,int)voidmain(void){Moneym(15,3),m1,m2,m3,m4;coutm:;m.Show(m);m1=++m;coutm1=++m;\n;m1.Show(m1);m.Show(m);m2=m++;coutm2=m++;\n;m2.Show(m2);m.Show(m);m3=--m;coutm3=--m;\n;m3.Show(m3);m.Show(m);m4=m--;coutm4=m--;\n;m4.Show(m4);m.Show(m);Moneym5(8.5);m5.Show(m5);}返回ppt讲稿例13.18定义字符串类String,并测试重载的运算符以及成员函数//Li1318.h#includeiostream.h#includestring.hclassString{protected:intLength;//字符串的长度char*Strp;//指向字符串的指针public:String(){Strp=NULL;Length=0;}//缺省构造函数String(constchar*s);//构造函数,以字符指针作为参数String(constString&);//拷贝构造函数,以字符串对象的引用作为参数~String(){if(Strp)delete[]Strp;}constchar*IsIn(constchar)const;//返回参数字符在字符串中第一次出现的地址intIsSubStr(constchar*)const;//判断参数字符串是否为子串voidShow()//输出字符串{coutStrp'\n';}intGetLen(){returnLength;}//返回字符串的长度constchar*GetString(){returnStrp;}//取字符串首指针operatorconstchar*()const//A类型转换函数,返回指向常量的字符串指针{return(constchar*)Strp;}String&operator=(String&);//重载赋值运算符friendStringoperator+(constString&,constString&);//友元实现+重载friendStringoperator-(constString&,constchar*);//友元实现-重载intoperator(constString&)const;intoperator(constString&)const;intoperator==(constString&)const;};String::String(constchar*s)//构造函数,以字符指针作为参数{if(s){Length=strlen(s);Strp=newchar[Length+1];strcpy(Strp,s);}else{Strp=NULL;Length=0;}}String::String(constString&s)//拷贝构造函数,以字符串对象的引用作为参数{Length=s.Length;if(s.Strp){Strp=newchar[Length+1];strcpy(Strp,s.St
本文标题:C++ 第13章 多态性(例子)
链接地址:https://www.777doc.com/doc-3391265 .html