华科面向对象的程序设计题库
- 格式:docx
- 大小:58.98 KB
- 文档页数:30
一、单项选择题(本大题共10小题,每小题2分,共20分)在每小题列出的四个备选项中只有一个是符合题目要求的,请将其代码填写在题后的括号内。
错选、多选或未选均无分。
1.一个函数功能不太复杂,但要求被频繁调用,选用()A.内联函数B.重载函数C.递归函数D.嵌套函数2.C++的继承性允许派生类继承基类的()A.部分特性,并允许增加新的特性或重定义基类的特性B.部分特性,但不允许增加新的特性或重定义基类的特性C.所有特性,并允许增加新的特性或重定义基类的特性D.所有特性,但不允许增加新的特性或重定义基类的特性3.在C++中,封装是借助什么达到的?()A.结构B.类C.数组D.函数4.建立包含有类对象成员的派生类对象时,自动调用构造函数的执行顺序依次为()A.自己所属类、对象成员所属类、基类的构造函数B.对象成员所属类、基类、自己所属类的构造函数C.基类、对象成员所属类、自己所属类的构造函数D.基类、自己所属类、对象成员所属类的构造函数5.类的析构函数是对一个对象进行以下哪种操作时自动调用的?()A.建立B.撤消C.赋值D.引用6.下列不是..描述类的成员函数的是()A.构造函数B.析构函数C.友元函数D.拷贝构造函数7.所有在函数中定义的变量,连同形式参数,都属于()A.全局变量B.局部变量C.静态变量D.寄存器变量8.假定AB为一个类,则执行AB x;语句时将自动调用该类的()A.有参构造函数B.无参构造函数1 / 10C.拷贝构造函数D.赋值构造函数9.假定AA为一个类,a()为该类公有的函数成员,x为该类的一个对象,则访问x对象中函数成员a()的格式为()A.x.a B.x.a()C.x->a D.x->a()10.对于任一个类,用户所能定义的构造函数的个数至多为()A.0 B.1C.2 D.任意个二、填空题(本大题共10小题,每小题2分,共20分)请在每小题的空格中填上正确答案。
错填、不填均无分。
面向对象程序设计样卷一、选择题( 本大题共10小题, 每题2分, 共20分)4.在下列定义的引用中, ( B )是错误的。
A. int i;B. int i;int &j = i; float &j=i;C. float i;D. char d;float &j = i; char &e = d;5. 假定BB为一个类,则执行BB y;语句时将自动调用该类的( B )A. 有参构造函数B. 无参构造函数C. 拷贝构造函数D. 赋值重载函数7.下列对派生类的描述中, ( C )是错误的。
A. 一个派生类能够作为另一个派生类的基类B.派生类至少应有一个基类C. 基类中成员访问权限继承到派生类中都保持不变D.派生类成员除了自己定义的成员外, 还包含了它的基类成员10.控制输出格式的控制符中, ( D )是设置输出宽度的。
A.wsB.endsC. setfill()D.setw()二、填空题( 本大题共10小题, 每题2分, 共20分)1.以/*开始, 以*/结束, 在/*和*/之间的部分即为注释。
2.重载函数在参数类型或参数个数上不同, 但函数名和类名_相同。
3. 假如一个类的名称为MyClass, 使用这个类的一个对象初始化该类的另一个对象时, 能够调用__拷贝______构造函数来完成此功能。
4.当删除对象时, 程序自动调用析构函数。
5. 对于每一个类的非静态成员函数, 都有一个隐含的_this_______指针。
8. 抽象类是指类里有一个函数, 是纯嘘函数。
三、改错题( 下面程序或程序段中有一处错误, 请用注释标明错误所在行的出错原因。
本大题共5小题, 每题2分, 共10分) 1. #include<iostream>using namespace std;int main(){ cout<<"This is a program."<<endl;return 0;}2. #include<iostream>using namespace std;int main(){x=3;int y=x*x;cout<<"y="<<y<<"\n";return 0;}3. #include<iostream>using namespace std;class Aa{public:Aa(int i=0){a=i; cout<<"Constructor "<<a<<endl; } ~Aa(){ cout<<"Destructor "<<a<<endl; }void print( ){cout<<a<<endl;}private:int a;};int main(){Aa al(1),a2(2);al.print();cout<<a2.a<<endl;return 0;}4.class A{int a,b;public:A(int aa,int bb=78){a=aa;b=bb;} };int main(){A x(2), y(4,9);return 0;}5. #include<iostream>using namespace std;class Test{public:static int x;};int Test :: x=20;int main(){cout<<Test::x;return 0;}四、程序分析题( 分析程序, 写出运行结果。
面向对象程序设计(java)题库抽题规范:(1)此题库共75道题,抽8道作为期末考试题。
其中,易8道,较易33道,较难18道,难16道.(2)按题型,第一大题抽4道,每道10分;第二大题抽2道,每道10分;第三大题抽1道,每道20分;第四大题抽1道,每道20分。
(3)按难易程度:易(1道)、较易(4道)、较难(2道)、难(1道)。
一、解答题(共40道,抽4道,每道10分,共40分)1.面向对象有哪三大特征?封装,继承,多态.2.什么是类?(易)类是定义同一类所有对象的变量和方法的蓝图或原型。
3.什么是对象?对象是类的实例;对象是通过new className产生的,用来调用类的方法;类的构造方法 .。
4.类和对象的区别是什么?java中的类是模板,而对象是依据模版产生的实体5.简述Java的封装性,如何在Java中实现封装封装性是指的把代码封装到大括号中,只能访问自己内部的数据,外边的东西访问不了。
实现为加访问权限。
6.构造方法有哪些特点方法名与类名相同,没有返回值,可以有多个重载。
7.构造方法的作用是什么?(较易)初始化对象,就是你new一个类的时候可以很方便的给你的对象里的属性赋值。
8.this在程序中所代表的意思(易)指当前对象9继承的作用是什么?(易)实现代码复用。
10.Java支持多继承吗?(易)不能。
11.子类可以继承父类的哪些成员?(较难)变量和构造方法。
12.简述构造子类对象时子类和父类构造方法执行顺序(较易)先执行父类再执行子类。
13.什么是方法的重载,如何选择被重载的方法?(较易)同一个类中如果同时存在两个以上的方法有同一个名字,在这种情况下,我们说方法被重载了,这个过程被称为重载。
14什么是方法的重写,如何选择被重写的方法?(较难)当同名方法同时存在于子类和父类中时,对于子类来说就是将继承父亲的方法重载写过了,实现功能完全和父类无关。
15.简述重载和覆盖的区别(较易)重载是让同一方法名的方法可以处理和返回不同类型的数据而覆盖是在子类中改写父类的方法16.什么是成员的隐藏?如何访问被隐藏了的父类成员?(较易)在子类对父类的继承中,如果子类的成员变量和父类的成员变量同名,此时称为子类隐藏了父类的成员变量。
面向对象程序设计一、选择填空1.对于 C++与 C 语言的关系描绘中,( D)是错误的。
(A) C 语言是 C++的一个子集(B)C语言与C++是兼容的(C) C++对 C 语言进行了一些改良(D)C++和C语言都是面向对象的2.下边对于对象观点的描绘中,(B)是错误的。
(A)对象就是 C 语言的结构变量(B)对象代表着正在创立的系统中的一个实体(C)对象是一个状态的操作(或方法)的封装体(D)对象之间的信息传达是经过信息进行的3.下边对于类观点的描绘中,(D)是错误的。
(A)类是抽象数据种类的实现(B)类是拥有共同行为的若干对象的一致描绘体(C)类是创立对象的样板(D)类就是C语言的结构种类4.依照表记符的要求,( A)符号不可以构成表记符。
(A)连结符(B)下划线(C)大小写字母(D)数字字符5.以下符号中,( C)不行作为分开符。
(A),(B):(C)(D);6.在 16 位机中, int型字宽为(A)字节。
(A)2(B)4(C)6(D)87.种类修饰符unsigned 修饰( D)种类是错误的。
(A) char(B)int(C)long int(D)float8.对于 int *pa[5];的描绘,(D)是正确的。
(A) pa 是一个指向数组的指针,所指向的数组是 5 个 int型元素(B) pa 是一个指向某数组中第 5 个元素的指针,该元素是int变量(C) pa[5] 表示某个数组的第 5 个元素(D) pa 是一个拥有 5 个元素的指针数组,每个元素是一个int型指针。
9.以下对于指针的运算中,(D)是非法的。
(A)两个指针在必定条件下,能够进行相等或不等的运算。
(B)能够有一个空指针赋值给某个指针。
(C)一个指针能够加上一个整数。
(D)两个指针在必定条件下,能够相加。
10.指针能够用来表示数组元素,以下表示中(A)是错误的。
已知:int a[3][7];( A) *(a+1)[5](B)*(*a+3)(C)*(*(a+1))(D)*(&a[0][0]+2) 11.以下表示引用的方法中,(A)是正确的。
题目模板课程名称:面向对象程序设计层次:高起专题目阶段:阶段性作业1(阶段性作业1-4只包含客观题,每套作业的题量为20-30小题)一、单选题1. 下列关于栈的叙述正确的是_(1)_(A):栈是非线性结构(B):栈是一种树状结构(C):栈具有先进先出的特征(D):栈具有后进先出的特征答案B2. 已知,int m=10,在下列表示引用的方法中正确的是_(2)_(A):int &x=m (B): int &y=10 (C): int &z (D): float &t=&m答案A3. 结构化程序设计所规定的三种基本控制结构是_(3)_(A):输入、处理、输出(B): 树形、网形、环形(C):顺序、选择、循环(D): 主程序、子程序、函数答案C4. 结构化程序设计的一种基本方法是_(4)_(A):筛选法(B): 递归法(C): 归纳法(D): 逐步求精法答案D5. C++语言的跳转语句中,对于break和continue说法正确的是_(5)_(A):break语句只应用与循环体中(B): continue语句只应用与循环体中(C): break是无条件跳转语句,continue不是(D): break和continue的跳转范围不够明确,容易产生问题答案B6. 考虑函数原型void test(int a,int b=7,char="*"),下面的函数调用中,属于不合法调用的是_(6)_(A):test(5) (B): test(5,8) (C): test(6,"#") (D): test(0,0,"*")答案C7. C++语言是从早期的C语言逐渐发展演变而来的.与C语言相比,它在求解问题方法上进行的最大改进是_(7)_(A):面向过程(B): 面向对象(C): 安全性(D): 复用性答案B8. 关于delete运算符的下列描述中,_(8)_是错误的。
学生类别______________考试日期______________ 院系_______________2018年1月19日一、填空(共15分,每空1分)1、编译时的多态性是通过函数重载、运算符重载、模板来实现。
2、面向对象的四个基本特性是抽象、多态、继承和封装。
3、假定AB为一个类,则执行“C a(2), &p=a, c[1], *b=c;”语句时调用该类构造函数的次数为2。
4、C++类成员访问属性public、private、protected三种类型。
5、非成员函数应声明为类的__友元___函数才能访问这个类的private成员。
6、要实现动态联编,必须通过基类指针或引用来调用虚函数实现。
7、在用class定义一个类时,数据成员和成员函数的默认访问权限是_ 私有___。
8、[]、::、+、= 等四种运算符中,不可重载的运算符是::,可采用友元函数重载的运算符是+。
9、成员函数中有纯虚函数的类不能用来实例化对象。
二、问答题(共35分,每小题5分)1.阐述为何在类的派生中要引入虚基类?答案:当派生类从多个基类派生,而这些基类又从同一个基类派生,则在访问此共同基类中的成员时,将产生二义性。
而且在派生类中会保留这个间接共同基类数据成员的多个同名成员。
为了消除访问的二义性,同时减少成员冗余,C++中引入虚基类来解决。
2.简述带虚基类和非虚基类的多继承派生类构造函数调用顺序。
答案:多继承基类构造函数初始化按虚基类优先,非虚基类,子对象,派生类自身构造函数顺序调用进行初始化,同类按出现先后顺序调用。
只执行最后的派生类调用虚基类的构造函数,忽略虚基类其他派生类调用虚基类构造函数。
具体顺序如下:(1)按继承虚基类的顺序调用虚基类的构造函数;(2)按继承非虚基类的顺序调用非虚基类的构造函数;(3)按声明成员对象的顺序调用其构造函数;(4)调用派生类自己的构造函数。
3.写出下面程序的运行结果4 外部对象g_glb_Obj[构造]5 外部静态对象g_sta_Obj[构造]6 main内动态分配对象m_all_Obj[构造]7 main内调用fun函数1 fun内: cal12 fun内静态对象fun_sta_Obj[构造]3 fun内自动对象fun_Obj[构造]3 fun内自动对象fun_Obj[析构]1 fun内: cal23 fun内自动对象fun_Obj[构造]3 fun内自动对象fun_Obj[析构]6 main内动态分配对象m_all_Obj[析构]2 fun内静态对象fun_sta_Obj[析构]5 外部静态对象g_sta_Obj[析构]4 外部对象g_glb_Obj[析构]4.写出下面程序的输出结果A::P1 a = 2A::P2 a = 2 , b = 1.9B::P1 a = 2A::P2 a = 2 , b = 1.95.写出下面程序的输出结果答案:3-调用Base1类构造函数4-调用Base2类构造函数6-调用Base4类构造函数5-调用Base3类构造函数1-调用OBJ1类构造函数2-调用OBJ2类构造函数3-调用Base1类构造函数3-调用Base1类构造函数4-调用Base2类构造函数7-调用派生类构造函数成功8-end#include <iostream>#include <string>using namespace std;class OBJ1{6.以下程序代码是否有错,如有请改正并写出运行结果答案:编译链接错误,模板类型参数,A <float>add(2.5,3.3);运行结果:x+y=5.8#include <iostream>using namespace std;template <typename T> class A{7.以下程序可动态分配二维数组并释放内存,且可实现二维指针和一维指针复用,试问程序能否正常运行,如有错找出原因并改正之。
面向对象的程序设计一、单项选择题1、下面那种结构不是C++的控制结构()A 顺序结构B 选择结构C 循环结构D 判断结构答: D2、下列是C++语言中合法标识符的是()。
A.3three B.ifC._1oneD.while答:C3、下列是合法的C++语言语句的是()。
A.if(x>0) then x=x-1;else x=x+1;B.if(x>0) x=x-1;else x=x+1;C.if x>0 x=x-1;else x=x+1;D.if x>0 x=x-1;答:B4、下面那一种不是计算机内部表示整数的方法()A 二进制码B原码C 补码D反码答:A5、在C++语言中,下列数为合法的实数的是()。
A.5E-3B.5E-3.5C. E5D.-3.5E答:A6、C++语言中数据类型最大的是()A longB floatC intD char7、如果一个函数可以在定义中直接或间接的调用自己,这样的函数称为()。
A.函数声明B.嵌套函数C.定义函数D.递归函数答:D8、表达式0x55^0xB4的结果为()。
A.0xF5B.0x15C.0xE1D.0x1E答:C9、C++中,源代码文件后缀为()A .cppB .objC .exeD .c答: A10、0X5A&0XB7结果是()A 0X13B 0X12C 0X14D 0X15答: B二、填空题1、程序的基本控制结构包括()、()和()。
答:顺序结构,选择结构,循环结构2、用来解决问题的,与有限多个步骤组成的具体过程称为()。
答:算法3、整数类型变量a和b被初始化为3和10,则循环语句while(a<=b) a=a+2;共执行()次,执行完语句后a的值为(),b的的值为()。
答:4,11,10)。
答:警告信息,致命错误5、计算机中的数据可以分为()和()两大类。
答:数值型、字符型6、字符型数据有两种编码方法:()和()答:有美国国家标准局制定的ASCII码、IBM公司提出的EBCDIC码7、通过C++ 语言中的()机制,可以从现存类中构建其子类。
1.c++系统预定了4个用于标准数据流的对象,下;正确答案:【D】分值:【1】;2.设有说明:charw;intx;floaty;正确答案:【D】分值:【1】;3.下列对析构函数的描述中,正确的是(____);C.析构函数的定义只能在类体内D.析构函数可以有;正确答案:【A】分值:【1】;4.下列定义数组的语句中正确CPP程序设计模拟考试 1--第2套试卷1.c++系统预定了4个用于标准数据流的对象,下列选项中不属于此类对象的是(____) A.cout B.cin C.cerr D.cset正确答案:【D】2.设有说明:char w;int x;float y;double z;则表达式w*x+z-y 值的数据类型为(____) A.float B.char C.int D.double正确答案:【D】分值:【1】3.下列对析构函数的描述中,正确的是(____) A.一个类中只能定义一个析构函数 B.析构函数名与类名不同C.析构函数的定义只能在类体内D.析构函数可以有一个或多个参数正确答案:【A】分值:【1】4.下列定义数组的语句中正确的是(____)A.#define size 10 char str1[size],str2[size+2];B.char str[];C.i nt num['10'];D.int n=5; int a[n][n+2];正确答案:【A】分值:【1】5.关于this指针使用说法正确的是(____)A.保证每个对象拥有自己的数据成员,但共享处理这些数据的代码B.保证基类私有成员在子类中可以被访问。
C.保证基类保护成员在子类中可以被访问。
D.保证基类公有成员在子类中可以被访问。
正确答案:【A】分值:【1】6.所谓多态性是指(____)A.不同的对象调用不同名称的函数B.不同的对象调用相同名称的函数C.一个对象调用不同名称的函数D.一个对象调用不同名称的对象正确答案:【B】分值:【1】7.派生类构造函数的执行顺序是先执行________ 的构造函数,然后执行成员对象的构造函数,最后执行________ 的构造函数。
面向对象程序设计试卷一、选择题(每题2分,共20分)1. 面向对象程序设计中的三大特征是:A. 封装、继承、多态B. 抽象、封装、继承C. 封装、继承、封装D. 继承、多态、封装2. 下列哪个不是面向对象程序设计的优点?A. 代码重用B. 易于维护C. 程序复杂度低D. 可扩展性好3. 在Java中,哪个关键字用于定义类?A. classB. structC. interfaceD. type4. 以下哪个是Java中不允许的类名?A. MyClassB. 2MyClassC. MyClass2D. MyClass_5. 在面向对象程序设计中,以下哪个概念不是用于实现封装?A. 私有成员B. 公有方法C. 访问控制D. 继承6. 下列哪个不是Java的访问控制修饰符?A. publicB. privateC. protectedD. global7. 以下哪个是Java中不允许的方法名?A. myMethodB. _myMethodC. my_methodD. myMethod_8. 在Java中,哪个关键字用于实现继承?A. extendsB. inheritC. deriveD. base9. 以下哪个不是Java的多态性实现方式?A. 接口B. 抽象类C. 重载D. 重写10. 在Java中,哪个关键字用于定义接口?A. interfaceB. protocolC. abstractD. type二、简答题(每题10分,共30分)1. 简述面向对象程序设计中封装的概念,并给出一个封装的简单示例。
2. 解释什么是多态性,并说明多态性在面向对象程序设计中的重要性。
3. 描述继承在面向对象程序设计中的作用,并举例说明如何使用继承来提高代码的复用性。
三、编程题(每题25分,共50分)1. 定义一个名为`Student`的类,包含以下属性:- 姓名(String类型)- 学号(String类型)- 年龄(int类型)并为该类实现以下方法:- 一个构造函数,用于初始化姓名、学号和年龄。
《面向对象程序设计》试卷第一学期“本科”期末考试计算机专业面向对象程序设计试题一、单项选择题(每小题1分,共20分)1.由C++源程序文件编译而成的目标文件的默认扩展名为(C)。
A.cppB.exeC.objD.lik2.设x和y均为bool量,则x&&y为真的条件是(A)。
A. 它们均为真B.其中一个为真C. 它们均为假D. 其中一个为假3.在下面的二维数组定义中,正确的语句是(C)。
A.int a[5][];B.int a[][5];C.int a[][3]={{1,3,5},{2}};D.int a[][10];4.在文件包含命令中,被包含文件的扩展名(C)。
A.必须是 .h;B.不能是 .h;C.可以是 .h或 .cpp;D.必须是 .cpp;5.要使语句“p=new int[10][20]”正确,p应事先定义为(D)。
A.int *p;B.int **p;C.int *p[20];D.int (*p)[20];6.在关键字public后定义的成员为该类的(B)成员。
A.私有B. 公有C.保护D.任何7.假定AA为一个类,a为该类私有的数据成员,若要在该类的一个成员函数中访问它,则书写格式最好为(B)。
A.aB.AA::aC.a( )D. AA::a( )8.队列具有(A)的操作特性。
A.先进先出B.先进后出C.进出无序D.仅进不出9.假定AB为一个类,则执行“AB a,b(3),*p”语句时共调用该类构造函数的次数为(D)。
A. 5B. 4C. 3D. 210.在重载一个运算符时,其参数表中没有任何参数,这表明该运算符是(B)。
A. 作为友元函数重载的1元运算符B. 作为成员函数重载的1元运算符C. 作为友元函数重载的2元运算符D. 作为成员函数重载的2元运算符二、填空题(每空2分,共20分)1.当执行cout语句输出endl数据项时,将使C++显示输出屏幕上的光标从当前位置移动到下一行的开始位置。
一、单项选择题1. 在C++语言中,对函数参数默认值描述正确的是:( D )A) 函数参数的默认值只能设定一个B) 一个函数的参数若有多个,则参数默认值的设定可以不连续C) 函数参数必须设定默认值D) 在设定了参数的默认值后,该参数后面定义的所有参数都必须设定默认值2. 假定AB 为一个类,则执行AB x ;语句时将自动调用该类的( B )。
A) 有参构造函数B) 无参构造函数C) 拷贝构造函数D) 赋值构造函数3. 下述关于开关语句的描述中,()是正确的。
A) 开关语句中default子句可以没有,也可以有一个;B) 开关语句中每个语句序列中必须有break语句;C) 开关语句中default子句只能放在最后;D) 开关语句中case子句后面的表达式可以是整形表达式。
4. 关于对象概念的描述中,()是错误的。
A) 对象就是C语言中的结构变量;B) 对象代表着正在创建的系统中的一个实体;C) 对象是一个状态和操作(或方法)的封装体;D) 对象之间的信息传递是通过消息进行的;5. 下列给字符数组进行初始化中,()是正确的。
A) char s1[ ]="12345abcd"; B) char s2[3]="xyz";C) char s3[][3]={ 'a', 'x', 'y'}; D) char s4[2[3]={"xyz","mnp"};6. 在int a[][3]={{1},{3,2},{4,5,6},{0}}中,a[2][2]的值是()。
A) 3 B) 2 C) 6 D) 47. 声明类test的拷贝构造函数的正确形式是( D )。
A) int test B) void test C) test(void) D) test(test&)8. 关于new运算符的下列描述中,()是错的。
面向对象程序设计试题及答案一、试题1. 请简要解释面向对象(Object-Oriented)程序设计的概念。
2. 列举面向对象程序设计中的四个基本特征,并分别进行简要描述。
3. 请说明封装(Encapsulation)在面向对象程序设计中的作用和优势。
4. 解释继承(Inheritance)在面向对象程序设计中的概念和用途。
5. 什么是多态(Polymorphism)?请解释多态的概念以及其在面向对象程序设计中的重要性。
6. 简要介绍抽象类(Abstract Class)和接口(Interface)的概念,并说明它们之间的区别。
7. 请解释类(Class)与对象(Object)之间的关系。
8. 在面向对象程序设计中,什么是构造函数(Constructor)?请说明构造函数的作用和使用方法。
9. 请示范一个使用面向对象程序设计的简单实例,并说明你所设计的类的结构和功能。
二、答案1. 面向对象程序设计是一种以对象为中心的编程方法,通过定义表示对象属性和行为的类来组织程序结构,以实现代码的重用性、灵活性和可维护性。
2. (1)封装:将数据和对数据的操作封装在一个类中,通过访问权限控制,保护数据的安全性和完整性。
(2)继承:通过建立类之间的继承关系,实现代码的重用,具有层次性和扩展性。
(3)多态:允许不同类的对象对同一消息作出不同的响应,实现代码的灵活性和扩展性。
(4)抽象:通过抽象类和接口的定义,隐藏对象的具体实现细节,提供统一的接口和规范。
3. 封装的作用是将数据和对数据的操作封装在一个类中,外部无法直接访问类的内部实现细节,只能通过类提供的接口访问和操作数据。
封装的优势包括:(1)提高代码的可维护性和可读性,减少代码的重复。
(2)保护数据的安全性和完整性,防止外部直接对数据进行非法操作。
(3)降低模块之间的耦合度,提高代码的灵活性。
4. 继承是面向对象程序设计中的一个重要概念,它通过建立类与类之间的继承关系,实现代码的重用和扩展。
考试试卷A(答案)面向对象程序设计注意事项:1。
请考生按要求在试卷装订线内填写姓名、学号和年级专业。
2. 请仔细阅读各种题目的回答要求,在规定的位置填写答案。
3。
不要在试卷上乱写乱画,不要在装订线内填写无关的内容.4。
满分100分,考试时间为120分钟。
一。
单项选择(本大题共10小题,每小题3分,共30分)1. C#中每个int类型的变量占用( B )个字节的内存。
(A)8 (B)4 (C)2 (D)12。
面向对象的特点是( A )(A)封装、继承、多态(B)抽象、封装、多态(C)抽象、继承、封装(D)抽象、多态、重载3。
C#控制台程序的主入口点是( C )(A) Page_Load函数(B)Run函数(C)Main函数(D)Form_Load函数4。
引用类型存储在( B )中。
(A)堆栈(B)堆内存(C)队列(D)列表5. 在C#中,表示一个字符串的变量应使用以下哪条语句定义( B )(A)CString str (B)string str(C)Dim str as string (D)char *str6。
在中,用来与数据源建立连接的对象是( A )。
(A)Connection对象(B)Command对象(C)DataAdapter对象(D)DataSet对象7. 在类的定义中,类的( B )描述了该类的对象的行为特征.(A)类名(B)方法(C)所属的名字空间(D)私有域8. 如果未显式赋值,则将整型值( B )赋给枚举中的第一个元素。
(A)1 (B)0 (C)2 (D)39. float类型的值可以隐式转换成( C )类型的值而保持值不被改变。
(A)char (B)long (C)double (D)int10。
在C#中,假设Class1是一个类,而IExample是一个接口,下面的( A )类声明是正确的。
(A)class Employee: Class1, IExample(B )class Employee : IExample , Class1(C )class Employee- Class1, IExample(D )class Employee: Class1/IExample二.判断题(本大题共5小题,每小题3分,共15分)1. C#中子类可以继承多个基类,也可以继承一个接口。
华中科技大学研究生课程考试试卷□√公共课□√开卷面向对象程序设计课程名称:课程类别考核形式□专业课□闭卷学生类别______________考试日期______________ 院系_______________2017 年1 月9 日学号__________________姓名__________________任课教师___________________杨卫东、左峥嵘一、填空(共15 分,每空 1 分)1、编译时的多态性通过__重载__函数实现。
2、面向对象的四个基本特性是抽象、多态、继承和封装。
3、假定AB为一个类,则执行“AB a(10), *b=&a, &p=a; ”语句时调用该类构造函数的次数为 2 。
4、C++类成员访问属性public 、private 、protected 三种类型。
5、非成员函数应声明为类的__友元___函数才能访问这个类的private 成员。
6、。
要实现动态联编必须通过对象指针或引用来调用_虚函数_实现。
7、类B是由类A以保护方式派生的,则类A中私有访问属性的数据成员在类B中的访问属性为不可访问。
8、+、=、[] 、->等四种运算符中,可采用友元函数重载的运算符是+ 。
9、抽象类是指具有纯虚函数的类,它只能作为基类来使用。
1/ 8二、问答题(共30 分,每小题 6 分)1.简述运算符重载的实现方式有哪几种?给出对应的声明语法形式。
答案:(1)类外定义的运算符重载函数格式为:friend < 返回类型> operator <op>(< 类型> 参数1,<类型> 参数2){ < 函数体> }(2)成员运算符重载函数<返回类型> <类名>::operator <op> (< 类型> 参数){ < 函数体> }2.什么是多继承?多继承时,构造函数和析构函数执行顺序是怎样的?答案:多继承是指派生类具有多个基类,派生类与每个基类之间的关系仍可看作是一个单继承。
华中科技大学研究生课程考试试卷课程名称: 课程类别考核形式学生类别______________考试日期______________院系_______________ 学号__________________姓名__________________任课教师___________________一、填空(共15分,每空1分)1、编译时的多态性是通过________________来实现。
2、面向对象的四个基本特性是________、________、________和________。
3、假定AB 为一个类,则执行“C a(2), &p=a, c[1], *b=c;”语句时调用该类构造函数的次数为________。
4、C++类成员访问属性________、________、________三种类型。
5、非成员函数应声明为类的________函数才能访问这个类的private 成员。
6、要实现动态联编,必须通过基类指针或________来调用虚函数实现。
7、在用class 定义一个类时,数据成员和成员函数的默认访问权限是________。
8、[]、::、+、= 四种运算符中,不可重载的运算符是________,可采用友元函数重载的运算符是________。
9、成员函数中有________的类不能用来实例化对象。
二、问答题(共35分,每小题5分)1.阐述为何在类的派生中要引入虚基类?2.简述带虚基类和非虚基类的多继承派生类构造函数调用顺序。
3.写出下面程序的运行结果#include <iostream>#include <string.h>面向对象程序设计 2018年1月19日 杨卫东、左峥嵘using namespace std;class A {char string[80];public :void show();A(char * st);~A( );};A::A(char * st){strcpy(string, st);cout << string << "[构造]" << endl;}A::~A( ){ cout << string << "[析构]" << endl; }void A::show(){cout << string << endl;}void fun(char * st){cout << "1 fun内: " << st << endl;static A fun_sta_Obj("2 fun内静态对象fun_sta_Obj");A fun_Obj("3 fun内自动对象fun_Obj");}A g_glb_Obj("4 外部对象g_glb_Obj");static A g_sta_Obj("5 外部静态对象g_sta_Obj");void main( ){A *ptrA = new A("6 main内动态分配对象m_all_Obj"); if(ptrA==NULL) return;cout<<"7 main内调用fun函数"<< endl;fun( "cal1");fun( "cal2");delete ptrA;}4.写出下面程序的输出结果#include <iostream>using namespace std;class A{public:virtual void Print(int a){ cout << "A::P1 " << "a = " << a << endl; }virtual void Print(float a, double b=2.8){ cout << "A::P2 " << "a = " << a << " , b = " << b << endl; } };class B : public A {public:virtual void Print(int a){ cout << "B::P1 " << "a = " << a << endl; }virtual void Print(float a, float b){ cout << "B::P2 " << "a = " << a << " , b = " << b << endl; } };void Show(A * p){p -> Print( 2 );p -> Print( 2, 1.9 );}void main( ){A * pa = new A;B * pb = new B;Show( pa );Show( pb );delete pa;delete pb;}5.写出下面程序的输出结果#include <iostream>#include <string>using namespace std;class OBJ1{public:OBJ1(){ cout<< "1-OBJ1类构造"<<endl;}};class OBJ2{public:OBJ2(){ cout<< "2-OBJ2类构造"<<endl;}};class Base1{public:Base1(){ cout<< "3-Base1类构造"<<endl;}};class Base2 : virtual public Base1{public:Base2(){ cout<< "4-Base2类构造"<<endl;}};class Base3{public:Base3(){ cout<< "5-Base3类构造"<<endl;}};class Base4{public:Base4(){ cout<< "6-Base4类构造"<<endl;}};class DerivedA: public Base1,virtual public Base2, public Base3,virtual public Base4{public:DerivedA():Base4(),Base3(),Base2(),Base1(),obj2(),obj1(){cout<<"7-派生类构造成功"<<endl;}protected:OBJ1 obj1;OBJ2 obj2;Base1 base1;Base2 base2;};int main(int argc, char* argv[]){DerivedA aa;cout<<"8-end" << endl;return 0;}6.以下程序代码是否有错,如有请改正并写出运行结果#include <iostream>using namespace std;template <typename T> class A{private:T x,y,s;public:A(T a,T b) {x=a,y=b;s=x+y;}void show() {cout<<"x+y="<<s<<endl; }};void main(){A add(2.5,3.3);add.show();}7.以下程序可动态分配二维数组并释放内存,能实现二维指针和一维指针复用,试问程序有几处错,找出并说明原因改正之。
面向对象程序设计习题库选择题1. 一个设计得好的面向对象系统具有( D)特征。
A 低内聚、低耦合B 高内聚、低耦合C 高内聚、高耦合D 低内聚、高耦合2. 面向对象程序设计的特点主要概括为(C)。
A 可分解性、可组合性、可分类性B 继承性、封装性、多态性C 抽象封装性、继承性、多态性D 封装性、易维护性、可扩展性、可重用性3. 关于C#程序的书写,下列不正确的说法是( D )。
A. 区分大小写B. 一行可以写多条语句C. 一条语句可写成多行D. 一个类中只能有一个Main()方法,因此多个类中可以有多个Main()方法4. 关于C#语言的基本语法,下列哪些说法正确的是( C )A. C#语言使用using 来引用需要用到的命名空间;B. 用C#编写的程序中,Main 函数是唯一允许的全局函数;C. C#语言中使用的名称严格区分大小写;D. C#中一条语句必须写在一行内;5 以下标识符中,正确的是(A )。
A._nNameB. typeofC. 6bD. x5#6.字符串连接运算符包括&和( A )。
A. +B. -C. *D. /7.拆箱是关于:( B )A、值类型到引用类型的转换B、引用类型到值类型的转换C、引用类型到引用类型的转换D、值类型到值类型的转换8.装箱是关于:( A )A、值类型到引用类型的转换B、引用类型到值类型的转换C、引用类型到引用类型的转换D、值类型到值类型的转换9.下列引用类型和值类型描述正确的是(A )。
A. 引用类型变量保存内存地址,值类型直接保存变量值B. 引用类型在变量中直接保存变量值,值类型保存内存地址C. 引用类型和值类型保存数据的方式相同D. .NET Framework不支持值类型,因为所有的类型都是引用类型了10.一个类中的静态方法的调用可以:( A )A、通过类名调用B、通过实例化的对象调用C、在主方法中直接调用D、在同一个类中的某一方法中直接调用11.以下数据类型中,属于引用类型的是:(A )A、string类型B、double类型C、int类型D、char类型12.下列类型中为值类型的是( C )A. 字符串类型B. 树组类型C. 枚举类型D. 接口类型13.decimal类型和浮点类型都可以表示小数,正确说法:( C )A. 两者没有任何区别B. 小数类型比浮点类型取值范围大C.小数类型比浮点类型精度高D. 小数类型比浮点类型精度低14. 有定义语句:int [,]a=new int[5,6]; 则下列正确的数组元素的引用是__C__。
1、编译时的多态性通过__重载__函数实现。
2、面向对象的四个基本特性是_抽象__、__多态性_、__继承性__和_封装性_。
3. 假定AB为一个类,则执行“AB a(2), b[4],*p[4];”语句时调用该类构造函数的次数为__5__。
4.要实现动态联编必须通过对象指针或引用来调用_虚函数_实现。
5.在函数前面用_ inline _保留字修饰时,则表示该函数表为内联函数。
6. 如果将一个对象说明为常对象,则通过该对象只能调用它的__常成员__函数。
7、非成员函数应声明为类的__友元___函数才能访问这个类的private成员。
8、在用class定义一个类时,数据成员和成员函数的默认访问权限是_ 私有____。
9、运算符重载函数可能是类的_友元_函数,也可以是类的_成员_函数,还可以是普通函数。
10、__转换构造函数__函数可以将一个指定的数据转换为类的对象,_类型转换函数_函数实现类的对象转换成其它类型的数据。
11、静态多态性是通过函数重载、运算符重载、模板来实现。
12、假定AB为一个类,则执行“AB a(10), b[1],*p[10];”语句时调用该类构造函数的次数为 1 。
13、C++类成员函数有 public 、 private 、 protected 三种类型。
14、如果将一个对象说明为常对象,则通过该对象只能调用它的常成员函数。
15、为使外部函数可访问类的私有成员,需将该函数声明为该类的友元函数。
16、类B是由类A以保护方式派生的,则类A中公有访问属性的数据成员在类B中的访问属性为保护。
17、+、=、[]、->等四种运算符中,可采用友元函数重载的运算符是 + 。
18、抽象类是指具有纯虚函数的类,它只能作为基类来使用。
19、类B是由类A以保护方式派生的,则类A中私有访问属性的数据成员在类B中的访问属性为不可访问。
1、什么是类模板,类模板声明的一般形式是什么?答案:类模板是对一批仅仅成员数据类型不同的类的抽象,程序员只要为这一批类所组成的整个类家族创建一个类模板,给出一套程序代码,就可以用来生成多种具体的类,(这类可以看作是类模板的实例),从而大大提高编程的效率。
定义类模板的一般形式是:template <类型名参数名1,类型名参数名2,…>class 类名{类声明体};2、有哪几种继承方式?每种方式的派生类对基类成员的继承性如何?答案:继承方式包括:public、private、protected。
3、简述运算符重载的实现方式有哪几种?给出对应的声明语法形式。
答案:(1)类外定义的运算符重载函数格式为:friend <返回类型> operator <op>(<类型> 参数1,<类型> 参数2){ <函数体> }(2)成员运算符重载函数<返回类型> <类名>::operator <op> (<类型> 参数){ <函数体> }4、什么是this指针? 它的主要作用是什么?答案:this指针:隐含在非静态成员函数中的特殊指针,它是当前正在调用此成员函数的对象的指针。
作用:主要是用于保证访问不能跨界和用于区分不同的对象。
成员函数对成员变量的引用实际是通过this指针访问的,也就是说:成员变量this->成员变量;另外,如果成员函数需要访问当前对象,也可以通过this指针,*this就是当前对象。
5、什么是多继承?多继承时,构造函数和析构函数执行顺序是怎样的?答案:多继承是指派生类具有多个基类,派生类与每个基类之间的关系仍可看作是一个单继承。
派生类构造函数的执行顺序是先执行所有基类的构造函数(顺序按照定义派生类时指定的各基类顺序),再执行派生类的构造函数,析构函数执行顺序,与构造函数完全相反。
三、写出程序运行结果1、#include<iostream>using namespace std;class B1{int b1;public:B1(int i){ b1 = i; cout <<"constructor B1."<<i<<endl; } void print(){ cout<<b1<<endl; }};class B2{int b2;public:B2(int i){ b2 = i; cout<<"constructor B2."<<i<<endl; } void print(){ cout<<b2<<endl; }};class B3{int b3;public:B3(int i){ b3 = i; cout<<"constructor B3."<<i<<endl; }int getb3(){ return b3; }};class A:public B2, B1{int a; B3 bb;public:A(int i,int j, int k, int l):B1(i),bb(k),B2(j){ a=l;cout<<"constructor A."<<l<<endl;}void print(){B1::print();B2::print();cout<<a<<","<<bb.getb3()<<endl;}};int main(){A aa(1,2,3,4);aa.print();return 0;}答案:constructor B2.2constructor B1.1constructor B3.3constructor A.4124,32、#include <iostream>#include <string.h>using namespace std;class A {char string[80];public :void show();A(char * st);~A( );};A::A(char * st){ strcpy(string, st);cout << string << "[构造]" << endl;}A::~A( ){ cout << string << "[析构]" << endl; }void A::show(){cout << string << endl;}void fun( ){cout << "1 fun内" << endl;A fun_Obj("2 fun内自动对象fun_Obj");static A fun_sta_Obj("3 fun内静态对象fun_sta_Obj"); }void main( ){A *ptrA = new A("4 main内动态分配对象m_all_Obj"); if(ptrA==NULL) return;ptrA->show();cout<<"5 main内调用fun函数"<< endl;fun( );delete ptrA;}static A g_sta_Obj("6 外部静态对象g_sta_Obj");A g_glb_Obj("7 外部对象g_glb_Obj");答案:6 外部静态对象g_sta_Obj[构造]7 外部对象g_glb_Obj[构造]4 main内动态分配对象m_all_Obj[构造]4 main内动态分配对象m_all_Obj5 main内调用fun函数1 fun内2 fun内自动对象fun_Obj[构造]3 fun内静态对象fun_sta_Obj[构造]2 fun内自动对象fun_Obj[析构]4 main内动态分配对象m_all_Obj[析构]3 fun内静态对象fun_sta_Obj[析构]7 外部对象g_glb_Obj[析构]6 外部静态对象g_sta_Obj[析构]3、#include <iostream>using namespace std;class A{public:virtual void Print(int a, int b=4){ cout << "a = " << a << " , b = " << b << endl; } };class B : public A {public:virtual void Print(int a){ cout << "a = " << a << endl; }virtual void Print(int a, double d){ cout << "a = " << a << " , d = " << d << endl; } };void Show(A * p){p -> Print( 2 );p -> Print( 2, 6.9 );}void main( ){A * pa = new A;B * pb = new B;Show(pa);Show(pb);delete pa;delete pb;}答案:a = 2 ,b = 4a = 2 ,b = 6a = 2 ,b = 4a = 2 ,b = 64、#include <iostream.h>#include <string.h>class Person {char * pName;public :Person(char * pN){ static int j = 0;cout<< "第"<< ++j<< "次调用类型转换构造函数!\n"; pName = new char[strlen(pN) + 1];if(pName) strcpy(pName, pN);}Person(Person & p);Person & operator = (Person & s);~ Person( ){ static int k = 0;cout << "第"<< ++k<< "次调用析构函数!\n";pName[0] = '\0';delete pName;}void Display( ){ cout << pName << endl; }};Person::Person(Person & p){ cout << " 调用复制构造函数!\n";pName=new char[strlen(p.pName)+ 1];if(pName) strcpy(pName, p.pName);}Person& Person::operator = (Person & s) { cout << "调用赋值运算符函数!\n";if(pName) {delete pName;pName = '\0';}pName=new char[strlen(s.pName) + 1];if(pName) strcpy(pName , s.pName);return * this;}void main( ){Person p1("OldObject");Person p2 = p1;p1.Display( );p2.Display( );Person p3("NewObject");p3.Display( );p3 = p1;p3.Display( );}答案:第1次调用类型转换构造函数!调用复制构造函数!OldObjectOldObject第2次调用类型转换构造函数!NewObject调用复制构造函数!OldObject第1次调用析构函数!第2次调用析构函数!第3次调用析构函数!5、#include <iostream>using namespace std;class A{public:A() {m_nValue = -1;}A(int n) {m_nValue = n;}int m_nValue;};class B: virtual public A{public:B(int nB, int nA) : A(nA) {m_nValueB = nB;} int m_nValueB;};class C: virtual public A{public:C(int nC, int nA) : A(nA) {m_nValueC = nC;}int m_nValueC;};class D: public B, C{public:D(int nA, int nB, int nC, int nD) : C(nC, nA+20), B(nB, nA+10), A(nA+30){m_nValueD = nD;cout<< "(A,B,C,D)= "<< m_nValue << ","<<m_nValueB<< ","<< m_nValueC<< "," << m_nValueD<<endl;}int m_nValueD;};void main() { D dd(1, 2, 3, 4); }答案:(A,B,C,D)= 31,2,3,46、#include <iostream.h>#include <string.h>class Student {char name[20];public :Student(char * n){ strcpy(name, n);cout << " I am " << name << “ .\n”; }~Student(void){ cout << name << “ says goodbye !" << endl; }};void main( ){Student student[3] = {"WangWei", "LiLin", "ZhangFeng"};}答案:I am WangWeiI am LiLinI am ZhangFengZhangFengsays goodbye !LiLinsays goodbye !WangWeisays goodbye !7、#include<iostream.h>class Sample{char c1,c2;public:Sample(char a){c2=(c1=a)-32;}void disp(){cout<<c1<<"转换为"<<c2<<endl;}};void main(){Sample a('a'),b('b');a.disp();b.disp();}答案:a转换为Ab转换为B8、#include <iostream.h>class Counter{static long counter;public :Counter( ){ counter++; }long GetCounter( ) { return counter; }~Counter( ){ counter--; }};long Counter::counter = 5;Counter c1, c2, c3;void main( ){ cout<<"(1)The object counter is %d"<< c3.GetCounter( ))<<endl;Counter c4,c5,c6;Cout<<"(2)The object counter is %d"<< c5.GetCounter( ))<<endl;}答案:(1) The object counter is 8(2) The object counter is 119、#include<iostream.h>class Sample{int n;public:Sample(){}Sample (int m){n=m;}friend void square(Sample &s){s.n=s.n*s.n;}void disp(){cout<<"n="<<n<<endl;}};void main(){Sample a(10);square(a);a.disp();}答案:n=10010、#include<iostream.h>class Sample{int x;public:Sample(){ };Sample(int a){x=a;}Sample(Sample &a){x=a.x++ +10;}void disp() {cout<<"x="<<x<<endl;} };void main(){Sample s1(2), s2(s1);s1.disp();s2.disp();}答案:x=3x=1211、#include <iostream>#include <string>using namespace std;class Person{public:Person(char *nam,int ag){ strcpy(name,nam); age = ag;cout<<"Person类构造函数---"<<name<<endl;}Person(char *nam){ strcpy(name,nam);cout<<"Person类构造函数(char *nam)---"<<name<<endl;}~Person(){cout<<"Person类析构函数---"<<name<<endl;}void display(){cout<<"姓名:"<<name<<endl;}protected:char name[100];int age;};class Teacher: public Person // 声明Teacher(教师)类{public: // 公用部分Teacher(char *nam,int a,char *t):Person(nam,a) // 构造函数 { strcpy(title,t);cout<<"Teacher类构造函数"<<endl;}~Teacher(){cout<<"Teacher类析构函数"<<endl;}void display1() // 输出教师有关数据{cout<<"姓名:"<<name<<endl;cout<<"年龄"<<age<<endl;cout<<"职称:"<<title<<endl;}protected: // 保护部分char title[10]; // 职称};{public:Student(char *nam,char s,float sco):Person(nam){ sex=s; score=sco;cout<<"Student类构造函数---"<<name<<endl;}Student(char *nam, char s):Person(nam){ sex=s;cout<<"Student类构造函数---班长:"<<name<<endl;}~Student(){cout<<"Student类析构函数---"<<name<<endl;}void display2() // 输出学生有关数据{cout<<"姓名:"<<name<<endl;cout<<"性别:"<<sex<<endl;cout<<"成绩:"<<score<<endl;}char *get_name(){return name;}protected: // 保护部分char sex;float score; // 成绩};class Graduate: public Teacher, public Student{public:Graduate(char *nam,int a,char s,char *t,float sco,floatw):Teacher(nam,a,t),Student(nam,s,sco),wage(w),monitor("Li Ming",'m') {cout<<"Graduate类构造函数"<<endl;}~Graduate(){cout<<"Graduate类析构函数"<<endl;}void show( ) // 输出人员的有关数据cout<<"name:"<<Student::name<<endl;cout<<"age:"<<Student::age<<endl;cout<<"sex:"<<sex<<endl;cout<<"score:"<<score<<endl;cout<<"title:"<<title<<endl;cout<<"wages:"<<wage<<endl;cout<<"monitor:"<<monitor.get_name()<<endl;}Student monitor;private:float wage; // 工资};class Doctor:public Graduate{public:Doctor(char *nam,int a,char s,char *t,float sco,float w,char *tutor): Graduate(nam,a,s,t,sco,w){ strcpy(tutor_name, tutor);cout<<tutor_name<<endl;}private:char tutor_name[20];};int main(){Doctor d("Wang-li",24,'f',"assistant",89.5,1234.5,"Wang-wu");return 0;}答案:Person类构造函数---Wang-liTeacher类构造函数Person类构造函数(char *nam)---Wang-liStudent类构造函数---Wang-liPerson类构造函数(char *nam)---Li MingStudent类构造函数---班长:Li MingGraduate类构造函数Wang-wuGraduate类析构函数Student类析构函数---Li MingPerson类析构函数---Li MingStudent类析构函数---Wang-liPerson类析构函数---Wang-liTeacher类析构函数12、#include <iostream>using namespace std;class A{public:virtual void Print(int a, int b=5){ cout << "a = " << a << " , b = " << b << endl; } };class B : public A {public:virtual void Print(int a){ cout << "a = " << a << endl; }virtual void Print(int a, double d){ cout << "a = " << a << " , d = " << d << endl; } };void Show(A * p){p -> Print( 2, 6.9 );p -> Print( 2 );}void main( ){A * pa = new A;B * pb = new B;Show(pa);Show(pb);delete pa;delete pb;}答案:a = 2 , b = 6a = 2 ,b = 5a = 2 ,b = 6a = 2 ,b = 5四、补全程序题1、完成下面类中成员函数的定义。