C++程序设计练习题
一、填空题
1.对象的三大基本特性分别为多态性、( )、封装性。 2.赋值运算符应重载为( )函数。 3.用( )声明的基类称为虚基类。 4.用( )声明的函数称为虚函数。
5.派生类对基类继承控制访问有三种。派生类可以定义其基类中不具备的( )。 6.静态成员是对象的成员,( )函数不是类的成员。
7.在函数体之前加( )关键字可以防止覆盖函数改变数据成员的值。 8.一个const对象只能访问( )成员函数。
9.使用友元函数是为了提高程序效率,且节约了( )开销。 10.类名为“ClassName”的类,其拷贝构造函数的原型说明是( )。
11.由关键字private、public和protected限定成员的访问权限分别是( )、( )和( )。缺省关键字时成员的访问权限为( )。
12.如果想要公共基类在派生类中只有一个拷贝,就要将公共的基类说明为( );如果虚基类没有默认构造函数,就必须在每一个派生类的构造函数中都要调用虚基类的( )函数。
13.静态成员函数是使用关键字( )说明的成员函数。
14.一个函数的原型声明为“void FunName(int=0, double=0, char='x');”,则调用FunName函数的方法共有( )种。
15.编译时多态性是通过( )实现的;运行时多态性是通过( )实现的。 16.C++通过( )实现编译时多态性,通过( )实现运行时多态性。 17.在C++中,声明类的关键字是( )。 18.声明C++模板的关键字是( )。
19.调用函数原型声明为“void FunName(short, int=0, float=;”的方法有( )种。 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.若要把void myfun( )定义为类A的友元函数,则应在类A的声明中加入语句( )。 40.类的静态成员分为( )和( )。
41.运算符重载要求保持其原来的操作数个数、( )、( )和语法结构。 42.通过关键字( )可以声明模板,通过关键字( )指定函数模板的类型参数。 43.请列出C++中两种用户自定义的数据类型:( )、( )。 44.构造函数的作用是( )。
45.后置自增运算符“++”重载为类的成员函数(设类名为ClassName)的形式为( )。
二、单选题
1.继承机制的作用是( ) A) 信息隐藏
B) 数据封装
C) 定义新类
D) 数据抽象
D) 删除对象创建的所有对象 D) 不自动调用
2.类的析构函数的作用是( ) A) 一般成员函数 A) 类创建时
B) 类的初始化 B) 创建对象时
C) 对象的初始化 C) 删除对象时
3.类的析构函数是在( )调用的。
4.在( )情况下适宜采用inline定义内联函数。 A) 函数体含有循环语句 C) 函数代码少、频繁调用
B) 函数体含有递归语句 D) 函数代码多、不常调用 B) 类B的成员即类A的成员
5.如果类A被说明成类B的友元,则( ) A) 类A的成员即类B的成员
C) 类A的成员函数不得访问类B的成员 D) 类B不一定是类A的友元 6.在类中声明转换函数时不能指定( ) A) 参数
B) 访问权限 B) 保持不变 B) 构造函数
C) 操作
D) 标识符 D) 不受保护 D) 静态成员函数 D) 赋值构造函数 D) 抽象类
7.在公有继承的情况下,基类成员在派生类中的访问权限( ) A) 受限制 A) 转换函数
C) 受保护 C) 虚函数
8.在C++类体系中,不能被派生类继承的有( )
9.假定ClassN为一个类,则执行“ClassN x;”语句时将自动调用该类的( ) A) 有参构造函数 A) 类的嵌套 为( )。
A) -- ( ) B) operator -- (obj)
C) obj::operator -- ( ) D) obj:operator -- ( )
B) 一个类可以有多个构造函数
12.以下有四种关于类的说法,其中不正确的是( )。 A) 构造函数可以指定参数,但不能指定函数类型
C) 析构函数不可以指定参数,但可以指定函数类型 D) 一个类只能有一个析构函数 13.面向对象程序设计讲求封装性,在C++中封装是借助于( )实现的。 A) 结构
B) 数组
C) 类
D) 函数
B) 析构函数不可以指定函数类型,但可以指定函数参数
14.下面有四种关于类的说法,其中不正确的是( )。 A) 一个类可以有多个构造函数
B) 无参构造函数 B) 类的继承
C) 拷贝构造函数 C) 虚函数
10.C++语言建立类族是通过( )
11.重载一元运算符--为类A的成员运算符,若有类A的对象obj,则表达式--obj被C++编译器解释
C) 一个类只能有一个析构函数 D) 在一个类中可以说明其它类的对象
B) 基类的保护成员在派生类中仍然是保护的 D) 基类的私有成员在派生类中是不可访问的
15.下列有关基类的叙述中不正确的是( ),前提为“公有派生”。 A) 基类的公有成员在派生类中仍然是公有的 C) 基类的私有成员在派生类中仍然是私有的
16.以下有四种关于友元的描述,其中错误的是( )。
A) 类A的友元类B的成员函数都是类A的友元函数 B) 友元函数可以访问该类的私有数据成员 C) 类与类之间的友元关系可以继承 A) 函数
B) 数组
C) 结构
D) 友元可以提高程序的运行效率
17.C++的封装性是借助于( )实现的。
D) 类
B) friend ClassN operator -- D) friend ClassN operator -- ( );
18.要将--重载为类ClassN的后置友元运算符,那么,要在类中添加的原型说明为( )。 A) friend ClassN operator -- (ClassN &, int); (ClassN &);
C) friend ClassN operator -- (int); A) 派生类的对象可以赋给基类的对象 C) 派生类的对象可以初始化基类的引用
D) 当基类的指针指向派生类对象时,通过该指针可以直接访问派生类中的成员 20.以下关于继承成员的访问属性的叙述中,不正确的是( )。 A) 基类的保护成员在私有派生类中是私有的 C) 基类的保护成员在保护派生类中是保护的
B) 对基类成员的访问必须没有二义性 D) 基类的保护成员在派生类中是保护的
19.在公有派生时,下列描述中不正确的是( )。
B) 派生类对象的地址可以赋给指向基类的指针
三、程序改错题(改正下列类中的错误)
1.
class ClassN { private: } 2. void main() {
char c[] = new char [20]; delete c; } 3.
class MyClass { private: }; 4.
int nmember;
ClassN pmember; int ClassN(int x);
public: ClassN( );
int n=1;
MyClass pO;
void ~MyClass(int a);
public: MyClass(int a = 0);