计算机系《面向对象程序设计C++》期末考试试卷(B卷) 一、填空题
1.在说明引用时用const修饰的引用为 常引用,它所引用的对象不允许更改。 2.信息隐藏是指将对象的 数据和操作 隐藏起来的技术。 3.运行时多态性主要是通过 虚函数 来实现的。
4.类的对象成员的构造函数的调用次序取决于这些对象成员 在类中声明 的次序,与它们在初始化列表中出现的次序无关。
5.拷贝构造函数是一种特殊的构造函数,其形参是本类对象的引用;其作用是使用一个已经存在的对象去初始化另一个同类的对象。
6.在C++中,可以通过在运算符函数参数表中是否插入关键字int来区分前缀和后缀这两种方式。 7.构造函数 是一种特殊的成员函数,它主要用来为对象分配内存空间,对类的数据成员进行初始化并执行对象的其他内部管理操作。
8.如果在一个类中说明了常数据成员,那么构造函数就只能通过成员初始化列表对该数据成员进行初始化, 任何其他函数都不能对该成员赋值。
9.联编是指将函数调用与相应函数体代码彼此关联的过程。若此过程在程序开始运行前的编译时完成,则称之为 静态 联编。
10.一个非成员函数必须声明为一个类的 friend 才有可能存取该类的私有数据成员。 二、判断题
1.如果类中含有指针类型的数据,深拷贝就会产生错误。 (╳) 2. 类模板不是代表一个具体的、实际的类, 而是代表着一类类。 (√) 3. 常常用将类的下标运算符 [ ] 重载为友元函数。 (╳) 4. 类类型转换函数既没有参数, 也不显式给出返回类型。 (√) 5. 动态联编在程序运行阶段完成的联编。 (√) 6. 编译时多态性主要是通过函数重载和运算符重载实现的。 (√) 7. C++中的类属关系运算符“.”也可以重载。 (╳) 8. 构造函数的名字必须与类名相同,其返回类型缺省为void类型。 (╳) 9. 允许将一个声明为指向派生类对象的指针指向其基类的一个对象。 (╳) 10. 常对象只能调用它的常成员函数, 而不能调用普通的成员函数。 (√) 三、选择题:
1.有关运算符重载正确的是( D )
A) C++语言允许在重载运算符时改变运算符的操作个数 B) C++语言允许在重载运算符时改变运算符的优先级 C) C++语言允许在重载运算符时改变运算符的结合性 D) C++语言允许在重载运算符时改变运算符的原来的功能 2. 类的析构函数的作用是( D ) A)一般成员函数 B)类的初始化 C)对象的初始化 D)删除类创建的所有对象 3. 什么样的成员函数不能修改数据成员?( C )
A) 私有成员函数 B)公有成员函数 C)常量成员函数 D)所有成员函数 4. 可以被对象之外访问的成员是( B )
A) 私有成员函数 B) 公有成员函数 C) 常量成员函数 D) 所有成员函数 5. 类的实例化是指( A )
1
A) 创建类对象 B) 定义类 C)调用类的成员 D)指明具体的类 6. 要实现动态联编,派生类中的虚函数( D )
A) 返回的类型可以与虚函数的原型不同 B) 参数个数可以与虚函数的原型不同 C) 参数类型可以与虚函数的原型不同 D) 以上都不对
7. 类的构造函数是在什么时间被自动调用的?( B ) A)类创建时 B)创建对象时 C)删除对象时 D)不自动调用 8. 多重继承是( B )。
A) 多个单一继承的叠加 B) 导出类有多个直接基类 C) 多个导出类有唯一的基类
D) 每个导出类最多只有一个直接基类,但它可以有多个间接基类
9、C++对C语言作了很多改进,下列描述中( D )使得C语言发生了质变,即从面向过程变成了面向对象。
A) 增加了一些新的运算符 B) 允许函数重载,并允许设置默认参数 C) 规定函数说明必须用原型 D) 引进了类和对象的概念 10. 关于虚函数,正确的描述是( A )
A) 构造函数不能是虚函数 B) 析构函数不能是虚函数 C) 虚函数可以是友元函数 D) 虚函数可以是静态成员函数 一、选择题(每小题3分,共48分。)
01、下列关于C++函数的叙述中,正确的是( C )。
A)每个函数至少要具有一个参数 B)每个函数都必须返回一个值 C)函数在被调用之前必须先声明 D)函数不能自己调用自己 02、下列关于类和对象的叙述中,错误的是( A )。
A)一个类只能有一个对象 B)对象是类的具体实例
C)类是对某一类对象的抽象 D)类和对象的关系是一种数据类型与变量的关系 03、在C++中,用于实现运行时多态性的是( D )。
A)内联函数 B)重载函数 C)模板函数 D)虚函数 04、下列关于运算符重载的叙述中,正确的是( B )。
A)通过运算符重载,可以定义新的运算符 B)有的运算符只能作为成员函数重载
C)若重载运算符+,则相应的运算符函数名是+ D)重载二元运算符时,必须声明两个形参 05、对于语句 cout< 06、有如下类声明,则类MyDERIVED中保护的数据成员和成员函数的个数是( B )。 class MyBASE { private: int k; public: void set(int n){ k=n;} int get( )const{ return k;} }; class MyDERIVED: protected MyBASE { protected: int j; public: void set(int m, int n){ MyBASE::set(m); j=n;} 2 int get( ) const { return MyBASE::get( )+j; } }; A)4 B)3 C)2 D)1 07、已知在一个类体中包含如下函数原型: Volume operator-(Volume)const;,下列关于这个函数的叙述中,错误的是( B )。 A)这是运算符-的重载运算符函数 B)这个函数所重载的运算符是一个一元运算符 C)这是一个成员函数 D)这个函数不改变类的任何数据成员的值 08、执行如下的程序段后,输出结果是( A )。 cout.fill('*'); cout.width(6); cout.fill('#'); cout << 123 << endl; A)###123 B)123### C)***123 D)123*** 09、在下列函数原型中,可以作为类AA构造函数的是( D )。 A)void AA(int); B)int AA(); C)AA(int)const; D)AA(int); 10、下面四个选项中,( A )是用来声明虚函数的。 A)virtual B)public C)include D)using namespace 11、实现运行时的多态性要使用( D )。 A)重载函数 B)构造函数 C)析构函数 D)虚函数 12、要实现动态联编,必须通过( A )调用虚函数。 A)对象指针 B)成员名限定 C)对象名 D)派生类名 13、以下( C )成员函数表示纯虚函数。 A)virtual int vf(int); B)void vf(int)=0; C)virtual void vf()=0; D)virtual void vf(int){} 14、有如下类声明:class XA { private: int x; public: XA(int n){ x=n;} }; class XB: public XA { private: int y; public: XB(int a,int b); }; 在构造函数XB的下列定义中,正确的是(B )。 A)XB::XB(int a,int b): x(a),y(b){ } B)XB::XB(int a,int b): XA(a),y(b){ } C)XB::XB(int a,int b): x(a),XB(b){ } D)XB::XB(int a,int b): XA(a),XB(b){ } 15、在表达式 x+y*z中, + 是作为成员函数重载的运算符,* 是作为非成员函数重载的运算符。则 operator+ 有 个参数,operator* 有 参数。(C ) A)2、2 B)2、1 C)1、2 D)1、1 16、应在下列程序划线处填入的正确语句是( C )。 class Base { public: void fun(){cout<<\"Base::fun\"< cout<<\"Derived::fun\"< 3 二、填空题(每空2分,共20分。) 17、面向对象程序设计有四个主要特点,即抽象、封装、_继承、_和___多态性_。 18、非成员函数应声明为类的_友元___函数才能访问这个类的private成员。 19、派生类中的成员不能直接访问基类中的___私有_成员。 20、在用class定义一个类时,数据成员和成员函数的默认访问权限是 private或私有____。 21、运算符重载函数可能是类的_成员_函数,也可以是类的_友元__,还可以是普通函数。 22、用流对象的成员函数控制输出格式时,用于设置字段宽度的流成员函数的名称是__ width/ __,与之作用相同的控制符名称是__ setw __。 23、含有纯虚函数的类称为___抽象类 _。 1、C++是( )。 A. 面向对象的程序设计语言 B. 面向过程的程序设计语言 C. 既支持面向对象的程序设计又支持面向过程的程序设计的混合型语言 D. 非结构化的程序设计语言 2、面向对象程序设计思想的主要特征中不包括( )。 A. 封装性 B. 多态性 C. 继承性 D. 功能分解,逐步求精 3、若定义:string str; 当语句cin>>str; 执行时,从键盘输入: Microsoft Visual Studio 6.0! 所得的结果是str=( )。 A. Microsoft Visual Studio 6.0! B. Microsoft C. Microsoft Visual D. Microsoft Visual Studio 6.0 4、考虑下面的函数原型声明:void testDefaulParam(int a,int b=7,char z='*'); 下面函数调用中,不合法的是( )。 A. testDefaulParam(5); B. testDefaulParam(5,8); C. testDefaulParam(5,'#'); D. testDefaulParam(0,0,'*'); 5、下列语句中,将函数int sum(int x, int y)正确重载的是( )。 A. float sum(int x, int y); B. int sum(int a, int b); C. float sum(float x, float y); D. double sum(int y, int x); 6、下列表示引用的方法中,( )是正确的。 已知:int a=1000; A. int &x=a; B. char &y; C. int &z=1000; D. float &t=&a; 7、在一个函数中,要求通过函数来实现一种不太复杂的功能,并且要求加快执行速度,选用( A. 内联函数 B. 重载函数 C. 递归调用 D. 嵌套调用 8、下列有关C++类的说法中,不正确的是( )。 A. 类是一种用户自定义的数据类型 B. 只有类中的成员函数或类的友元函数才能存取类中的私有成员 C. 在类中,如果不做特别说明,所有成员的访问权限均为私有的 D. 在类中,如果不做特别说明,所有成员的访问权限均为公用的 9、已知X类,则当程序执行到语句:X array[3];时,调用了( )次构造函数。 A. 0 B. 1 C. 2 D. 3 10、下面说法中,正确的是( ) 4 。 )A. 一个类只能定义一个构造函数,但可以定义多个析构函数 B. 一个类只能定义一个析构函数,但可以定义多个构造函数 C. 构造函数与析构函数同名,只要名字前加了一个求反符号(~) D. 构造函数可以指定返回类型,而析构函数不能指定任何返回类型,即使是void类型也不可以 11、已知:print( )函数是一个类的常成员函数,它无返回值,下列表示中,( )是正确的。 A. void print( ) const; B. const void print( ); C. void const print( ); D. void print(const); 12、下面描述中,表达错误的是( ) A. 公用继承时基类中的public成员在派生类中仍是public的 B. 公用继承时基类中的private成员在派生类中仍是private的 C. 公用继承时基类中的protected成员在派生类中仍是protected的 D. 私有继承时基类中的public成员在派生类中是private的 13、设置虚基类的目的是( )。 A. 简化程序 B. 消除二义性 C. 提高运行效率 D. 减少目标代码 14、下面( )的叙述不符合赋值兼容规则。 A. 派生类的对象可以赋值给基类的对象 B. 基类的对象可以赋值给派生类的对象 C. 派生类的对象可以初始化基类的对象 D. 派生类的对象的地址可以赋值给指向基类的指针 15、关于虚函数的描述中,( )是正确的。 A. 虚函数是一个static类型的成员函数 B. 虚函数是一个非成员函数 C. 基类中说明了虚函数后,派生类中与其对应的函数可不必说明为虚函数 D. 派生类的虚函数与基类的虚函数具有不同的参数个数和类型 16、下面关于友元的描述中,错误的是( )。 A. 友元函数可以访问该类的私有数据成员 B. 一个类的友元类中的成员函数都是这个类的友元函数 C. 友元可以提高程序的运行效率 D. 类与类之间的友元关系可以继承 17、下列关于静态数据成员的说法,不正确的是( )。 A. 类中定义的公用静态数据成员,可以通过类的对象来访问 B. 类中定义的所有静态数据成员,都必须在类外初始化 C. 静态数据成员不是所有对象所共用的 D. 普通的成员函数可以直接访问类中的静态数据成员 18、如果表达式++i*k中的“++”和“*”都是重载的友元运算符,若采用运算符函数调用格式,则表达式还可以表示为( )。 A. operator*(i.operator++(),k) B. operator*(operator++(i),k) C. i.operator++().operator*(k) D. k.operator*(operator++(i)) 19、下面对模板的声明,正确的是( )。 A. template C. template 5 A. 构造函数 B. 析构函数 C. 友元函数 D. 复制构造函数 二、填空题(前14个空,每空1分,后3个空,每空2分,共20分) 1、类和对象的关系可表述为:类是对象的 ,而对象则是类的 。 2、静态成员函数没有隐含的 ,所以,在C++程序中,静态成员函数主要用来访问静态数据成员,而不访问非静态成员。 3、在图1中,A,B,C,D,E,F均是类,其中属于单继承的派生类有 ,属于多继承的派生类有 ,类F的基类有 ,类A的派生类有 。 A D B C E F 图1 类的继承层次图 4、如果只想保留公共基类的一个复制,就必须使用关键字 把这个公共基类声明为虚基类。 5、从实现的角度来讲,多态性可以划分为两类: 和 。 6、如果一个类包含一个或多个纯虚函数,则该类称为 。 7、若要把void fun()定义为类A的友元函数,则应在类A的定义中加入语句 。 8、列出C++中的两种代码复用方式: 和 。 9、析构函数的作用是 。 10、假定A是一个类名,则该类的拷贝构造函数的原型说明语句为: 。 11、后置自增运算符“++”重载为类的成员函数(设类名为A)的形式为: 。 1-5.C D B C C 6-10.A A D D B 11-15.A B B B C 16-20.D C B C C 二、填空题(前14个空,每空1分,后3个空,每空2分,共20分) 1. 抽象 实例 2. this指针 3. E D、F A、B、C、D、E D、F 4. virtual 5. 静态多态性 动态多态性 6. 抽象类 7. friend void fun(A &a) 8. 继承 组合或模板 9. 在对象被系统释放之前做一些内存清理工作 10. A(const A&) 11. A operator++(int) 1、关于C++与C语言关系的描述中,( )是错误的。 A.C语言是C++语言的一个子集 B.C语言与C++语言是兼容的 C.C++语言对C语言进行了一些改进 D.C++语言和C语言都是面向对象的 2、已知:int m=10; 下列表示引用的方法中,( )是正确的。 A.int &x=m; B.int &y=10; C.int &z; D.float &t=&m; 3、考虑下面的函数原型声明:void testDefaulParam(int a,int b=7,char z='*'); 下面函数调用中,不合法的是( )。 6 A.testDefaulParam(5); B.testDefaulParam(5,8); C.testDefaulParam(5,'#'); D.testDefaulParam(0,0,'*'); 4、系统在调用重载函数时往往根据一些条件确定哪个重载函数被调用,在下列选项中,不能作为依据的是( )。 A.函数的返回值类型 B.参数的类型 C.函数名称 D.参数个数 5、下列有关C++类的说法中,不正确的是( )。 A.类是一种用户自定义的数据类型 B.只有类中的成员函数或类的友元函数才能存取类中的私有成员 C.在类中,如果不做特别说明,所有成员的访问权限均为私有的 D.在类中,如果不做特别说明,所有成员的访问权限均为公用的 6、已知X类,则当程序执行到语句X array[3];时,调用了( )次构造函数。 A.0 B.1 C.2 D.3 7、有关析构函数的说法,不正确的是( )。 A.析构函数有且仅有一个 B.析构函数和构造函数一样可以有形参 C.析构函数的功能是在系统释放对象之前作一些内存清理工作 D.析构函数无任何函数类型 8、类定义的内容允许被其对象无地存取的是( )。 A.private 部分 B. protected 部分 C.public 部分 D.以上都不对 9、关于常数据成员的说法,不正确的是( )。 A.常数据成员的定义形式与一般常变量的定义形式相同,只不过常数据成员的定义必须出现在类体中 B.常数据成员必须进行初始化,并且不能被更新 C.常数据成员通过构造函数的成员初始化列表进行初始化 D.常数据成员可以在定义时直接初始化 10、运用运算符delete删除一个动态对象时( )。 A.系统首先为该动态对象调用构造函数,再释放其占用的内存 B.系统首先释放该动态对象占用的内存,再为其调用构造函数 C.系统首先为该动态对象调用析构函数,再释放其占用的内存 D.系统首先释放动态对象占用的内存,再为其调用析构函数 11、可以在类外用p.a的形式访问派生类对象p的基类成员a,其中a是( )。 A.私有继承的公用成员 B.公用继承的私有成员 C.公用继承的保护成员 D.公用继承的公用成员 12、在公用继承方式下,有关派生类对象和基类对象的关系,不正确的叙述是( )。 A.派生类的对象可以赋给基类的对象 B.派生类的对象可以初始化基类的引用 C.派生类的对象可以直接访问基类中的成员 D.派生类的对象的地址可以赋给指向基类的指针 13、设置虚基类的目的是( )。 A.简化程序 B.消除二义性 C.提高运行效率 D.减少目标代码 14、在C++中,用于实现动态多态性的是( )。 A.内联函数 B.重载函数 C.模板函数 D.虚函数 7 15、不能说明为虚函数的是( )。 A.析构函数 B.构造函数 C.类的成员函数 D.以上都不对 16、如果一个类至少有一个纯虚函数,那么就称该类为( )。 A.抽象类 B.派生类 C.纯基类 D.以上都不对 17、下面关于友元的描述中,错误的是( )。 A.友元函数可以访问该类的私有数据成员 B.一个类的友元类中的成员函数都是这个类的友元函数 C.友元可以提高程序的运行效率 D.类与类之间的友元关系可以继承 18、下列运算符中,( )运算符在C++中不能被重载。 A.&& B.[] C.:: D.new 19、模板的使用实际上是将类模板实例化成一个( )。 A.函数 B.对象 C.类 D.抽象类 20、假定MyClass为一个类,则该类的拷贝构造函数的声明语句为( )。 A.MyClass(MyClass x) B.MyClass&(MyClass x) C.MyClass(MyClass &x) D.MyClass(MyClass *x) 二、填空题(前16个空,每空1分,后2个空,每空2分,共20分) 1、类和对象的关系可表述为:类是对象的 ,而对象则是类的 。 2、在C++中,三种继承方式的说明符号为 、 和 ,如果不加说明,则默认的继承方式为 。 3、如果只想保留公共基类的一个复制,就必须使用关键字 把这个公共基类声明为虚基类。 4、若要把void fun()定义为类A的友元函数,则应在类A的定义中加入语句 。 5、类的静态成员分为 和 。 6、运算符重载要求保持其原来的操作数个数、 、 和语法结构。 7、通过关键字 可以声明模板,通过关键字 指定函数模板的类型参数,有几个类型参数就有几个类型关键字。 8、列出C++中两种用户自定义的数据类型: 、 。 9、构造函数的作用是 。 10、后置自增运算符“++”重载为类的成员函数(设类名为A)的形式为 。 8
因篇幅问题不能全部显示,请点此查看更多更全内容