复习题部分参考.docx
《复习题部分参考.docx》由会员分享,可在线阅读,更多相关《复习题部分参考.docx(18页珍藏版)》请在冰豆网上搜索。
复习题部分参考
《C++程序设计》复习题
一.选择题
1.关于类定义格式的描述中,(D)是错的。
A.一般类的定义格式分为说明部分和实现部分
B.一般类中包含有数据成员和成员函数
C.类中成员有三种访问数据:
公有、私有和保护
D.成员函数都应是公有的,数据成员都应是私有的
2.( D)不是构造函数的特征。
A.构造函数的函数名与类名相同;B.构造函数可以重载;
C.构造函数可以设置缺省参数;D.构造函数必须指定类型说明。
3.在C++中,关于下列设置参数默认值的描述中,( C)是正确的。
A.不允许设置参数的默认值;
B.设置参数默认值只能在定义函数时设置;
C.设置参数默认值时,应该是先设置右边的,再设置左边的;
D.设置参数默认值时,应该全部参数都设置。
4.重载函数在调用时选择的依据中,( D)是错误的。
A.参数个数;B.参数的类型;C.函数名字;D.函数的类型。
5.在( C)情况下适宜采用inline定义内联函数。
A.函数体含有循环语句;B.函数体含有递归语句;
C.函数代码小,频繁调用;D.函数代码多,不常调用;
6.( A)是析构函数的特征。
A.一个类中只能定义一个析构函数;B.析构函数名与类名不同;
C.析构函数的定义只能在类体内;D.析构函数可以有一个或多个参数;
7.定义析构函数时,应该注意(C )。
A.其函数名与类名完全相同;B.函数返回类型必须是void类型;
C.无形参,也不可重载;D.函数体中必须有delete语句;
8.关于成员函数特征的下列描述中,(A )是错误的。
A.成员函数一定是内联函数;B.成员函数可以重载;
C.成员函数可以设置缺省参数值;D.成员函数可以是静态的;
9.下列静态数据成员的特性中,(C )是错误的。
A.说明静态数据成员时前边要加修饰符static;B.静态数据成员要在类体外进行初始化;
C.静态数据成员不是所有对象所共用的;
D.引用静态数据成员时,要在其名称前加<类名>和作用域运算符;
10下面关于友元函数的描述正确的是(C)
A.友元函数的实现必须在类的内部定义 B.友元函数是类的成员函数
C.友元函数破坏了类的封装性和隐蔽性
D.友元函数只能访问类的私有成员,不能访问公有和保护成员。
21main()函数可以访问派生类的对象中它的哪一类基类成员?
(A)
A.公有继承的基类的公有成员B.公有继承的基类的保护成员
C.公有继承的基类的私有成员D.保护继承的基类的公有成员
22可以用p.a的形式访问派生类对象p的基类成员a,其中a是(D)。
A.私有继承的公有成员B.公有继承的私有成员
C.公有继承的保护成员D.公有继承的公有成员
23下面叙述不正确的是(A)。
A.基类的保护成员在派生类中仍然是保护的
B.基类的保护成员在公有派生类中仍然是保护的
C.基类的保护成员在私有派生类中仍然是私有的
D.对基类成员的访问必须是无二义性
24多继承派生类建立对象时,(B)被最先调用。
A.派生类自己的构造函数B.虚基类的构造函数
C.非虚基类的构造函数D.派生类中子对象类的构造函数
25设置虚基类的目的是(A)。
A.消除两义性B.简化程序C.提高运行效率D.减少目标代码
26抽象类应该含有(D)。
A.至多一个虚函数B.至多一个虚函数是纯虚函数
C.至少一个虚函数D.至少一个虚函数是纯虚函数
27、使用派生类的主要原因是(A
A.提高代码的可重用性
C.加强类的封装性
B.提高程序的运行效率
D.实现数据的隐藏
28.在C++中继承方式有几中(C)
A.1
B.2
C.3
D.4
29.派生类的对象对它的基类成员中(A)是可以访问的。
A.公有继承的公有成员;
C.公有继承的保护成员;
B.公有继承的私有成员;
D.私有继承的公有成员。
30.类中定义的成员默认为(B)访问属性。
A.PublicB.private
C.protectedD.friend
31.下列存储类标识符中,要求通过函数来实现一种不太复杂的功能,并且要求加快执行速
度,选用(A)合适。
A.内联函数;
B.重载函数;
C.递归调用;D.嵌套调用。
32.C++对C语言作了很多改进,下列描述中(D)使得C语言发生了质变,从面向过程变成了面向对象。
A.增加了一些新的运算符;
C.规定函数说明必须用原型;
B.允许函数重载,并允许设置缺省参数;
D.引进了类和对象的概念;
33、下列各种函数中,(C)不是类的成员函数。
A构造函数B析构函数
C友元函数
D拷贝构造函数
34、通常,拷贝构造函数的参数是(C)
A.某个对象名
B.某个对象的成员名
D.某个对象的指针名
C.某个对象的引用名
35.下面对静态数据成员的描述中,正确的是(C)
A类的不同对象有不同的静态数据成员值
B类的每个对象都有自己的静态数据成员
C静态数据成员是类的所有对象共享的数据
D静态数据成员不能通过类的对象调用
36.假定AB为一个类,则执行ABx;语句时将自动调用该类的(B)
A.有参构造函数B.无参构造函数C.拷贝构造函数D.赋值构造函数
37关于成员函数特征的下列描述中,(A)是错误的。
A、成员函数一定是内联函数;
B、成员函数可以重载;
C、成员函数可以设置缺省参数值;D、成员函数可以是静态的;
38、在公有继承的情况下,基类成员在派生类中的访问权限(B)。
A、受限制
B、保持不变
C、受保护
D、不受保护
39、派生类的对象对它的基类成员中(A)是可以访问的。
A、公有继承的公有成员;B、公有继承的私有成员;
C、公有继承的保护成员;D、私有继承的公有成员;
40、在C++中,关于下列设置缺省参数值的描述中,(B)是正确的。
A、不允许设置缺省参数值;
B、在指定了缺省值的参数右边,不能出现没有指定缺省值的参数;
C、只能在函数的定义性声明中指定参数的缺省值;
D、设置缺省参数值时,必须全部都设置;
11关于友元类的描述中,错误的是(C)
A.友元类中的成员函数都是友元函数
B.友元类被说明在一个类中,它与访问权限无关
C.友元类是被定义在某个类中的嵌套类
D.如果Y是类X的友元,则类X不一定是类Y的友元
12友元在访问类的对象的成员时(D)。
A)直接使用类的成员名 B)使用this指针指向成员名
C)使用“类名:
:
成员名”的形式 D)使用“对象名.成员名”的形式
13如果类A被说明成类B的友元,则(D)。
A.类A的成员即类B的成员
B.类B的成员即类A的成员
C.类A的成员函数不得访问类B的成员
D.类B不一定是类A的友元
14下列各类函数中,(C)不是类的成员函数。
A.构造函数 B.析构函数 C.友元函数 D.拷贝初始化构造函数
15类A是类B的友元,类B是类C的友元,则(D)。
A.类B是类A的友元 B.类C是类A的友元C.类A是类C的友元 D.以上都不对
16.下列运算符中,(A)不能在C++中重载
A.?
:
B.[]C.newD.&&
17.下列运算符不能用友元函数重载的是(C)
A.+B.-C.*D.<<
18.关于运算符重载的下列描述中正确的是(B)
A.可改变优先级B.需保持原有的结合性
C.可改变操作数的个数D.可改变语法结构
19.为了满足运算符+的可交换性,必须将其重载为(D)
A.成员函数B.静态成员函数C.虚函数D.友元函数
20下列对派生类的描述中,(C)是错误的。
A.一个派生类可以作为另一个派生类的基类
B.派生类至少应有一个基类
C.基类中成员的访问权限被派生类继承后都不改变
D.派生类的成员除了自己定义的成员外,还包含了它的基类成员
二.判断正误
(1)函数参数个数和类型都相同,只是返回值类型不同,这不是重载函数。
(×)
(2)虚函数是为实现某种功能而假设的函数,派生类的虚函数定义影响其基类,而基类的虚函数定义不影响其派生类。
(×)
(3)可以在类的内部说明虚函数,这时就可以定义一个虚的内联函数。
(√)
(4)空的虚函数与纯虚函数都没有函数体,因此空的虚函数与纯虚函数在概念上是一样的,只是叫法不一样。
(×)
(5)只要基类的析构函数被说明为虚函数,则派生类的析构函数,无论是否使用virtual进行说明,都自动地成为虚构函数。
(√)
(6)虚函数是一种virtual说明的成员函数。
(√)
(7)抽象类中只能有一个纯虚函数。
(×)
(8)析构函数不能说明为虚函数。
(×)
(9)程序中可以说明抽象类的指针或引用,但是不能说明抽象类的对象。
(√)
三.填空题
1、在C++中,对于构造函数和析构函数来说,构造函数__是可以重载的,而析构函数是不可以重载的。
2、声明友元的关键字是___friend____。
3、派生类对基类的继承有三种方式:
_private______、__public_____和_protected______。
4、要想访问基类的private成员变量,只能通过基类提供的公有_函数__进行间接访问。
5、C++语言支持的两种多态性分别是编译时的多态性和_运行时__的多态性。
6、类的每一个成员函数(静态成员函数除外)都有一个隐含的参数,叫做_______。
假设类名为A,则该参数的类型为_______。
7、类的成员分为__数据成员__和_成员函数_。
8、如果一个类中有一个或多个纯虚函数,则这个类称为虚基类_。
9、静态数据成员在定义或说明时,前面要加上关键字_static___。
10、如果成员函数不需要访问类的_非静态_成员,则可以把它声明为静态成员函数。
11、面向对象程序设计的3大机制为:
_封装性_、_继承性_和多态性_。
12、30、如果类A继承了类B,则类A称为_派生类___,类B称为_基类___。
13、在类定义中,将=0置于虚函数的函数原型的末尾可以声明该函数为纯虚函数。
14、类的静态成员分为静态数据成员和静态成员函数。
15、面向对象程序设计的继承机制提供了重复利用程序资源的一种途径。
16、虚函数实现了C++的多态机制,类实现了C++的封装机制。
17、类中运算符重载一般采用两种形式:
_成员函数_和友元函数_
18、虚函数实现了C++的多态机制,类实现了C++的封装机制。
19、C++语言的头文件与源程序文件扩展名分别是(.h)和(.cpp)
20、类继承中,缺省的继承方式是(私有继承)
21、异常是通过检查__________,抛出(throw)和______来实现的。
22、类中运算符重载函数一般采用两种形式:
成员函数和________。
23、如果类A继承了类B,则类A称为派生类,类B称为_________。
24、C++标准输入流对象名为__________。
25、面向对象程序设计的3大机制为:
__________、_______和多态性。
四、写出程序运行结果
1.#include
classSample
{
public:
Sample();
Sample(int);
~Sample();
voiddisplay();
protected:
intx;
};
Sample:
:
Sample()
{
x=0;
cout<<"constructingnormally\n";
}
Sample:
:
Sample(intm)
{
x=m;
cout<<"constructingwithanumber:
"<}
voidSample:
:
display()
{
cout<<"displayanumber:
"<}
Sample:
:
~Sample()
{
cout<<"destructing\n";
}
voidmain()
{
Sampleobj1;//调用无参构造函数
Sampleobj2(20);//调用有一个参数的构造函数
obj1.display();//调用成员函数
obj2.display();
}//程序结束前调用析构函数
参考答案:
constructingnormally
constructingwithanumber:
20
displayanumber:
0
displayanumber:
20
destructing
destructing
2.#include
classMyClass{
public:
intnumber;
voidset(inti);
};
intnumber=3;
voidMyClass:
:
set(inti)
{
number=i;
}
voidmain()
{
MyClassmy1;//调用默认构造函数
intnumber=10;//定义普通局部变量
my1.set(5);//调用成员函数,给成员变量赋值
cout<my1.set(number);
cout<my1.set(:
:
number);//:
:
numer表示全局变量
cout<}
参考答案:
5
10
3
3.#include
#include
classstudentid{
public:
studentid(intid=0){
value=id;
cout<<”Assigningstudentid”<}
~studentid(){
cout<<”destructingid”<}
protected:
intvalue;
};
classstudent
{
public:
student(char*pname=”noname”,intssid=0):
id(ssid)
{
cout<<”constructingstudent”<strcpy(name,pname);
name[sizeof(name)-1]=’\0’;
}
~student()
{
cout<<”destructingstudent”<}
protected:
charname[20];
studentidid;
};
voidmain(){
students(“randy”,9818);
}
参考答案:
Assigningstudentid9818
constructingstudentrandy
destructingstudent
destructingid9818
4.#include
classR
{
public:
R(intr1,intr2){R1=r1;R2=r2;}
voidprint();
voidprint()const;
private:
intR1,R2;
};
voidR:
:
print()
{
cout<"<}
voidR:
:
print()const
{
cout<}
voidmain(){
Ra(5,4);
a.print();
constRb(20,52);
b.print();
}
参考答案:
5:
4
20;52
(5)#include
#include
classbase
{
char*p;
public:
base(intsz,char*bptr)
{
p=newchar[sz];
strcpy(p,bptr);
cout<<"constructorbase"<}
virtual~base()
{
delete[]p;
cout<<"destructorbase\n";
}
};
classderive:
publicbase
{
char*pp;
public:
derive(intsz1,intsz2,char*bp,char*dptr):
base(sz1,bp)
{pp=newchar[sz2];
strcpy(pp,dptr);
cout<<"constructorderive"<}
~derive()
{
delete[]pp;
cout<<"destructorderive\n";
}
};
voidmain()
{
base*px=newderive(5,7,"base","derive");
deletepx;
}
参考答案:
constructorbase
constructorderive
destructorderive
destructorbase
1、编一个程序,用重载函数实现针对若干个数据输出最小值。
要求包括2个同名函数,分别实现:
①对2个实数。
②对2个字符串。
2、编写一个car类,要求内含有:
私有数据成员轮胎数wheels,定义构造函数,定义返回轮胎数成员函数、定义输出欢迎信息函数等至少3个以上的成员函数。
ClassCar//定义类Car
{public:
voidmsg();//显示欢迎信息
intget_wheels();//返回汽车的车轮数量
voidset_wheels(int);//设置汽车的车轮数量
private:
intwheels;//汽车的车轮数量};
VoidCar:
:
welcomemsg()
{cout<<"Welcometothecarworld!
\n";}
VoidCar:
:
set_wheels(intn)
{wheels=n;}
IntCar:
:
get_wheels()
{returnwheels;}
解析:
其中,成员函数msg()显示一条欢迎信息“Welcometothecarworld!
”。
成员函数get_wheels()返回Car类的私有数据成员wheels。
成员函数set_wheels(int)用指定的形参初始化数据成员wheels。
3、声明一个哺乳动物Mammal类,再由此派生出狗Dog类,二者都定义Speak()成员函数,基类中定义为虚函数。
声明一个Dog类的对象,调用Speak()函数,观察运行结果。
4、分别用成员函数和友元函数重载运算符,使对实型的运算符+、-、*、/适用于复数运算,使<<运算符适用于复数输出a+bi形式。
#include
Usingnamespacestd;
ClassComplex
{private:
Doublereal;
Doubleimag;
public:
Complex(doubler=0,doublei=0)
{real=r;imag=i;}
Friendostream&operator<<(ostream&,Complex&);
Complexoperator+(Complex&c2);
Complexoperator-(Complex&c2);
};
Ostream&operator<<(ostream&output,Complex&c)
{output<if(c.imag>=0)
output<<"+";
output<ComplexComplex:
:
operator+(Complex&c2)
{Complexc;
c.real=real+c2.real;
c.imag=imag+c2.imag;
returnc;}
5、声明一个Shape抽象类,在此基础上派生出Rectangle和Circle类,二者都有GetArea()函数计算对象的面积,GetPerim()函数计算对象的周长。