1、 D:show( ) called. 8 若将A行的virtual去掉,则结果为: B:show( ) called. 5 对本题,若将虚线框中的fun( )和main( )函数同时修改成右侧实线框中的对应函数,则若A行有virtural时,结果为:show( ) called. 8 ;若A行无virtual时,结果为:show( ) called. 5 。3运行结果为:The B version BThe D1 info: 4 version 1The D2 info: 100 version BThe D3 info: -25 version 3去掉A行的virtual,则运行结果为:Th
2、e B version 1The B version 34(1)operator char *( )(2)return s; (3)str = num;四、编程题/ 实现1,赋值运算符重(=和+=)载函数的返回值为对象的引用。/ 缺点:不可实现对象的连续赋值,只能 c1= c2 #includeclass Complex float Real, Image;public: Complex(float r=0,float i=0) Real=r;Image=i; void show( ) cout(Real,Image)n; void operator=(Complex &); /用成员实现,注
3、意:=不能用友元实现 void operator+=(Complex & /用成员实现,+=可以用友元实现 friend Complex operator+(Complex &,Complex & /用友元实现 friend Complex operator-(Complex &;void Complex: operator=(Complex &c) /返回值 void Real=c.Real; Image=c.Image; operator+=(Complex & Real=Real+c.Real; Image=Image+c.Image;Complex operator+(Complex
4、&c1, Complex &c2) Complex t; t.Real=c2.Real+c1.Real; t.Image=c2.Image+c1.Image; return t;Complex operator-(Complex & t.Real=c1.Real-c2.Real; t.Image=c1.Image-c2.Image;void main( ) Complex c1(1,2),c2(3,4),c3; c3=c1; c3.show( ); c3=c1+c2; c3.show( ); c3+=c2; c3=c1-c2;/ 实现2,赋值运算符重(=和+=)载函数的返回值为对象的引用。/
5、优点:可实现对象的连续赋值,如 c1=c2=c3 Complex &Complex & Complex:c) /返回值为对象的引用 return *this; c3=c2=c1;2 #include class Fraction int m, n; / m 是分子,n 是分母 Fraction(int im=0,int in=1) int t=gcd(im,in); m=im/t; n=in/t; if(m*n0) / 若分子和分母同号 m=abs(m); n=abs(n); else / 若分子和分母异号 m=-abs(m); ; int gcd(int x,int y); Fraction
6、 & operator= ( Fraction b ) m=b.m; n=b.n; return *this; Fraction operator+ ( Fraction b ) return Fraction(m*b.n+n*b.m,n*b.n); Fraction operator- ( Fraction b ) return Fraction(m*b.n-n*b.m,n*b.n); friend Fraction operator* ( Fraction a, Fraction b ); friend Fraction operator/ ( Fraction a, Fraction b
7、 ); void Show() coutm/nendl;int Fraction:gcd(int x,int y ) /返回的最大公约数是正数 int r; if(x0) x= -x; if(y0) y= -y; while( r=x%y ) x=y; y=r; return y;Fraction operator* ( Fraction a, Fraction b ) return Fraction(a.m*b.m, a.n*b.n);Fraction operator/ ( Fraction a, Fraction b ) return Fraction(a.m*b.n, a.n*b.m)
8、; Fraction a(1,3),b(3,-12),c; couta= a.Show( );b= b.Show( ); c=a+b;a+b= c.Show(); c=a-b;a-b= c=a*b;a*b= c=a/b;a/b=class Point float x,y; Point(float a=0,float b=0) x=a;y=b;x=xty=yclass string char *str; int len; string(char *s=0)/构造函数,含缺省构造函数 if(s) /此处必须判断s是否为空指针。 len=strlen(s); /若s为空指针,则strlen(s)报运
9、行错。 str=new charlen+1; strcpy(str,s); else len=0,str=0; /注意逗号 string(string &st) /拷贝构造函数,必须要定义,想一想为什么? if(st.str) len=st.len; str=new charlen+1; strcpy(str,st.str); string( ) /析构函数 if(str) delete str; void set(char *s) /置值 /必须先删除原空间 if(s) str=new charstrlen(s)+1; str=0,len=0; void show(void) /显示串 co
10、utstr else The string is empty! int getlen(void) /获取长度 return len;/解 1 void delchar(char ch) /删除字符(删除所有参数指定的字符) int i, j; for(i=j=0; stri; i+) if( stri!=ch ) strj+=stri; strj=0 char *t=str;/使字符串长度与成员len的值保持一致 str=new charstrlen(t)+1; strcpy(str,t); len=strlen(str); delete t;/* 解 2 int i=0; /while(il
11、en) while(stri)/删除若干字符后,len与str指向的空间长度不一致 if(stri=ch)/可处理成一致,亦可忽略这种不一致 strcpy(str+i, str+i+1); len-;/注意 else i+;*/* 解 3 void delchar(char ch) int i=0,j=0; for(;ilen;i+) if(stri=ch) j=i; for(;jj+)/循环将后面的字符向前挪动一位 strj=strj+1; i-; string& operator=(string &s) / 赋值运算只能用成员实现 len=s.len; if(s.str) strcpy(s
12、tr,s.str); str=0; string & operator+=(string &s) /字符串拼接+= string t=*this; /调用拷贝构造函数,初始化t(保存老串) delete str; /删除老串 len=len+s.len; if(len) str = new charlen+1; strcpy(str,t.str); strcat(str,s.str); friend string operator+(string &s1, string &s2); /字符串拼接 +,类外实现 int operator=(string &s) /字符串比较 if(strcmp(
13、str,s.str)=0) return 1; return 0; /或 return(!strcmp(str, s.str);string operator+(string &s2) /字符串拼接 +,类外实现 string t; t.len=s1.len+s2.len; if(t.len) t.str=new chart.len+1; strcpy(t.str,s1.str); strcat(t.str,s2.str); t.str=0; return t; /因为返回对象(动态申请空间),所以要定义拷贝构造函数 char *a=C plus plus string s1(a), s2(l
14、anguage), s3;/测试两种构造函数 s1.show( ); s2.show( ); s3.show( ); cout Befor assign:n if(s1=s2) /测试比较运算符 = = s1 and s2 is same!endl if(!(s1=s2)s1 and s2 is different! s1=s2; /测试赋值运算符 = After assign s1=s2: if(s1=s2) s3=s1+s2; /测试加法及赋值运算符 +=,= s3+=s2; /测试运算符 += s3.delchar(e /想一想,能否处理成 s3-/测试删除字符串函数ag5 class
15、Matrix int *p, m, n; Matrix(int mm, int nn ) m=mm, n=nn; p=new intm*n; Matrix(Matrix &b) for(int i=0; ipi; Matrix operator+(Matrix &b) / ? if(m!=b.m | n!=b.n)The two matrix are not same size! return *this; pi += (b.p)i; void operator =( Matrix &b) int i,j; int *p1=p;m; for(j=0; jn; j+) cout(*p1+)end
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1