习题二C++练习含有答案.docx
《习题二C++练习含有答案.docx》由会员分享,可在线阅读,更多相关《习题二C++练习含有答案.docx(23页珍藏版)》请在冰豆网上搜索。
![习题二C++练习含有答案.docx](https://file1.bdocx.com/fileroot1/2023-2/8/577592f5-cfdb-435e-ba5a-1d139a54aa6d/577592f5-cfdb-435e-ba5a-1d139a54aa6d1.gif)
习题二C++练习含有答案
习题二
一、填空题
1.对运算符进行重载时,不能改变结合性,不能改变操作数个数,不能改变优先级。
2.当++被重载为后置成员函数时需要0个参数。
3.当++被重载为前置成员函数时需要1个参数。
4.在C++中,运算符重载函数可以是成员函数,也可以是友元函数,还可以是普通函数。
5.友元破坏了类的封装性特性。
6.类的友元能够访问这个类的所有成员。
7.类的静态数据成员的初始化是在类外进行的。
8.类的静态成员函数没有this指针。
9.类的静态成员函数访问该类的非静态成员可以通过参数传递对象来实现。
10.不能被重载的类成员函数是构造和析构函数。
二、选择题
1.已知类A有一个带double型参数的构造函数,且将运算符“+”重载为该类友元函数,若如下语句:
Ax(2.5),y(3.6),z(0);z=x+y;能够正常运行,运算符重载函数operator+应在类中声明为(D)。
A.friendAoperator+(double,double);B.friendAoperator+(double,A&);
C.friendAoperator+(A&,double);D.friendAoperator+(A&,A&);
2.下列关于运算符重载的描述中,正确的是(D)。
A.运算符重载可以改变操作数的个数B.运算符重载可以改变优先级
C.运算符重载可以改变结合性D.运算符重载不可以改变语法结构
3.友元运算符表达式obj1>obj2被C++编译器解释为(A)。
A.operator>(obj1,obj2)B.>(obj1,obj2)
C.obj2.operator>(obj1)D.obj1.operator>(obj2)
4.下列关于C++运算符函数的返回类型的描述中,错误的是(C)。
A.可以是类类型B.可以是int类型
C.可以是void类型D.可以是float类型
5.为了区别单目运算符的前置和后置运算,在后置运算符进行重载时,额外添加一个参数,其类型是(D)。
A.voidB.charC.floatD.int
6.以下运算符中,不能在C++中重载的是(A)。
A.?
:
B.+C.-D.<=
7.在一个类中可以对一个操作符进行(D)重载。
A.1种B.2种以下C.3种以下D.多种
8.若类A被说明成类B的友元,则(D)。
A.类A的成员即类B的成员B.类B的成员即类A的成员
C.类A的成员函数不能访问类B的成员D.类B不一定是类A的友元
9.友元的作用是(A)。
A.提高成员的运行效率B.加强类的封装性
C.实现数据的隐藏性D.增加成员函数的种类
10.下列关于静态数据成员的特性描述中错误的是(D)。
A.说明静态数据成员时前边要加staticB.静态数据成员要在类体外进行初始化
C.引用静态数据成员时,要在静态数据成员名前加“类名”和作用域运算符
D.静态数据成员不是所有对象所共用的
11.关于友元的描述中,正确的是(C)。
A.友元函数是成员函数的一种,它可以访问类的私有成员
B.友元函数不能提高程序的运行效率
C.友元函数要在类体内说明
D.友元函数增强了类的封装性和隐藏性
12.用来说明类的友元的是(D)。
A.privateB.protectedC.publicD.friend
13.已知f1和f2是同一个类的两个成员函数,但f1不能调用f2,下列选项中符合要求的是(B)。
A.f1和f2都是静态函数B.f1是静态函数,f2不是静态函数
C.f1不是静态函数,f2是静态函数D.f1和f2都不是静态函数
14.下面对于友元函数描述正确的是(C)。
A.友元函数的实现必须在类的内部定义B.友元函数是类的成员函数
C.友元函数破坏了类的封装性和隐藏性D.友元函数不能访问类的保护成员
15.一个类的友元函数或友元类能够通过成员操作符访问该类的(D)
A.私有成员B.保护成员C.公有成员D.所有成员
16.下面对静态数据成员的描述中,正确的是(D)
A.静态数据成员可以在类体内进行初始化B.静态数据成员不可以被类的对象调用
C.静态数据成员不受private控制符的限制D.静态数据成员可以直接用类名调用
17.C++语言中提供的(B)不是类的成员,但具有类成员的特权。
A.构造函数B.友元函数C.虚函数D.重载函数
18.下列关于静态成员函数的说法中不正确的是(C)
A.静态成员函数不属于对象成员B.对静态成员函数的引用不需要使用对象名
C.静态成员函数中可以直接引用类的非静态成员
D.静态成员函数中可以直接引用类的静态成员
19.下面对友元的错误描述是(D)。
A.关键字friend用于声明友元
B.一个类中的成员函数可以是另一个类的友元函数
C.友元函数访问对象的成员不受访问特性影响
D.友元函数通过this指针访问对象成员
20.下列有关一个类的友元函数的叙述中,正确的(B)
A.允许在类外访问类中除私有成员以外的所有成员
B.允许在类外访问类中的任何成员
C.友元也是该类的成员
D.友元的声明必须被放在该类的公有部分
三、判断题
1、静态数据成员可以通过类名或对象名引用。
2、静态数据成员可以在类内或类外进行初始化。
3、在静态成员函数中可以访问本类中非静态的数据成员。
4、类的静态成员函数的初始化工作要放在类外进行。
5、若A是B的友元类,B是C的友元类,则A是C的友元类。
6、通过运算符重载,可以定义新的运算符。
7、C++中的所有运算符都能被重载。
8、运算符重载不能改变操作数的个数。
9、运算符重载不能改变其优先级与结合性。
10、在运算符重载函数中不能使用缺省的参数值。
答案:
1、√2、×3、√4、×5、×6、×7、×8、√9、√10、√
四、程序分析题(写程序运行结果)
1.#include
classA
{
intx,y,z;
public:
A(intvx,intvy,intvz){x=vx;y=vy;z=vz;}
A(){x=0;y=0;z=0;}
Aoperator+(At)
{
Ate;
te.x=x+t.z;
te.y=y+t.y;
te.z=z+t.z;
returnte;
}
Aoperator-(At)
{
Ate;
te.x=x-t.z;
te.y=y-t.y;
te.z=z-t.z;
returnte;
}
Aoperator=(At)
{
x=t.x;
y=t.y;
z=t.z;
return*this;
}
voidprint(){cout<};
voidmain()
{
At1(10,10,10),t2(20,20,20),t3;
t3=t1+t2;
t3.print();
t3=t2=t1;
t1.print();
t2.print();
t3.print();
}
答案:
3030
1010
1010
1010
2.#include
classA
{
public:
A(intr,intc){row=r;col=c;elem=newint[row*col];}
int&operator()(intx,inty){returnelem[col*x+y];}
intoperator()(intx,inty)const{returnelem[col*x+y];}
~A(){delete[]elem;}
private:
int*elem;
introw,col;
};
voidmain()
{
Am(5,8);
inti;
for(i=0;i<5;i++)m(i,1)=i+5;
for(i=0;i<5;i++)cout<cout<}
答案:
5,6,7,8,9,
3.#include
usingnamespacestd;
classgoods
{
private:
staticinttotalweight;
intweight;
public:
goods(intw){weight=w;totalweight+=weight;}
goods(goods&gd){weight=gd.weight;totalweight+=weight;}
~goods(){totalweight-=weight;}
staticintgettotal(){returntotalweight;}
};
intgoods:
:
totalweight=0;
voidmain()
{
goodsg1(50);
cout<:
gettotal()<goodsg2(100);
cout<}
答案:
50
150
4.#include
usingnamespacestd;
classA
{
inti,j;
staticintc;
public:
A(inta=0,intb=0){i=a;j=b;c++;}
~A(){c--;}
staticvoidf(){cout<<"c="<};
intA:
:
c=0;
voidmain()
{
Aa(4,8),b,d;
{
Az(3,6),f;
A:
:
f();
}
A:
:
f();
}
答案:
c=5
c=3
5.#include
usingnamespacestd;
classpoint
{
public:
voidpoi(intpx=10,intpy=10)
{x=px;y=py;}
friendintgetpx(pointa);
friendintgetpy(pointb);
private:
intx,y;
};
intgetpx(pointa)
{returna.x;}
intgetpy(pointa)
{returna.y;}
voidmain()
{
pointp,q;
p.poi();q.poi(15,15);
cout<cout<cout<cout<}
答案:
1010
1515
6.#include
classB;
classA
{
intdata;
A*prev;
public:
A(intd,A*n){data=d;prev=n;}
friendclassB;
};
classB
{
A*top;
public:
B(){top=0;}
voidpush(inti){A*n=newA(i,top);top=n;}
intpop()
{
A*t=top;
if(top)
{
top=top->prev;
intc=t->data;
deletet;
returnc;
}
return0;
}
};
voidmain()
{
intc[10]={23,34,56,87,67,876,42,657,55,66};
Bs;
for(inti=0;i<10;i++)s.push(c[i]);
for(i=0;i<10;i++)cout<cout<}
答案:
66,55,657,42,876,67,87,56,34,23,
7.#include
usingnamespacestd;
classTIME;
classDATE
{
public:
DATE(inta=2004,intm=9,intb=23)
{
year=a;month=m;day=b;
}
voidDateTime(TIME&t);
private:
intyear,month,day;
};
classTIME
{
public:
TIME(inth=0,intm=0,ints=0)
{
hour=h;minute=m;second=s;
}
friendvoidDATE:
:
DateTime(TIME&t);
private:
inthour,minute,second;
};
voidDATE:
:
DateTime(TIME&t)
{
cout<<"Nowis"<'<'<}
intmain()
{
DATEb(2004,9,23);
TIMEt(10,20,50);
b.DateTime(t);
return0;
}
答案:
Nowis2004.9.2310:
20:
50.
四、编程题
1.定义一个处理日期的类TDate,它有3个私有数据成员:
Month,Day,Year和若干个公有成员函数,并实现如下要求:
(1)成员函数设置缺省参数;
(2)定义一个友元函数来打印日期。
参考程序:
#include
usingnamespacestd;
classTDate
{
public:
TDate(intm=0,intd=0,inty=0):
Month(m),Day(d),Year(y)
{}
~TDate(){}
friendvoidShow(TDate);
private:
intMonth,Day,Year;
};
voidShow(TDated)
{
cout<}
intmain()
{
TDated1,d2(4,8,2014);
Show(d1);
Show(d2);
return0;
}
2.设计一个类CTimeInfo,要求其满足下述要求。
(1)要求有一个无参数的构造函数,其初始的小时和分钟分别为:
0,0;
(2)要求有一个带参数的构造函数,其参数分别对应小时和分钟;
(3)要求用一个成员函数实现时间的设置;
(4)要求用一个友元函数实现以12小时的方式输出时间;
(5)要求用一个友元函数实现以24小时的方式输出时间;
参考程序:
#include
usingnamespacestd;
classCTimeInfo
{
public:
CTimeInfo():
Hour(0),Minute(0){}
CTimeInfo(inth,intm):
Hour(h),Minute(m)
{}
~CTimeInfo(){}
voidSet(inth,intm)
{
Hour=h;Minute=m;
}
friendvoidShow_12(CTimeInfo);
friendvoidShow_24(CTimeInfo);
private:
intHour,Minute;
};
voidShow_12(CTimeInfod)
{
if(d.Hour<=12)
cout<<"am"<"<else
{
d.Hour-=12;
cout<<"pm"<"<}
}
voidShow_24(CTimeInfod)
{
cout<"<}
intmain()
{
CTimeInfod1,d2(21,8);
Show_12(d1);
Show_12(d2);
Show_24(d2);
return0;
}
3.定义一个Student类,在该类定义中包括:
一个数据成员score(分数)及两个静态数据成员total(总分)和count(学生人数)。
成员函数:
scoretotalcount(floats)用于设置分数、求总分和累计学生人数;静态成员函数sum用于返回总分;静态成员函数average用于求平均分。
在main函数中,创建三名学生,并调用上述函数求这三名学生的总分和平均分。
参考程序:
#include
classStudent
{
public:
voidscoretotalcount(floats)
{
score=s;
total+=score;
count++;
}
staticfloatsum(){returntotal;}
staticfloataverage(){returntotal/count;}
private:
floatscore;
staticfloattotal;
staticintcount;
};
floatStudent:
:
total=0;
intStudent:
:
count=0;
voidmain()
{
Students1,s2,s3;
s1.scoretotalcount(70);
s2.scoretotalcount(80);
s3.scoretotalcount(90);
cout<<"total:
"<:
sum()<cout<<"average:
"<:
average()<}
4.编写程序实现宾馆住宿客人管理。
定义客人类Guest,包含客人编号Num(按先后顺序自动生成)、姓名Name、住宿房号Room、房费fee,并定义静态成员Count,用于记录客人总数;提供构造函数,显示信息函数Display,以及返回客人总数函数GetCount等。
在主函数中创建3个客人对象进行测试。
参考程序:
#include
#include
usingnamespacestd;
classGuest
{
public:
Guest(stringn,stringr,doublef)
{
Num=++Count;
Name=n;
Room=r;
fee=f;
}
voiddisplay()
{
cout<}
staticintGetCount()
{
returnCount;
}
private:
intNum;
stringName;
stringRoom;
doublefee;
staticintCount;
};
intGuest:
:
Count=0;
intmain()
{
Guestg1("zhang","101",200);
Guestg2("li","201",300);
Guestg3("wang","301",500);
g1.display();
g2.display();
g3.display();
cout<<"Total="<:
GetCount()<return0;
}
5.生成一个复数类Complex。
复数的实部和虚部分别为double型x和y。
重载运算符加、减、乘、除为类的成员函数,用来计算两个复数的加、减、乘、除运算。
参考程序:
#include
classcomplex
{
private:
doublex,y;
public:
complex(doublexx=0,doubleyy=0)
{
x=xx;
y=yy;
}
voiddisplay()
{
cout<<"("<}
complexoperator+(complex&c1);
complexoperator-(complex&c1);
complexoperator*(complex&c1);
complexoperator/(complex&c1);
};
complexcomplex:
:
operator+(complex&c1)
{
complexc;
c.x=x+c1.x;
c.y=y+c1.y;
returnc;
}
complexcomplex:
:
operator-(complex&c1)
{
complexc;
c.x=x-c1.x;
c.y=y-c1.y;
returnc;
}
complexcomplex:
:
operator*(complex&c1)
{
complexc;
c.x=x*c1.x-y*c1.y;
c.y=x*c1.y+y