c++类与对象练习题.docx
《c++类与对象练习题.docx》由会员分享,可在线阅读,更多相关《c++类与对象练习题.docx(20页珍藏版)》请在冰豆网上搜索。
![c++类与对象练习题.docx](https://file1.bdocx.com/fileroot1/2023-1/30/b4b65e12-eb28-44d1-a412-1fc54b1c31d4/b4b65e12-eb28-44d1-a412-1fc54b1c31d41.gif)
c++类与对象练习题
1.概念填空题
1.1类定义的关键字是class。
类的数据成员通常指定为私有成员。
类的函数成员通常指定为公有成员,指定为公有的类成员可以在类对象所在域中的任何位置访问它们,类的私有和保护只能被该类的成员函数或友元函数访问。
1.2类的访问限定符包括public、private和protected。
类成员默认的访问方式是private访问限定符在类中无先后次序,各限定符允许(允许/不允许)多次出现。
1.3构造函数的任务是建立对象。
类中可以有多个构造函数,它们由参数区分。
如果类说明中没有给出构造函数,则C++编译器会提供构造函数,该函数不完成(完成/不完成)对象初始化工作。
1.4复制构造函数的参数是对象的复制,当程序没有给出复制构造函数时,编译系统会提供默认复制构造函数,完成类对象的复制。
复制构造函数被调用情况有3种。
1.5析构函数在对象释放时被自动调用。
类中没有定义析构函数时,编译系统会提供一个默认的析构函数。
该函数不完成(完成/不完成)具体对象的清理工作。
2.简答题
2.1为什么说类与对象的概念是客观世界的反映?
2.2简单解释什么是面向对象程序设计的封装性。
2.3引用作为函数参数时为什么能实现两个实参之间的数据交换?
为什么对应实参不能为
引用?
为什么返回值为引用的函数可以作为左值?
2.4什么是默认的构造函数?
默认的构造函数可以有多少个?
2.5复制构造函数用于哪3个方面?
2.6为什么在友元函数的函数体内访问对象成员时,必须用对象名加运算符”.”再加对象成
员名?
2.7类的静态数据成员与函数中的静态成员有何异同?
2.8类的成员函数在什么情况下应该定义为私有的?
这样做的目的是什么?
2.9友元关系有何性质?
友元关系的优点和缺点各有哪些?
3.选择题
3.1数据封装就是将一组数据和与这组数据有关操作组装在一起,形成一个实体,这实体也
就是(B)。
A.类B.对象
C.函数体
D.数据块
3.2类的实例化是指(B
)。
A.定义类B.
创建类的对象
C.指明具体类
D.调用类的成员
3.3下列说法中正确的是(
B)。
A.类定义中只能说明函数成员的函数头,不能定义函数体
B.类中的函数成员可以在类体中定义,也可以在类体之外定义
C.类中的函数成员在类体之外定义时必须要与类声明在同一文件中D.在类体之外定义的函数成员不能操作该类的私有数据成员
3.4有如下类定义:
classsample{
intn;
public:
sample(inti=0):
n(i){}
voidsetValue(intn0);
};
下列关于setValue成员函数的实现中,正确的是(A.
B)。
sample:
:
setValue(intn0){n=n0;}voidsample:
:
setValue(intn0){n=n0;}voidsetValue(intn0){n=n0;}setValue(intn0){n=n0;}
3.5在下面的类定义中,classsample{public:
sample(intval);~sample();
private:
inta=2.5;
public:
sample();
};
A.①
B.
C.
D.
错误的语句是(
C)。
//①
//②
//③
//④
C.③D.④
3.6类的构造函数被自动调用执行的情况是在创建该类的(B.数据成员时D.友元函数时
B.②
C)。
A.成员函数时C.对象时
3.7(A)是析构函数的特征。
A.一个类中只能定义一个析构函数B.析构函数名与类名不同C.析构函数的定义只能在类体内D.析构函数可以有一个或多个参数
3.8在下列函数原型中,可以作为类
A.voidAA(int);
C.AA(int)const;
3.9关于成员函数特征的下述描述中,A.成员函数一定是内联函数B.成员函数可以重载C.成员函数可以设置参数的默认值D.成员函数可以是静态的
3.10不属于成员函数的是(
B)。
AA
构造函数的是(D)。
B.intAA();D.AA(int)
A)是错误的。
A.静态成员函数B.友元函数
C.构造函数D.析构函数
A是类B的友元,类B是类C的友元,则(d)。
类类类类
3.11已知类A.B.C.
D.
A一定是类C的友元
C一定是类A的友元
C的成员函数可以访问类A的成员函数可以访问类
B的对象的任何成员B的对象的任何成员
3.12有如下类定义:
classAA{inta;
public:
4写出程序程序执行结果。
4.1#includeusingnamespacestd;classTest{public:
Test(){n+=2;}~Test(){n-=3;}staticintgetNum(){returnn;}private:
staticintn;
};
intTest:
:
n=1;
intmain(){
Test*p=newTest;deletep;
cout<<”n=”<:
getNum()<}
n=04.2#include
usingnamespacestd;
classAA{
intn;
public:
AA(intk):
n(k){}intget(){returnn;}intget()const{returnn+1;}
};
intmain(){
AAa(5);constAAb(6);cout<}
574.3#includeusingnamespacestd;classMyClass{
public:
intnumber;voidset(inti);
};
intnumber=3;
voidMyClass:
:
set(inti){
number=i;
}
voidmain(){
MyClassmy1;intnumber=10;
5
10
my1.set(5);cout<:
number);cout<}
51034.4#includeusingnamespacestd;classTest{
private:
staticintval;inta;
public:
staticintfunc();
voidsfunc(Test&r);
};
intTest:
:
val=200;
intTest:
:
func(){
returnval++;
}
voidTest:
:
sfunc(Test&r){
r.a=125;cout<<"Result3="<}
voidmain(){cout<<"Result1="<:
func()<Testa;
cout<<"Result2="<}
Result1=200
Result2=201Result1==125
5.编程题
5.1构造一个日期时间类(Timedate),数据成员包括年、月、日和时、分、秒,函数成员包括
设置日期时间和输出时间,其中年、月用枚举类型,并完成测试(包括用成员函数和用普通函数)。
#include
#include
#include
enumYR{Y2000,Y2001,Y2002,Y2003,Y2004,Y2005};//枚举名必须是标识符
enumMT{Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec};
classTimedate{
private:
YRyear;
MTmonth;
intdate;
inthh;
intmm;
intss;
public:
Timedate(){year=Y2000;month=Jan;date=1;hh=0;mm=0;ss=0;}
Timedate(YRa,MTb,intc){
year=a;
month=b;
date=c;
hh=12;mm=30;ss=0;
体会用引用的优点,一次可返回3个值
voidgetdate(YR&,MT&,int&);//voidgettime(int&,int&,int&);voidputdate(YR,MT,int);voidputtime(int,int,int);voidlist();
};
voidTimedate:
:
getdate(YR&y,MT&m,int&d){y=year;
m=month;d=date;
}
voidTimedate:
:
gettime(int&a,int&b,int&c){a=hh;
b=mm;c=ss;
}
voidTimedate:
:
putdate(YRa,MTb,intc){year=a;month=b;date=c;
}
voidTimedate:
:
puttime(inta,intb,intc){hh=a;mm=b;ss=c;
}
voidTimedate:
:
list(){//成员函数cout<<"year/month/date:
";switch(year){caseY2000:
cout<<"2000";break;caseY2001:
cout<<"2001";break;caseY2002:
cout<<"2002";break;caseY2003:
cout<<"2003";break;caseY2004:
cout<<"2004";break;caseY2005:
cout<<"2005";break;
}switch(month){//,,,,,,,,caseJan:
cout<<'/'<<"Jan";break;caseFeb:
cout<<'/'<<"Feb";break;caseMar:
cout<<'/'<<"Mar";break;caseApr:
cout<<'/'<<"Apr";break;caseMay:
cout<<'/'<<"May";break;caseJun:
cout<<'/'<<"Jun";break;caseJul:
cout<<'/'<<"Jul";break;
caseAug:
cout<<'/'<<"Aug";break;
caseSep:
cout<<'/'<<"Sep";break;
caseOct:
cout<<'/'<<"Oct";break;
caseNov:
cout<<'/'<<"Nov";break;
caseDec:
cout<<'/'<<"Dec";break;
}
cout<<'/'<cout<<"hour:
minite:
second:
";
cout<'<'<}
voidshow(Timedate&td){//普通函数,体会两者的不同
YRyear;
MTmonth;
intdate,hh,mm,ss;
td.getdate(year,month,date);
td.gettime(hh,mm,ss);
cout<<"year/month/date:
";
switch(year){
caseY2000:
cout<<"2000";break;
caseY2001:
cout<<"2001";break;
caseY2002:
cout<<"2002";break;
caseY2003:
cout<<"2003";break;
caseY2004:
cout<<"2004";break;
caseY2005:
cout<<"2005";break;
}
switch(month){//,,,,,,,,
caseJan:
cout<<'/'<<"Jan";break;
caseFeb:
cout<<'/'<<"Feb";break;
caseMar:
cout<<'/'<<"Mar";break;
caseApr:
cout<<'/'<<"Apr";break;
caseMay:
cout<<'/'<<"May";break;
caseJun:
cout<<'/'<<"Jun";break;
caseJul:
cout<<'/'<<"Jul";break;
caseAug:
cout<<'/'<<"Aug";break;
caseSep:
cout<<'/'<<"Sep";break;
caseOct:
cout<<'/'<<"Oct";break;
caseNov:
cout<<'/'<<"Nov";break;
caseDec:
cout<<'/'<<"Dec";break;
}
cout<<'/'<cout<<"hour:
minite:
second:
";
cout<'<'<}
intmain(intargc,char*argv[]){
TimedateA(Y2004,Mar,3),B;
A.list();
B.list();
B.putdate(Y2005,Oct,18);
B.puttime(17,30,00);
B.list();show(B);return0;
}
5.2定义一个日期类Date,具有年月日等数据成员,显示日期、加减天数等函数成员。
注意需要考虑闰年。
#include
usingnamespacestd;
classDate{
intyear,month,day;
staticconstintdays[];
boolLeapYear();
boolEndofMonth();
public:
Date(int=1900,int=1,int=1);
voidIncrement(int);
voidDecrement(int);
voidSetDate(int,int,int);
voidPrint();
};
constintDate:
:
days[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
Date:
:
Date(inty,intm,intd){
SetDate(y,m,d);
}
voidDate:
:
SetDate(inty,intm,intd){year=(y>=1900&&y<=9999)?
y:
1900;month=(m>=1&&m<=12)?
m:
1;if(month==2&&LeapYear())day=(d>=1&&d<=29)?
d:
1;
elseday=(d>=1&&d<=days[month])?
d:
1;
}
boolDate:
:
LeapYear(){
return((year%400==0)||(year%4==0&&year%100!
=0))?
true:
false;
}
boolDate:
:
EndofMonth(){
if(month==2&&LeapYear())returnday==29;
else
returnday==days[month];
}
voidDate:
:
Increment(intn){
inti;
for(i=1;i<=n;i++)
if(EndofMonth()&&month==12){year++;month=day=1;
}
elseif(EndofMonth()){
month++;day=1;
}
else
day++;
}
voidDate:
:
Decrement(intn){
inti;
for(i=1;i<=n;i++)
if(day==1){
if(month==1){year--;month=12;day=31;
}
elseif(month==3){day=LeapYear()?
29:
28;month=2;
}
elseday=days[--month];
}
else
day--;
}
voidDate:
:
Print(){
cout<voidmain(){
Dated1(2005,1,4),d2(2004,12,27);d1.Print();
d1.Decrement(4);
d1.Print();
d2.Print();
d2.Increment(70);
d2.Print();
}
5.3定义一个圆类(Circle),属性为半径(radius)、圆周长和面积,操作为输入半径并计算周长、面积,输出半径、周长和面积。
要求定义构造函数(以半径为参数,默认值为0,周长和面积在构造函数中生成)和复制构造函数。
#include
constdoublePI=3.1415;
usingnamespacestd;
classCircle{
doubleradius,length,area;
public:
Circle(doubler=0){
setr(r);
length=2*PI*radius;
area=PI*radius*radius;
}
Circle(Circle&c){
radius=c.radius;
length=c.length;
area=c.area;
}
voidprint(){
cout<<"radius="<cout<<"length="<cout<<"area="<
}
voidsetr(doubler){
radius=r;
}
};
intmain(){
Circlec1(10),c2(c1);
c1.print();
c2.print();
return0;
}
5.4设计一个学校在册人员类(Person)。
数据成员包括身份证号(IdPerson)、姓名(Name)、性别(Sex)、生日(Birth-day)和家庭住址(HomeAddress)。
成员函数包括人员信息的录入和显示还包括构造函数与复制构造函数。
设计一个合适的初始值。
#include
#include
constdoublePI=3.1415;
usingnamespacestd;structdate{
intyear,month,day;
};
classPerson{
charID[12];
charName[10];
charSex[3];
dateBirth;
charHomeAdd[20];
public:
Person(){
ID[0]=Name[0]=Sex[0]=HomeAdd[0]=0;Birth.year=Birth.month=Birth.day=0;
}
Person(charid[],charname[],charsex[],datebirth,charhomeadd[]){strcpy(ID,id);
strcpy(Name,name);strcpy(Sex,sex);
Birth=birth;strcpy(HomeAdd,homeadd);
}
Person(Person&p){
strcpy(ID,p.ID);
strcpy(Name,p.Name);strcpy(Sex,p.Sex);
Birth=p.Birth;strcpy(HomeAdd,p.HomeAdd);
}
voidsetID(charid[]){strcpy(ID,id);
}
voidsetName(charname[]){strcpy(Name,name);
}
voidsetSex(charsex[]){strcpy(Sex,sex);
}
voidsetBirth(datebirth){Birth=birth;
voidsetHome(charhomeadd[]){strcpy(HomeAdd,homeadd);
}
voidprint(){
cout<<"ID="<}
};
intmain(){
datebirth;
birth.year=1991;
birth.month=6;
birth.day=12;
Personp1("08124401","陈建华","男",birth,"中吴大道1801号");
p1.print();
Personp2;
p2.print();
return0;
}
5.5设计如下类:
1)建立一个Point类,表示平面中的一个点;建立一个Line类,表示平面中的一条线端,内含两个Point类的对象;建立Triangle类,表示一个三角形,内含三个Line类的对象构成一个三角形。
2)设计三个类的相应的构造函数、复制构造函数,完成初始化和对象复制
3)设计Triangle类的成员函数完成三条边是否能构成三角形的检验和三角形面积计算,面积显示。
#include
#include
constdoublePI=3.1415;
usingnamespacestd;
classPoint{
doubleX