复习题
一、选择填空
1.在下列关键字中,用来说明类中公有成员的是( )。
A. Public B. Private C. protected D. friend 答:A。
2.下列的各种函数中,( )不是类的成员函数。
A.构造函数 B.析构函数 C.友元函数 D.拷贝初始化构造函数答:C。
3.作用域运算符的功能是( )。
A.标识作用域的级别的
B.指出作用域的范围的
C.给定作用域的大小的
D.标识某个成员是属于哪个类的
答:D。
4.( )是不可以作为该类的成员的。
A.自身类对象的指针
B.自身类的对象
C.自身类对象的引用
D.另一个类的对象
答:B。
5.( )不是构造函数的特征。
A.构造函数的函数名与类名相同
B.构造函数可以重载
C.构造函数可以设置默认参数
D.构造函数必须指定类型说明
答:D。
6.( )是析构函数的特征。
A.一个类中只能定义一个析构函数
B.析构函数名与类名不同
C.析构函数的定义只能在类体内
D.析构函数可以有一个或多个参数
答:A。
7.通常的拷贝初始化构造函数的参数是( )。
A.某个对象名
B.某个对象的成员名
C.某个对象的引用名
D.某个对象的指针名
答:C。
8.关于成员函数特征的下述描述中,( )是错误的。
A.成员函数一定是内联函数
B.成员函数可以重载
C.成员函数可以设置参数的默认值
D.成员函数可以是静态的
答:A。
9.下述静态数据成员的特性中,( )是错误的。
A.说明静态数据成员时前边要加修饰符static
B.静态数据成员要在类体外进行初始化
c.引用静态数据成员时,要在静态数据成员名前加<类名>和作用域运算
符
D.静态数据成员不是所有对象所共用的
答:D。
l0.友元的作用( )。
A.提高程序的运用效率
B.加强类的封装性
C.实现数据的隐藏性
D.增加成员函数的种类
答:A。
11.下列关于对象数组的描述中,( )是错误的。
A.对象数组的下标是从0开始的
B.对象数组的数组名是一个常量指针
C.对象数组的每个元素是同一个类的对象
D.对象数组只能赋初值,而不能被赋值
答案:D。
12.下列定义中,( )是定义指向数组的指针P。
A. int*p[5];
B. int(*p)[5];
C. (int *)p[5]
D. int*p[];
答案:B。
13.下列说明中
Const char * Ptr;
ptr应该是( )。
A.指向字符常量的指针
B.指向字符的常量指针
C.指向字符串常量的指针
D.指向字符串的常量指针
答案:C。
14.已知:print( )函数是一个类的常成员函数,它无返回值,下列表示中是正确的。
A. void print()const ;
B. const void Print( );
C. void const print( );
D. void print (const);
答案:A。
15.关于new运算符的下列描述中,( )是错的。
A.它可以用来动态创建对象和对象数组
B.使用它创建的对象或对象数组,可以使用运算符delete删除
C.使用它创建对象时要调用构造函数
D.使用它创建对象数组时必须指定初始值
答案:D。
16.关于delete运算符的下列描述中,( )是错的。
A.它必须用于new返回的指针
B.它也适用于空指针
C.对一个指针可以使用多次该运算符
D.指针名前只用一对方括号符,不管所删除数组的维数
答案:C。
17.具有转换函数功能的构造函数,应该是( )。
A.不带参数的构造函数
B.带有一个参数的构造函数
C.带有两个以上参数的构造函数
D.默认构造函数
答案:B。
18.下列对派生类的描述中,( )是错的。
A.一个派生类可以作为另一个派生类的基类
B.派生类至少有一个基类
C.派生类的成员除了它自己的成员外,还包含了它的基类的成员
D.派生类中继承的基类成员的访问权限到派生类保持不变
答:D。
19.派生类的对象对它的基类中( )是可以访问的。
A.公有继承的公有成员
B.公有继承的私有成员
C.公有继承的保护成员
n私有继承的公有成员
答:A。
20.对基类和派生类的关系描述中,( )是错的。
A.派生类是基类的具体化
B.派生类是基类的子集
C.派生类是基类定义的延续
D.派生类是基类的组合
答:B。
21.派生类的构造函数的成员初始值表中,不能包含( )。
A.基类的构造函数
B.派生类中子对象的初始化
C.基类的子对象初始化
D.派生类中一般数据成员的初始化
答:C。
22.关于子类型的描述中,( )是错的。
A.子类型就是指派生类是基类的子类型
B.一种类型当它至少提供了另一种类型的行为,则这种类型是另一种类型的子
类型
C.在公有继承下,派生类是基类的子类型
D.子类型关系是不可逆的
答:A。
23.关于多继承二义性的描述中,( )是错的。
A.一个派生类的两个基类中都有某个同名成员,在派生类中对这个成员的访问可能出现二义性
B.解决二义性的最常用的方法是对成员名的限定法
C.基类和派生类中同时出现的同名函数,也存在二义性问题
D.一个派生类是从两个基类派生来的,而这两个基类又有一个共同的基类,对该基类成员进行访问时,也可能出现二义性
答:C。
24.设置虚基类的目的是( )。
A.简化程序
B.消除二义性
C.提高运行效率
D.减少目标代码
答:B。
25.带有虚基类的多层派生类构造函数的成员初始化列表中都要列出虚基类的构造
函数,这样将对虚基类的子对象初始化( )。
A.与虚基类下面的派生类个数有关
B.多次
C.二次
D.一次
答:D。
26.对定义重载函数的下列要求中。( )是错误的
A.要求参数的个数不同
B.要求参数中至少有一个类型不同
C.要求参数个数相同时,参数类型不同
D.要求函数的返回值不同
答:D
27.下列函数中,( ) 不能重载。
A.成员函数
B.非成员函数
C.析构函数
D.构造函数
答:C。
28.下列对重载函数的描述中,( )是错误的。
A.重载函数中不允许使用默认参数
B.重载函数中编译系根据参数表进行选择
C.不要使用重载函数来描述毫无相干的函数
D.构造函数重载将会给初始化带来多种方式
答:A。
29.下列运算符中,( )运算符不能重载。
A. && B. [] C. :: D. new
答:C。
30.下列关于运算符重载的描述中,( )是正确的。
A.运算符重载可以改变操作数的个数
B.运算符重载可以改变优先级
C.运算符重载可以改变结合性
D.运算符重载不可以改变语法结构。
答:D。
31.运算符重载函数是( )。
A.成员函数
B.友元函数
C.内联函数
D.带默认参数的函数
答:A,B。
32.关于动态联编的下列描述中,( )是错误的。
A.动态联编是以虚函数为基础的
B.动态联编是在运行时确定所调用的函数代码的
C.动态联编调用函数操作是用指向对象的指针或对象引用
D.动态联编是在编译时确定操作函数的
答:D。
33.关于虚函数的描述中,( )是正确的。
A.虚函数是一个static类型的成员函数
B.虚函数是一个非成员函数
C.基类中说明了虚函数后,派生类中将其对应的函数可不必说明为虚函数
D.派生类的虚函数与基类的虚函数具有不同的参数个数和类型
答:C
34.关于纯虚函数和抽象类的描述中,( )是错误的。
A.纯虚函数是一种特殊的虚函数,它没有具体的实现
B.抽象类是指具有纯虚函数的类
C.一个基类中说明有纯虚函数,该基类的派生类一定不再是抽象类
D.抽象类只能作为基类来使用,其纯虚函数的实现由派生类给出答:C。
35.下列描述中,( )是抽象类的特性。
A.可以说明虚函数
B.可以进行构造函数重载
C.可以定义友元函数
D.不能说明其对象
答:D。
36.进行文件操作时需要包含( )文件。
A:iostream.h B.fstream.h C. stdio.h D.stdlib.h 答: B。
37.使用操作子对数据进行格式输出时,应包含( )文件。
A. iostream.h B. fstream.h C。 iomanip.h D. stdlib.h 答:C。
38.已知:int a,*pa=&a;输出指针pa十进制的地址值的方法是( )。 A. cout<<pa B. cout<<*pa
C.cout<<&pa D.cout<<long(&pa)
答:D。
39.下列输出字符’A’的方法中,( )是错误的。
A.cout<<put(‘A’) B.cout<<’A’
C. cout.put(‘A’) D. char A=’A’;cout<<A 答:A。
40.关于getline()函数的下列描述中,( )是错的。
A.该函数是用来从键盘上读取字符串的
B.该函数读取的字符串长度是受限制的
C.该函数读取字符串时遇到终止符便停止
D.该函数中所使用的终止符只能是换行符
答:D。
41.关于read()函数的下列描述中,( )是对的。
A.该函数只能从键盘输人中获取字符串
B.该函数所获取的字符多少是不受限制的
C.该函数只能用于文本文件的操作中
D.该函数只能按规定读取所指定的字符数
答:B。
42.在ios中提供控制格式的标志位中,( )是转换为十六进制形式的标志位。
A. hex B. oct C. dcc D。1eft
答:A。
43.控制格式输出输入的操作子中,( )是设置域宽的。
A.ws B.oct C.setfill() D,setw()
答:D。
44.磁盘文件操作中,打开磁盘文件的访问方式常量中,( )是以追加方式打开文件的。
A. in B. out C. app D. ate
答:C。
45.下列函数中,( )是对文件进行写操作的。
A.get() B.read() C.seekg() D.put()
答:D。
二、判断下列描述的正确性,对者划√,错者划×
√1.使用关键字class定义的类中默认的访问权限是私有(private)的
×2.作用域运算符(::)只能用来限定成员函数所属的类。局部变量与全局变量同名时调用局部变量
×3.析构函数是一种函数体为空的成员函数。
×4.构造函数和析构函数都不能重载。
√5.说明或定义对象时,类名前面不需要加class关键字。
√6.对象成员的表示与结构变量成员表示相同,使用运算符.或一>。
×7.所谓私有成员是指只有类中所提供的成员函数才能直接使用它们,任何
类外的函数对它们的访问都是非法的。
√8.某类中的友元类的所有成员函数可以存取或修改该类中的私有成员。
×9.可以在类的构造函数中对静态数据成员进行初始化。
√10.如果一个成员函数只存取一个类的静态数据成员,则可将该成员函数说明为
静态成员函数。
√11.C++语言中,既允许单继承,又允许多继承。
×12.派生类是从基类派生出来,它不能再生成新的派生类。
×13.派生类的继承方式有两种:公有继承和私有继承。
×14.在公有继承中,基类中的公有成员和私有成员在派生类中都是可见的。. √15.在公有继承中,基类中只有公有成员对派生类对象是可见的。
×16.在私有继承中,基类中只有公有成员对派生类是可见的。
√17.在私有继承中,基类中所有成员对派生类的对象都是不可见的。
√18.在保护继承中,对于垂直访问同于公有继承,而对于水平访问同于私有继承。
×19.函数的参数个数和类型都相同,只是返回值不同,这也是重载函数。
×20.构造函数可以被继承。
√21.析构函数不能被继承。
√22.子类型是不可逆的。
×23.只要是类M继承了类N,就可以说类M是类N的子类型。
√24.如果A类型是B类型的子类型,则A类型必然适应于B类型。
√25.多继承情况下,派生类的构造函数的执行顺序取决于定义派生类时所指定的
各基类的顺序。
×26.单继承情况下,派生类中对基类成员的访问也会出现二义性。
√27.解决多继承情况下出现的二义性的方法之一是使用成员名限定法。
√28.虚基类是用来解决多继承中公共基类在派生类中只产生一个基类子对象的
问题。
√29.函数的参数个数和类型都相同,只是返回值不同,这不是重载函数。
×30. 使用关键字class定义的类中默认的访问权限是公有(public)的。
×31.对象数组的元素可以是不同类的对象。
√32.重载函数可以带有默认值参数,但是要注意二义性。
√33.多数运算符可以重载,个别运算符不能重载,运算符重载是通过函数完成的。
×34.对每个可重载的运算符来讲,它既可以重载为友元函数,又可以重载为成员函数,还可以重载为非成员函数。
√35.对单目运算符重载为友元函数时,说明一个形参;重载为成员函数时,不能显式说明形参。
√36.重载运算符保持原运算符的优先级和结合性不变。
√37.虚函数是用virtual关键字说明的成员函数。
√38.构造函数说明为纯虚函数是没有意义的。
×39.抽象类是指一些没有说明对象的类。
√40.动态联编是在运行时选定调用的成员函数的。
√41.使用提取符(<<)可以输出各种基本数据类型的变量的值,也可以输出指针值。
×42.C++中可以将类外的普通函数声明为虚函数。(类的成员函数)
√43. 在类外部定义的构造函数,其函数名前要加上“类名∷”,这和成员函数定义方法一样。
×44.记录流的当前格式化状态的标志字中每一位用于记录一种格式,这种格式是不能被设置或清除的。
√45.设置和清除格式标志字的成员函数需要通过对象来引用它们,输出显示格式的对象通常是cout。
√46.操作子本身是一个对象,它可以直接被提取符或插入符操作。
√47.get()函数不能从流中提取终止字符,终止字符仍留在流中。getline()函数可以从流中提取终止字符,但终止字被丢弃。
√48 只要一个类定义了一个构造函数(不一定是无参构造函数),C + +就不再提供默认的构造函数。
√49. 析构函数是在撤消对象时由系统自动调用的。
√50.对于用new运算符动态生成的对象,在产生对象时调用构造函数,只有使用delete运算符来释放对象时,才调用析构函数。
√51.由于虚函数的作用为允许在派生类中对基类的虚函数重新定义,所以只能用virtual声明类的成员函数,使之成为虚函数,
√52. 不用来定义对象只作为一种基本类型用作继承的类,称为抽象类。
√53. 运算符重载有两种形式:一种是成员函数形式,另一种是友元函数形式。
√54.C++语言中,既允许单继承,又允许多继承。
√55.使用提取符(<<)可以输出各种基本数据类型的变量的值,也可以输出指针值。
√56.用static定义的局部对象,在首次到达对象的定义时调用构造函数;到程序结束时,调用析构
√57.使用打开文件函数open()之前,需要定义一个流类对象,使用open()函数来操作该对象。
√58.使用关闭文件函数close()关闭一个文件时,但流对象仍存在。
√59.预定义的提取符和插入符是可以重载的。
×60.打开ASCII码流文件和二进制流文件时,打开方式是相同的。
√61.read()和write()函数可以读写文本文件,也可以读写二进制文件。
√62.流的状态包含流的内容、长度和下一次提取或插入操作的当前位置。
×64.seekg()函数和seekp()函数分别用来定位读指针和写指针的。如果使用 seek()函数可以同时定义读写指针。
三、分析下列程序写出输出结果。
1.
#include<iostream.h>
class A
{
public:
A();
A(int i,int j);
void print( );
private:
int a,b;
};
A::A( )
{
a=b=0;
cout<<”default constructor called.\n”;
}
A::A(int i,int j)
{
a=i;
b=j;
cout<<”Constructor called.\n”;
}
void A::print()
{
cout<<”a=”<<a<<”,b=”<<b<<endl; }
void main( )
{
A m,n(4,8);
m.print();
n.print();
}
答案: default constructor called.
Constructor called.
a=0,b=0
a=4,b=8
2.
#include<iostream.h>
class B
{
Public:
B(){}
B(int i,int j);
void printb();
private:
int a,b;
};
class A
{
public:
A(){}
A(int i,int j);
void printa( );
private:
B c;
};
A::A(int i.Int j):c(i,j)
{}
void A::printa( )
{
c.printb( );
}
B::B(int i,int)
{
a=i;
b=j;
}
void B::printb()
cout<<”a=”<<a<<”,b=”<<b<<end1;
}
Void main()
{
A m(7,9);
m.Printa();
}
答:a=7,b=9
3、
#include
using namespace std;
class Box
{public:
Box(int h=10,int w=12,int len=15) : height(h),width(w),length(len){ } int volume();
private:
int height;
int width;
int length;
};
int Box::volume()
{return(height*width*length);
}
Int main()
{Box a [3]={Box(10,12,15),Box(15,18,20),Box(16,20,26) }; cout<<"volume of a[0] is "< cout<<"volume of a[1] is "<