大学c习题答案习题13答案Word文档下载推荐.docx
- 文档编号:19571507
- 上传时间:2023-01-07
- 格式:DOCX
- 页数:21
- 大小:19.99KB
大学c习题答案习题13答案Word文档下载推荐.docx
《大学c习题答案习题13答案Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《大学c习题答案习题13答案Word文档下载推荐.docx(21页珍藏版)》请在冰豆网上搜索。
D:
:
show()called.8
若将A行的virtual去掉,则结果为:
B:
show()called.5
对本题,若将虚线框中的fun()和main()函数同时修改成右侧实线框中的对应函数,则若A行有virtural时,结果为:
show()called.8;
若A行无virtual时,结果为:
show()called.5。
3.
运行结果为:
TheBversionB
TheD1info:
4version1
TheD2info:
100versionB
TheD3info:
-25version3
去掉A行的virtual,则运行结果为:
TheBversion1
TheBversion3
4.
(1)operatorchar*()
(2)returns;
(3)str=num;
四、编程题
//实现1,赋值运算符重(=和+=)载函数的返回值为对象的引用。
//缺点:
不可实现对象的连续赋值,只能c1=c2
#include<
iostream.h>
classComplex
{
floatReal,Image;
public:
Complex(floatr=0,floati=0)
{
Real=r;
Image=i;
}
voidshow()
cout<
<
"
("
Real<
'
'
Image<
)\n"
;
voidoperator=(Complex&
);
//用成员实现,注意:
=不能用友元实现
voidoperator+=(Complex&
//用成员实现,+=可以用友元实现
friendComplexoperator+(Complex&
Complex&
//用友元实现
friendComplexoperator-(Complex&
};
voidComplex:
operator=(Complex&
c)//返回值void
Real=c.Real;
Image=c.Image;
}
operator+=(Complex&
Real=Real+c.Real;
Image=Image+c.Image;
Complexoperator+(Complex&
c1,Complex&
c2)
Complext;
t.Real=c2.Real+c1.Real;
t.Image=c2.Image+c1.Image;
returnt;
Complexoperator-(Complex&
t.Real=c1.Real-c2.Real;
t.Image=c1.Image-c2.Image;
voidmain()
Complexc1(1,2),c2(3,4),c3;
c3=c1;
c3.show();
c3=c1+c2;
c3.show();
c3+=c2;
c3=c1-c2;
//实现2,赋值运算符重(=和+=)载函数的返回值为对象的引用。
//优点:
可实现对象的连续赋值,如c1=c2=c3
Complex&
Complex&
Complex:
c)//返回值为对象的引用
return*this;
c3=c2=c1;
2.
#include<
math.h>
classFraction
{
intm,n;
//m是分子,n是分母
Fraction(intim=0,intin=1)
{
intt=gcd(im,in);
m=im/t;
n=in/t;
if(m*n>
0)//若分子和分母同号
{m=abs(m);
n=abs(n);
else//若分子和分母异号
{m=-abs(m);
};
intgcd(intx,inty);
Fraction&
operator=(Fractionb)
m=b.m;
n=b.n;
return*this;
Fractionoperator+(Fractionb)
{returnFraction(m*b.n+n*b.m,n*b.n);
Fractionoperator-(Fractionb)
{returnFraction(m*b.n-n*b.m,n*b.n);
friendFractionoperator*(Fractiona,Fractionb);
friendFractionoperator/(Fractiona,Fractionb);
voidShow()
{cout<
m<
/'
n<
endl;
intFraction:
gcd(intx,inty)//返回的最大公约数是正数
intr;
if(x<
0)x=-x;
if(y<
0)y=-y;
while(r=x%y)
{x=y;
y=r;
returny;
Fractionoperator*(Fractiona,Fractionb)
{returnFraction(a.m*b.m,a.n*b.n);
Fractionoperator/(Fractiona,Fractionb)
{returnFraction(a.m*b.n,a.n*b.m);
Fractiona(1,3),b(3,-12),c;
cout<
a="
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="
classPoint
floatx,y;
Point(floata=0,floatb=0)
{x=a;
y=b;
x="
x<
\t'
y="
y<
\n'
Point&
operator++();
//用成员函数实现前置,返回引用
Pointoperator++(int);
//用成员函数实现后置,返回对象
friendPoint&
operator--(Point&
//用友元函数实现前置,返回引用
friendPointoperator--(Point&
int);
//用友元函数实现后置,返回对象
//前置或后置,一般应返回对象或引用,否则只能单独使用
//既a++合法,而b=a++;
非法
Point&
Point:
operator++()//前置,成员实现
x++;
y++;
PointPoint:
operator++(int)//后置,成员实现
Pointt=*this;
p)//前置,友元实现
p.x--;
p.y--;
returnp;
Pointoperator--(Point&
p,int)//后置,友元实现
Pointtemp=p;
p.y--;
returntemp;
Pointm(1,2),c;
c=m++;
//如果只写m++;
m.show();
则无法测出是前置还是后置
c.show();
c=++m;
c=m--;
c=--m;
4.
string.h>
classstring
char*str;
intlen;
string(char*s=0)//构造函数,含缺省构造函数
if(s)//此处必须判断s是否为空指针。
{
len=strlen(s);
//若s为空指针,则strlen(s)报运行错。
str=newchar[len+1];
strcpy(str,s);
}
else
len=0,str=0;
//注意逗号
string(string&
st)//拷贝构造函数,必须要定义,想一想为什么?
if(st.str)
len=st.len;
str=newchar[len+1];
strcpy(str,st.str);
~string()//析构函数
if(str)
delete[]str;
voidset(char*s)//置值
//必须先删除原空间
if(s)
str=newchar[strlen(s)+1];
str=0,len=0;
voidshow(void)//显示串
cout<
str<
else
Thestringisempty!
intgetlen(void)//获取长度
returnlen;
//解1
voiddelchar(charch)//删除字符(删除所有参数指定的字符)
inti,j;
for(i=j=0;
str[i];
i++)
if(str[i]!
=ch)str[j++]=str[i];
str[j]='
\0'
char*t=str;
//使字符串长度与成员len的值保持一致
str=newchar[strlen(t)+1];
strcpy(str,t);
len=strlen(str);
delete[]t;
/*解2
inti=0;
//while(i<
len)
while(str[i])//删除若干字符后,len与str指向的空间长度不一致
if(str[i]==ch)//可处理成一致,亦可忽略这种不一致
{
strcpy(str+i,str+i+1);
len--;
//注意
}
elsei++;
*/
/*解3
voiddelchar(charch)
inti=0,j=0;
for(;
i<
len;
i++)
{
if(str[i]==ch)
j=i;
for(;
j<
j++)//循环将后面的字符向前挪动一位
str[j]=str[j+1];
i--;
}
string&
operator=(string&
s)//赋值运算只能用成员实现
len=s.len;
if(s.str)
strcpy(str,s.str);
str=0;
string&
operator+=(string&
s)//字符串拼接+=
stringt=*this;
//调用拷贝构造函数,初始化t(保存老串)
delete[]str;
//删除老串
len=len+s.len;
if(len)
str=newchar[len+1];
strcpy(str,t.str);
strcat(str,s.str);
friendstringoperator+(string&
s1,string&
s2);
//字符串拼接+,类外实现
intoperator==(string&
s)//字符串比较
if(strcmp(str,s.str)==0)
return1;
return0;
//或return(!
strcmp(str,s.str));
stringoperator+(string&
s2)//字符串拼接+,类外实现
stringt;
t.len=s1.len+s2.len;
if(t.len)
t.str=newchar[t.len+1];
strcpy(t.str,s1.str);
strcat(t.str,s2.str);
t.str=0;
returnt;
//因为返回对象(动态申请空间),所以要定义拷贝构造函数
char*a="
Cplusplus"
strings1(a),s2("
language"
),s3;
//测试两种构造函数
s1.show();
s2.show();
s3.show();
cout<
"
Beforassign:
\n"
if(s1==s2)//测试比较运算符==
s1ands2issame!
endl<
if(!
(s1==s2))
s1ands2isdifferent!
s1=s2;
//测试赋值运算符=
Afterassigns1=s2:
if(s1==s2)
s3=s1+s2;
//测试加法及赋值运算符+=,=
s3+=s2;
//测试运算符+=
s3.delchar('
e'
//想一想,能否处理成s3-'
//测试删除字符串函数
a'
g'
5.
classMatrix
int*p,m,n;
Matrix(intmm,intnn)
m=mm,n=nn;
p=newint[m*n];
Matrix(Matrix&
b)
for(inti=0;
i<
m*n;
p[i]=(b.p)[i];
voidinput()
inti;
for(i=0;
cin>
>
p[i];
Matrixoperator+(Matrix&
b)//?
?
if(m!
=b.m||n!
=b.n)
Thetwomatrixarenotsamesize!
return*this;
p[i]+=(b.p)[i];
voidoperator=(Matrix&
b)
inti,j;
int*p1=p;
m;
for(j=0;
j<
n;
j++)
cout<
(*p1++)<
end
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 大学 习题 答案 13