1、C+试题清华大学计算机系C+期末考试题及答案一、 填空题(25小题,共50分)(以下每小题1分,共10分)1 在C+中,函数的参数有两种传递方式,它们是值传递和地址或指针或引用传递 。2 当一个成员函数被调用时,该成员函数的this指针指向调用它的对象。3在基类和派生类中,派生类可以定义其基类中不具备的数据和操作。对两个有相同名字的数据成员进行访问时,如果没有作用域分隔符限定时,对此数据成员的访问将出现歧义。4 拷贝构造函数使用引用作为参数初始化创建中的对象。5 在公有继承的情况下,基类数据成员在派生类中的访问权限保持不变。6 描述命题A小于B或小于C的表达式为AB|Ac&b=c的值是0。(以
2、下每小题2分,共20分)11 面向对象的程序设计有四大特征,它们是抽象、封装、 继承 、 多态。12 在Visual C+中,定义重载函数时,应至少使重载函数的参数个数或参数类型不同;在基类和派生类中,成员函数的覆盖是指派生类成员函数与在基类被覆盖的成员函数名、参数个数、参数类型和返回值类型均相同。13构造函数与析构函数除功能不同外,在定义形式上,它们的区别还包括构造函数名与类名相同,而析构函数名是在类名前加一个、析构函数没有参数 、析构函数可以定义为虚函数。14 动态联编要满足两个条件,它们是被调用的成员函数是虚函数 、 用指针或引用调用虚函数。15在C+类中,有一种不能定义对象的类,这样的
3、类只能被继承,称之为抽象类,定义该类至少具有一个纯虚函数。16 在C+类中,const关键字可以修饰对象和成员函数,const对象不能被修改,const成员函数不能修改类数据成员。17 举出C+中两种用户自定义的数据类型:类、枚举。18 C+中没有字符串类型,字符串是通过字符数组来表示的,每一个字符串都有一个结尾字符0。19 C+中没有输入输出语句,输入输出是通过输入输出库实现的,写出一条打印整型变量n的输出语句:coutn;20 举出C+中两种代码复用的方式:继承 、复用。(以下每小题4分,共20分)21 下面程序的运行结果是3。#include void main()char a=a,b=
4、j;float x;x=(b-a)/(F-A);printf(%dn,(int)(3.14*x);22 下面程序的运行结果是2 5 8 11 14。#include iostream.hvoid main( )int i=1;while (i=15)i+;if (i%3!=2) continue;else cout i=iendl;23 下面程序的运行结果是_。#include iostream.hclass testprivate:int num;float fl;public:test( );int getint( )return num;float getfloat( )return f
5、l;test( );test:test( )cout Initalizing default endl;num=0;fl=0.0;test:test( )cout Desdtructor is active endl;void main( )test array2;cout array1.getint( ) array1.getfloat( ) endl;Initalizing defaultInitalizing default0 0Desdtructor is activeDesdtructor is active24 下面程序的运行结果是_。#include class Apublic:
6、A()coutA:A() called.n;virtual A()coutA:A() called.n;class B:public Apublic:B(int i)coutB:B() called.n;buf=new chari;virtual B()delete buf;coutB:B() called.n;private:char *buf;void fun(A *a)delete a;void main()A *a=new B(15);fun(a);A:A() called.B:B() called.B:B() called.A:A() called.25 下面程序的运行结果是_。#i
7、nclude int a =1,3,5,7,9;int *p =a,a+1,a+2,a+3,a+4;void main( )printf(%dt%dt%dn,a4,*(a+2),*p1);printf(%dt%dt%dn,*(p+1)+a2,*(p+4)-*(p+0),*(a+3)%a4);9 5 38 4 7二、 问答题(每小题5分,共20分)1若程序员没有定义拷贝构造函数,则编译器自动生成一个缺省的拷贝构造函数,它可能会产生什么问题?解答要点:当对象含有指针数据成员,并用它初始化同类型的另一个对象时,缺省的拷贝构造函数只能将该对象的数据成员复制给另一个对象,而不能将该对象中指针所指向的内存
8、单元也复制过去。这样,就可能出现同一内存单元释放两次,导致程序运行出错。2 简述成员函数、全局函数和友元函数的差别。解答要点:以下几点必须说清楚:成员函数是在类内部定义的,作用域在类的内部,成员函数可以访问类的数据成员(公有、保护和私有数据成员),可以调用该类的其它成员函数(公有、保护和私有成员函数),可以调用全局函数。如果友元函数是另一个类的公有成员函数,则该类的成员函数也只能通过那个类的对象调用,不能调用那个类的保护和私有成员函数。非本类成员函数(其它类成员函数或全局函数)可以通过该类的对象访问该类的公有数据成员和调用该类的的公有成员函数。不是在类中定义的成员函数都是全局函数。如果某一个函
9、数(全局函数或类的成员函数)定义为另一个类的友元函数,需要在那个类中用friend关键字声明,友元函数并不是类的成员,它的定义自然是在那个类的外面。3 简述结构化的程序设计、面向对象的程序设计的基本思想。解答要点:结构化的程序设计将数据和对数据的操作分离,程序是由一个个的函数组成的,面向对象的程序设计将数据和操作封装在一起,程序是由一个个对象组成的,对象之间通过接口进行通信,它能够较好地支持程序代码的复用。4 结构struct和类class有什么异同?解答要点:struct和class都可以定义类,但是缺省访问权限说明时,struct的成员是公有的,而class的成员是私有的。在C+中,str
10、uct可被class代替。三、找出下面程序(或程序段)中的语法错误,并予以纠正(每小题4分,共8分)(1)程序功能是倒序输出各给定的字符串。#include void main()char str5 =First,Second,Third,Forth,Fifth;char *cp =str4,str3,str2,str1,str0;int i;while(i=5)printf(%c ,*(cp+i);i+; char str5 =First,Second,Third,Forth,Fifth;应为char str510 =First,Second,Third,Forth,Fifth; while
11、(i=5)应为while(i5) printf(%c ,*(cp+i);应为printf(%s,*(cp+i); int i;应为int i=0;(2)程序功能是将各个平方根值放入数组中。#include void main()int max,a,i;scanf(%d%d,max,a);double xmax;for (i=0;imax;i+)xi=sqrt(a*i); 增加#include scanf(%d%d,max,a);应为scanf(%d%d,&max,&a); double xmax;改为:double *x=new doublemax;delete x;四、(8分)下列shape
12、类是一个表示形状的抽象类,area( )为求图形面积的函数,total( )则是一个通用的用以求不同形状的图形面积总和的函数。请从shape类派生三角形类(triangle)、矩形类(rectangle),并给出具体的求面积函数class shape public: virtual float area( )=0; ;float total(shape *s ,int n) float sum=0.0; for(int i=0;iarea( ); return sum;class Triangle:public Shapepublic:Triangle(double h,double w)H=
13、h;W=w;double Area() constreturn H*W*0.5;private:double H,W;class Rectangle:public Shapepublic:Rectangle(double h,double w)H=h;W=w;double Area()constreturn H*W;private:double H,W;五、(6分)完成顺序查找函数f_seq( )。其过程是:从表头开始,根据给定的模式,逐项与表中元素比较。如果找到所需元素,则查找成功,并打印出它在表中的顺序号。如果查找整个表仍未找到所需对象,则查找失败#include void f_seq(c
14、har *list,char *object,int len)/list 指针数组,指向字符串/object 模式串/len 表的长度char *p;int strcmp(char *s,char *t);p=list;while (_) /plist+lenif (strcmp(*p,object)=0)break;else _; /p+if (pnext=NULLp=head-next;head-next=NULL;while(_) /p!=NULL或ptemp1=head;_; /head=p;temp2=p;p=p-next;_; /temp2-next=temp1;或head-nex
15、t=temp1;/Match while statenmentreturn head; /返回逆置后的链表的头结点答案一、单项选择题(本大题共10小题,每小题2分,共20分)在每小题列出的四个备选项中,只有一个是符合题目要求的,请将其代码填写在题后的括号内。错选、多选或未选均无分。1说明内联函数的关键字是( )。A. inline B. virtual C. define D. static参考答案:2假定CAb为一个类,则执行CAb oX;语句时将自动调用该类的( )A. 有参构造函数 B. 无参构造函数C. 拷贝构造函数 D. 赋值重载函数参考答案:3cin是某个类的标准对象的引用,该类是
16、( )。 A. ostream B. istream C. stdout D. stdin参考答案:4下面的哪个保留字不能作为函数的返回类型?( )A. void B. int C. new D. long参考答案:5不能参与重载的运算符是( )。A. 类 B. 函数 C. 函数模板 D. 运算符参考答案:6由于数据隐藏的需要,静态数据成员通常被说明为( )。A. 私有的 B. 公有的 C. 保护的 D. 不可访问的参考答案:7编译时多态性使用什么获得?( )A. 重载函数 B. 继承 C. 虚函数 D. B和C参考答案:A8拷贝构造函数的参数通常是( )。 A. 无特殊要求 B. 指向对象的
17、指针 C. 自已类对象的常引用 D. 对象参考答案:9C+有几种联编?( ) A. 1种 B. 2种 C. 3种 D. 4种参考答案:B10基类和派生类可以分别称为( )。 A. “大类”和“小类” B. “父类”和“子类” C. “小类”和“大类” D. “子类”和“父类”参考答案:B二、判断正误题(本大题共6小题,每小题2分,共12分)判断正误,在题后的括号内,正确的划上“”错误的划上“”。1不可以定义抽象类的对象。 ( )参考答案:.2内联函数的定义必须出现在第一次调用内联函数之前。 ( )参考答案:3模板函数与函数模板的意义完全相同。 ( )参考答案:4只有常成员函数才可以操作常对象。
18、 ( )参考答案:5引用可以不初始化。 ( )参考答案:6使用new运算符创建数组时,可以为该数组指定初始值。 ( )参考答案:三、填空题(本大题共6小题,每小题2分,共12分)不写解答过程,将正确的答案写在每小题的空格内。错填或不填均无分。1设函数max是由函数模板实现的,并且max(3.5, 5)和max(3, 5)都是正确的函数调用,则此函数模板具有( )个类型参数。参考答案:22在C+中,函数重载与虚函数帮助实现了类的( )性。参考答案:多态3由static修饰的数据成员为该类的所有对象( )。参考答案:共享4重载函数在参数类型或参数个数上不同,但( )相同。参考答案:函数名5使用ne
19、w建立的动态对象在不用时必须用( )释放所占用的空间。参考答案:delete6重载运算符“”的函数名为( )。参考答案:operator四、程序分析题(本大题共4小题,每小题5分,共20分)给出下面各程序的输出结果。1阅读下面程序,写出输出结果。#include using namespace std;class CPositionpublic: CPosition(int iPositionX = 0, int iPositionY = 0):m_iPositionX(iPositionX) m_iPositionY = iPositionY; int GetPositionX() cons
20、t return m_iPositionX; int GetPositionY() const return m_iPositionY; void SetPositionX(int iPositionX) m_iPositionX = iPositionX; void SetPositionY(int iPositionY) m_iPositionY = iPositionY; private: int m_iPositionX; / X坐标 int m_iPositionY; / X坐标;int main(void) CPosition oPostion1; const CPosition
21、oPostion2(6, 8); cout oPostion1.GetPositionX() endl; oPostion1.SetPositionX(16); cout oPostion1.GetPositionX() endl; oPostion1.SetPositionY(18); cout oPostion1.GetPositionY() endl; cout oPostion2.GetPositionX() endl; cout oPostion2.GetPositionY() endl; return 0;上面程序的输出结果为:参考答案:01618682阅读下面程序,写出输出结果。#include using namespace std;temp
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1