C++程序设计练习题与答案1.docx
《C++程序设计练习题与答案1.docx》由会员分享,可在线阅读,更多相关《C++程序设计练习题与答案1.docx(27页珍藏版)》请在冰豆网上搜索。
C++程序设计练习题与答案1
C++g序设计练习题
一、填空题
1•对象的三大基本特性分别为多态性、()、封装性。
2.赋值运算符应重载为()函数。
3•用()声明的基类称为虚基类。
4•用()声明的函数称为虚函数。
5•派生类对基类继承控制访问有三种。
派生类可以定义其基类中不具备的()。
6•静态成员是对象的成员,()函数不是类的成员。
7•在函数体之前加()关键字可以防止覆盖函数改变数据成员的值。
&一个const对象只能访问()成员函数。
9•使用友元函数是为了提高程序效率,且节约了()开销。
10•类名为“ClassName”的类,其拷贝构造函数的原型说明是()。
11.
由关键字private、public和protected限定成员的访问权限分别是(
省关键字时成员的访问权限为()。
12•如果想要公共基类在派生类中只有一个拷贝,就要将公共的基类说明为默认构造函数,就必须在每一个派生类的构造函数中都要调用虚基类的(
13・静态成员函数是使用关键字()说明的成员函数。
14.一个函数的原型声明为“voidFunName(int=0,double=0,char='x');”,则调用FunName函数的方法
共有()种。
15•编译时多态性是通过()实现的;运行时多态性是通过()实现的。
16.C++通过()实现编译时多态性,通过()实现运行时多态性。
17•在C++中,声明类的关键字是()。
18.声明C++模板的关键字是()。
19.调用函数原型声明为“voidFunName(short,int=0,float=1.0);”的方法有()种。
20.处理C++异常的方法:
采用()结构。
21.用关键字(卜()和()限定的成员,其访问权限分别为:
公有的、私有的和保护的。
缺省关键字时,成员的访问权限为()。
22.在C++中,处理()的方法是采用try-catch结构。
23•在C++中,用关键字()说明内置函数。
24.在C++中,声明友元函数的关键字是()。
25.将公共基类说明为()时,多重派生过程中公共基类在派生类中就只有一个拷贝了。
26.在C++中,如果函数调用在前、定义在后,就必须先对函数进行()。
27.在成员函数头之后、函数体之前加()修饰的成员函数称为类的常成员函数。
28•包含纯虚函数的类称为抽象类,这种类只能用作()来派生新类。
由于抽象类的特殊性,我们
可以说明抽象类的(),但不能说明抽象类的()。
29.说明函数类型为“double”、函数名为“virfun”且无参数的纯虚函数的表达形式为()。
30.说明静态成员要使用关键字()。
31.当函数调用在前定义在后时,必须先对函数进行()说明。
32.类名为“ClassN”的类的拷贝构造函数的函数原型说明为()。
33.抽象类是包含()的类,必须注意:
不能说明抽象类的(),但可说明抽象类的()。
34.流插入运算符<<只能重载为友元函数,重载流插入运算符<<的函数名为()。
35.要防止在该成员函数中改变数据成员的值,就要在类的成员函数名之后、函数体之前加上关键字
()。
36.类和对象的关系可表述为:
类是对象的(),而对象则是类的()。
37•在C++中,三种继承方式的说明符号为()、()和(),如果不加说明,则默认的继
承方式为()。
38•如果只想保留公共基类的一个复制,就必须使用关键字()把这个公共基类声明为虚基类。
39.若要把voidmyfun()定义为类A的友元函数,则应在类A的声明中加入语句()。
40.类的静态成员分为()和()。
41•运算符重载要求保持其原来的操作数个数、
42.通过关键字()可以声明模板,通过关键字
43.请列出C++中两种用户自定义的数据类型:
44.构造函数的作用是()。
45.后置自增运算符“++”重载为类的成员函数
()、()和语法结构。
()指定函数模板的类型参数。
()、()。
(设类名为ClassName)的形式为()。
二、单选题
1.继承机制的作用是()
A)信息隐藏
B)
数据封装
C)定义新类
D)数据抽象
2.类的析构函数的作用
H.是
()
A)一般成员函数
B)
类的初始化
C)对象的初始化
D)删除对象创建的所有对象
3.类的析构函数是在
(
)调用的。
A)类创建时
B)
创建对象时
C)删除对象时
D)不自动调用
4.在()情况下适宜采用inline定义内联函数。
A)函数体含有循环语句
C)函数代码少、频繁调用
5.如果类A被说明成类B的友元,则(
A)obj.operator--()B)operator--(obj)C)obj:
:
operator--()D)obj:
operator--()
12.以下有四种关于类的说法,其中不正确的是()。
A)构造函数可以指定参数,但不能指定函数类型B)一个类可以有多个构造函数
C)析构函数不可以指定参数,但可以指定函数类型D)一个类只能有一个析构函数
13.面向对象程序设计讲求封装性,在C++中封装是借助于()实现的。
A)结构B)数组C)类D)函数
14.下面有四种关于类的说法,其中不正确的是()。
A)一个类可以有多个构造函数B)析构函数不可以指定函数类型,但可以指定函数参数
C)一个类只能有一个析构函数D)在一个类中可以说明其它类的对象
15.下列有关基类的叙述中不正确的是(),前提为"公有派生”。
A)基类的公有成员在派生类中仍然是公有的B)基类的保护成员在派生类中仍然是保护的
C)基类的私有成员在派生类中仍然是私有的D)基类的私有成员在派生类中是不可访问的
16•以下有四种关于友元的描述,其中错误的是()。
A)类A的友元类B的成员函数都是类A的友元函数B)友元函数可以访问该类的私有数据成员C)类与类之间的友元关系可以继承D)友元可以提高程序的运行效率
17.C++的封装性是借助于()实现的。
A)函数B)数组C)结构D)类
18•要将--重载为类ClassN的后置友元运算符,那么,要在类中添加的原型说明为()。
A)friendClassNoperator--(ClassN&int);B)friendClassNoperator--(ClassN&)
D)当基类的指针指向派生类对象时,通过该指针可以直接访问派生类中的成员20•以下关于继承成员的访问属性的叙述中,不正确的是()。
A)基类的保护成员在私有派生类中是私有的B)对基类成员的访问必须没有二义性
C)基类的保护成员在保护派生类中是保护的D)基类的保护成员在派生类中是保护的
三、程序改错题(改正下列类中的错误)
1.
classClassN
{
private:
intnmember;ClassNpmember;
public:
ClassN();intClassN(intx);
}
2.
voidmain()
{
charc[]=newchar[20];deletec;
}
3.
classMyClass{
private:
intn=1;
MyClasspO;
public:
MyClass(inta=0);void~MyClass(inta);
#includeusingnamespacestd;voidmain()
{
int&par=newint[6];deletepar;
cout>>"主函数End!
"<}
5.
#include
usingnamespacestd;
voidmain()
{
long&par=newlong[9];
deletepar;
cout<<"主函数End!
"<}
6.
CLassCN
{
private:
longn;CNpobj;
public:
CN();voidCN(intX);
};
四、分析程序输出题
1.
#include
usingnamespacestd;
classA
{
public:
A(){cout<<"constructingA"<~A(){cout<<"destructingA"<};
classB:
publicA
{
public:
B(){cout<<"constructingB"<~B(){cout<<"destructingB"<};
classC:
publicB
{
public:
C(){cout<<"constructingC"<~C(){cout<<"destructingC"<voidmain()
{Cc1;}
#include
usingnamespacestd;
voidfun(int&a,int&b)
{
intp;p=a;a=b;b=p;
}
voidexchange(int&a,int&b,int&c)
{
if(a
if(aif(b}
voidmain()
{
inta=12,b=89,c=56;
exchange(a,b,c);cout<<"a="<}
3.
#include
classTC{
private:
intnum;
public:
TC();
intTEST(){returnnum;}
~TC();
};
TC:
:
TC(){num=0;}
TC:
:
~TC(){cout<<"Destructorisactive"<voidmain()
{
TCtarr[5];
cout<<"Exitingmain"<}
4.
#include
classCBase
{
private:
intn;
public:
CBase(intm=0){n=m;}
virtualvoidprint(){cout<<"InsideCBase"<classCDrive:
publicCBase
{
private:
intn;
public:
CDrive(){n=0;}
CDrive(inta,intb):
CBase(a),n(b){}
voidprint(){cout<<"InsideCDrive"<};
voidmain()
{
CBaseb1,b2(99),*pb;
CDrivedd(11,22);
pb=&b1;
pb->print();
pb=&b2;
pb->print();
pb=ⅆ
pb->print();pb->CBase:
:
print();
}
5.
#include
classCTest
{
private:
longnum;
public:
CTest();
~CTest();
};
CTest:
:
CTest(){num=0;}
CTest:
:
~CTest(){cout<<"调用析构函数"<voidmain()
{
CTestcobj;
cout<<"退出主函数"<}
6.
#include
classCN
{
private:
intn;
public:
CN(inti){n=i;}
operatorint(){returnn;}
};
voidmain()
{
CNcobj(123);
cout<}
7.
#include
voidmain()
{
intnum=100;
int&ref=num;
cout<ref=ref+100;
cout<num=num+100;
cout<}
8.
#include
classCName
{
private:
longnum;
public:
CName();
~CName();
};
CName:
:
CName(){num=0;}
CName:
:
~CName(){cout<<"调用析构函数"<voidmain()
{
CNamecarr[2];
cout<<"退出main"<}
9•分析下列程序并写出程序的运行结果。
#include
classCBase
{
private:
intn;
public:
CBase(intm=0){n=m;}
virtualvoidprint(){cout<<"InsideCBase"<};
classCDrive:
publicCBase
{
private:
intn;
public:
CDrive(){n=0;}
CDrive(inta,intb):
CBase(a),n(b){}
voidprint(){cout<<"InsideCDrive"<};
voidmain()
{
CBaseba,bb(100),*pb;
CDrivedd(123,456);
pb=&ba;
pb->print();
pb=&bb;
pb->print();
pb=ⅆ
pb->print();pb->CBase:
:
print();
}
10.
#include
classCT
{
private:
intn;
public:
CT(inti){n=i;}
operatorint(){returnn;}
};
voidmain()
{
CTcObj(1234);cout<}
五、编程题
1.下列类成员函数的定义不完整,请在填代码以使其完整。
classTC{
private:
intnum;
floatx;
public:
TC(int,float);
TC(TC&);
};
TC:
:
TC(intn,floatf)
{
num=n;
}
TC:
:
TC(TC&t)
{
x=t.x;
}
2.根据下面的主程序,完成类说明的最小形式(不要求实现成员函数的定义)。
#include
classBase
{
private:
;
public:
;
};
voidmain()
{Basebo(6);}
3.一个类的头文件如下所示,程序产生对象tco,且tco.num=10,并使用Show()函数输出这个对象
的值。
//tcn.h
classTCN{
private:
intnum;
public:
TCN(intn){num=n;}
voidShow(){cout<};
#include
#include"tcn.h"
voidmain()
{
}
4.完成下面类中的成员函数的定义(在处填写适当的内容)。
classCTN
{
private:
intmen;
floatmef;
public:
CTN(int,float);
CTN(CTN&);
};
CTN:
:
CTN()
{men=a;
=b;
}
CTN:
:
CTN(—rObj)
{men=;
mef=.mef;
}
5•在—处填写适当内容,以便完成下列类成员函数的定义。
classCN
{
private:
intmn;
floatmf;
public:
CN(int=0,float=0);
CN(CN&);
};
CN:
:
CN()
{this->mn=mn;
=mf;
}
CN:
:
CN(rObj)
mn=;
mf=.f;
}
6•填上合适的字句,使程序的最终结果为200。
#include
classCNumber
{
private:
intval;
public:
CNumber(inti){val=i;}
int();
};
CNumber:
:
operatorint(){}
classnum:
publicCNumber{
public:
num(inti):
CNumber(i){}
};
voidmain()
{
numn(100);
inti=n;
cout<
}
7•下面是一个类的测试程序,设计出能使用如下测试程序的类:
voidmain()
{
Testto;
to.Init(300,200);
to.Print();
}
输出结果:
300-200=100
8.已知复数类Complex的声明如下:
classComplex
{
public:
Complex();
Complex(double);
Complex(double,double);
friendComplexoperator+(Complex&,Complex&);
friendostream&operator<<(ostream&,Complex&);
friendistream&operator>>(istream&,Complex&);
private:
doublereal,imag;
};
要求:
(1)写出该类的所有构造函数的类外定义代码。
⑵写出对运算符“+”、“<<”、“>>”进行重载的运算符重载函数的定义。
9.
个通用的用
下列AbstractC类是一个表示形状的抽象类,area()为求图形面积的函数,total()则是以求不同形状的图形面积总和的函数。
classAbstractC
{
public:
virtualdoublearea()=0;
};
doubletotal(AbstractC*sa[],intn)
{
doubles=0.0;
for(inti=0;iarea();
returns;
}
要求:
(1)从AbstractC类派生圆类(Circle)、正方形类(Square),圆类新增数据成员半径(r),正方形类新增数据成员边长(a),圆类和正方形类都有构造函数,修改、显示数据成员值的函数,求面积函数。
⑵写出main()函数,计算半径为3.5的圆和边长为7.9的正方形的面积和(必须通过调用total函数计算)。
10.一个类的头文件cn.h的内容如下所示:
//cn.h
#include
classCN
{
private:
intn;
public:
CN(int);
voidPrint();
};
CN:
:
CN(intN){n=N;}
voidCN:
:
Print(){cout<<*(1)编写一个主程序,产生对象Obj,且使Obj对象中的n成员的值为100,并使用Print()函数输出这个对象中私有成员n的值。
(2)在主程序中,创建一动态对象,使该动态对象的数据成员值为2015,并使用指针pObj指向该动
态对象,然后输出该动态对象的数据成员的值。
11.一个类的头文件CT.h的内容如下所示:
//CT.h
#include
usingnamespacestd;
classCT
{
private:
intm;
public:
CT(int);
voidShowM();
};
CT:
:
CT(intn){m=n;}
voidCT:
:
ShowM(){cout<(1)编写一个主程序,产生对象mObj,且使mObj对象中的m成员的值为11,并使用ShowM()函数
输出这个对象中私有成员m的值。
(2)在主程序中,创建一动态对象,使该动态对象的数据成员值为126,并使用指针pObj指向该动态
对象,然后输出该动态对象的数据成员的值。
12•使用运行时多态性编程实现三角形、矩形和圆的总面积的统计并输出结果。
三角形、矩形和圆类的类名分别为T、R和C。
T类必须以S类作基类,R类必须从T类派生,C类必须以S作基类。
Shape类的定义如下:
classS
{
private:
intx,y;
public:
S(inta=0,intb=0):
x(a),y(b){}
virtualintArea()=0;
};
不必建立工程,将所有代码都放在一个源文件中。
在主函数中,必须调用下列Sum函数来统计各类图
形面积的总和。
intSum(S*s[],intn