C++程序设计练习题与答案完整版本.docx
《C++程序设计练习题与答案完整版本.docx》由会员分享,可在线阅读,更多相关《C++程序设计练习题与答案完整版本.docx(33页珍藏版)》请在冰豆网上搜索。
C++程序设计练习题与答案完整版本
C++程序设计练习题
一、填空题
1.对象的三大基本特性分别为多态性、()、封装性。
2.赋值运算符应重载为()函数。
3.用()声明的基类称为虚基类。
4.用()声明的函数称为虚函数。
5.派生类对基类继承控制访问有三种。
派生类可以定义其基类中不具备的()。
6.静态成员是对象的成员,()函数不是类的成员。
7.在函数体之前加()关键字可以防止覆盖函数改变数据成员的值。
8.一个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.类的析构函数的作用是()
A)一般成员函数B)类的初始化C)对象的初始化D)删除对象创建的所有对象
3.类的析构函数是在()调用的。
A)类创建时B)创建对象时C)删除对象时D)不自动调用
4.在()情况下适宜采用inline定义内联函数。
A)函数体含有循环语句B)函数体含有递归语句
C)函数代码少、频繁调用D)函数代码多、不常调用
5.如果类A被说明成类B的友元,则()
A)类A的成员即类B的成员B)类B的成员即类A的成员
C)类A的成员函数不得访问类B的成员D)类B不一定是类A的友元
6.在类中声明转换函数时不能指定()
A)参数B)访问权限C)操作D)标识符
7.在公有继承的情况下,基类成员在派生类中的访问权限()
A)受限制B)保持不变C)受保护D)不受保护
8.在C++类体系中,不能被派生类继承的有()
A)转换函数B)构造函数C)虚函数D)静态成员函数
9.假定ClassN为一个类,则执行“ClassNx;”语句时将自动调用该类的()
A)有参构造函数B)无参构造函数C)拷贝构造函数D)赋值构造函数
10.C++语言建立类族是通过()
A)类的嵌套B)类的继承C)虚函数D)抽象类
11.重载一元运算符--为类A的成员运算符,若有类A的对象obj,则表达式--obj被C++编译器解释为()。
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&);
C)friendClassNoperator--(int);D)friendClassNoperator--();
19.在公有派生时,下列描述中不正确的是()。
A)派生类的对象可以赋给基类的对象B)派生类对象的地址可以赋给指向基类的指针
C)派生类的对象可以初始化基类的引用
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);
};
4.
#include
usingnamespacestd;
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;}
2.
#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)写出该类的所有构造函数的类外定义代码。
(2)写出对运算符“+”、“<<”、“>>”进行重载的运算符重载函数的定义。
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),圆类和正方形类都有构造函数,修改、显示数据成员值的函数,求面积函数。
(2)写出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)在主程序中,创