C程序设计练习题与答案.docx
《C程序设计练习题与答案.docx》由会员分享,可在线阅读,更多相关《C程序设计练习题与答案.docx(40页珍藏版)》请在冰点文库上搜索。
![C程序设计练习题与答案.docx](https://file1.bingdoc.com/fileroot1/2023-5/31/15d29582-66b2-4a1c-a305-02b573fef1bd/15d29582-66b2-4a1c-a305-02b573fef1bd1.gif)
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.当函数调用在前定义在后时,必须先对函数进行()说明。
word
编辑版.
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)类创建时D)不自动调用C)删除对象时B)创建对象时
4.在()情况下适宜采用inline定义内联函数。
A)函数体含有循环语句B)函数体含有递归语句
D)函数代码多、不常调用C)函数代码少、频繁调用
5.如果类A被说明成类B的友元,则()
A)类A的成员即类B的成员B)类B的成员即类A的成员
C)类A的成员函数不得访问类B的成员D)类B不一定是类A的友元
6.在类中声明转换函数时不能指定()
A)参数B)访问权限C)操作D)标识符
7.在公有继承的情况下,基类成员在派生类中的访问权限()
D)A)受限制不受保护C)受保护B)保持不变8.在C++类体系中,不能被派生类继承的有()
A)转换函数B)构造函数静态成员函数D)C)虚函数
9.假定ClassN为一个类,则执行“ClassNx;”语句时将自动调用该类的()
A)有参构造函数B)D)赋值构造函数无参构造函数C)拷贝构造函数
10.C++语言建立类族是通过()
D)虚函数类的继承类的嵌套抽象类A)B)C)
word
编辑版.
11.重载一元运算符--为类A的成员运算符,若有类A的对象obj,则表达式--obj被C++编译器解释为()。
A)obj.operator--()B)operator--(obj)C)obj:
:
operator--()
D)obj:
operator--()
12.以下有四种关于类的说法,其中不正确的是()。
A)构造函数可以指定参数,但不能指定函数类型B)一个类可以有多个构造函数
D)析构函数不可以指定参数,但可以指定函数类型一个类只能有一个析构函数C)
13.面向对象程序设计讲求封装性,在C++中封装是借助于()实现的。
函数类D)B)A)结构数组C)
14.下面有四种关于类的说法,其中不正确的是()。
A)一个类可以有多个构造函数B)析构函数不可以指定函数类型,但可以指定函数参数C)一个类只能有一个析构函数D)在一个类中可以说明其它类的对象
15.下列有关基类的叙述中不正确的是(),前提为“公有派生”。
A)B)基类的公有成员在派生类中仍然是公有的基类的保护成员在派生类中仍然是保护的
C)基类的私有成员在派生类中仍然是私有的D)基类的私有成员在派生类中是不可访问的
16.以下有四种关于友元的描述,其中错误的是()。
A)类A的友元类B的成员函数都是类A的友元函数B)友元函数可以访问该类的私有数据成员
C)类与类之间的友元关系可以继承D)友元可以提高程序的运行效率
17.C++的封装性是借助于()实现的。
D)A)函数B)数组C)结构类
18.要将--重载为类ClassN的后置友元运算符,那么,要在类中添加的原型说明为()。
A)friendB)friendClassNoperator--(ClassN&);ClassNoperator--(ClassN&,int);
C)friendClassNoperator--(int);
D)friendClassNoperator--();
19.在公有派生时,下列描述中不正确的是()。
A)派生类的对象可以赋给基类的对象B)派生类对象的地址可以赋给指向基类的指针
C)派生类的对象可以初始化基类的引用D)当基类的指针指向派生类对象时,通过该指针可以直接访问派生类中的成员)。
20.以下关于继承成员的访问属性的叙述中,不正确的是(
对基类成员的访问必须没有二义性B)A)基类的保护成员在私有派生类中是私有的
基类的保护成员在派生类中是保护的D)C)基类的保护成员在保护派生类中是保护的三、程序改错题(改正下列类中的错误)
1.
classClassN
{
private:
intnmember;
ClassNpmember;
ClassN();public:
intClassN(intx);
}2.word
编辑版.
voidmain(){charc[]=newchar[20];
deletec;
}3.classMyClass{private:
intn=1;
MyClasspO;public:
MyClass(inta=0);void~MyClass(inta);};.4#includeusingnamespacestd;voidmain(){int&par=newint[6];
deletepar;
!
< ̄主函数
}5.#includeusingnamespacestd;voidmain(){long&par=newlong[9];
deletepar;
!
<?
主函数End
}6.CLassCN{private:
longn;CNpobj;
public:
CN();voidCN(intX);
};word
编辑版.
四、分析程序输出题
1.
#include
usingnamespacestd;
classA
{
public:
A(){cout<~A(){cout<};
classB:
publicA
{
public:
B(){cout<~B(){cout<};
classC:
publicB
{
public:
C(){cout<~C(){cout<};
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(bword
编辑版.
}
voidmain()
{
inta=12,b=89,c=56;
exchange(a,b,c);
cout<}
3.
#include
classTC{
private:
intnum;
public:
TC();
intTEST(){returnnum;}
~TC();
};
TC:
:
TC(){num=0;}
TC:
:
~TC(){cout<voidmain()
{
TCtarr[5];
cout<}
4.
#include
classCBase
{
private:
intn;
public:
CBase(intm=0){n=m;}
virtualvoidprint(){cout<};
classCDrive:
publicCBase{private:
intn;}n=0;public:
CDrive(){
}CDrive(inta,intb):
CBase(a),n(b){
cout<word
编辑版.
};
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(){潣瑵?
?
调用析构函数<voidmain(){CTestcobj;<?
退出主函数
}6.#includeclassCN{private:
intn;public:
CN(inti){n=i;}
word
编辑版.
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(){潣瑵?
?
调用析构函数<voidmain(){CNamecarr[2];退出潣瑵?
?
main<}9.分析下列程序并写出程序的运行结果。
#includeword
编辑版.
classCBase
{
private:
intn;
public:
CBase(intm=0){n=m;}
virtualvoidprint(){cout<};
classCDrive:
publicCBase
{
private:
intn;
public:
CDrive(){n=0;}
CDrive(inta,intb):
CBase(a),n(b){}
voidprint(){cout<voidmain(){CBaseba,bb(100),*pb;
CDrivedd(123,456);
pb=&ba;
pb->print();
pb=&bb;pb->print();pb=ⅆ
pb->print();
pb->CBase:
:
print();
}10.#includeclassCT{private:
intn;n=i;}public:
CT(inti){
}operatorint(){returnn;
};
voidmain(){CTcObj(1234);
cout<word
编辑版.
}
五、编程题
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<};
word
编辑版.
#include
椣据畬敤尠捴?
屨
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=;
word
编辑版.
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&);
word
编辑版.
private:
doublereal,imag;
};
要求:
(1)写出该类的所有构造函数的类外定义代码。
(2)写出对运算符“+”、“<<”、“>>”进行重载的运算符重载函数的定义。
9.下列AbstractC类是一个表示形状的抽象类,area()为求图形面积的函数,total()则是一个通用的用以求不同形状的图形面积总和的函数。
classAbstractC
{
public:
virtualdoublearea()=0;
};
doubletotal(AbstractC*sa[],intn)
{
doubles=0.0;
for(inti=0;i