1、期终试题期终试题2007 年 C+程序设计期终考试试题一、填空题(20 分)1采用内联函数的目的在于提高。2采用函数重载的目的在于提高。3用一个已知对象来初始化一个新对象时,系统会调用构造函数来完成。4静态数据成员与一般数据成员不同,它的初始化应在进行。5在 C+中,不能为类定义对象。6单个参数的构造函数可以提供转换功能。7在定义派生类时,默认的继承方式是。8在继承方式下,派生类对象的地址值可以赋值给基类的对象指针。9虚基类的构造函数和非虚基类的构造函数在成员初始化列表中同时出现时,的构造函数优先执行。10构造函数中调用虚函数时,采用联编。二、选择题(请在正确答案上打上)(20分)1下列各表达
2、式中,哪一个可能会有二义性?已知:int a(4),b(5);Aa+b3B+a*b+C(a=3)+a+Db+(a=3)2下列关于结构的定义中,有几处错误?struct d int a;double a;a,d;A1B2C3D43下列关于 goto 语句的描述中,哪个是正确的?Agoto 语句可在一个文件中随意转向;Bgoto 语句后面要跟上一个它所转向的语句;Cgoto 语句可以同时转向多条语句;Dgoto 语句可以从循环体内转到循环体外。4下列哪一个描述是关于引用调用的?A形参是指针,实参是地址值;B形参是引用,实参是变量。C形参和实参都是变量;D形参和实参都是数组名;5定义函数模板需使用下
3、列哪一个关键字?AclassBinlineCtemplateDoperator6 下列关于成员函数特征的描述中,哪个是错误的?A成员函数一定是内联函数;B成员函数可以重载;C成员函数的函数体可以为空;D成员函数可以是静态的。7 已知一个类 A,下列哪个是指向成员函数的指针?假设类 A有公有成员 voidf()和 int a。AA*p;Bint A:*pc=&A:a;Cvoid(A:*pa)();DA*pp;8 下列关于 new运算符的描述中,哪个是错误的?A它可以用来动态创建对象和对象数组;B使用它创建的对象或对象数组,可以使用 delete 删除;C使用它创建对象时要调用构造函数;D使用它创
4、建对象数组时必须指定初始值。9下列对派生类的描述中,哪个是错误的?A一个派生类可以作另一个派生类的基类;B派生类中继承的基类成员的访问权限到派生类仍然保持不变。C派生类至少有一个基类;D派生类的成员除了自己的成员外,还包含它的基类的成员;10下列运算符中,哪一个不能重载?AC()D?:三、试编写求两个数中最小值的函数模板。(5 分)四、输入一字符串,去掉当中的重复字符。如字符串“ABADB”,去掉重复字符后的字符串应为“ABD”。(10分)五、求下列分数序列的前 15项之和。(10分),1321,813,58,35,23,12六、下面是一个利用重载运算符实现复数加和乘的类。在该类中复数加运算的
5、实现代码已完成,但复数乘运算还未完成,试在类体外完成之。(7分)class complexpublic:complex(double r=0,double i=0)real=r;imag=i;complex operator+(const complex&c)return complex(real+c.real,imag+c.imag);complex operator*(const complex&c);private:double real,imag;complex complex:operator*(const complex&c)complex c1;c1.real=real*c.re
6、al-imag*c.imag;c1.imag=real*c.imag+imag*c.real;return c1;七、找出下列程序中的语法错误,并注明出错类型。(8 分)class A virtual A();class B:A;int add(int x,int y,int z=10)return x+y+z;int add(int x,int y)return x+y;void main()int x;const int z=5;int&y=x+1;z=x;x=&z;add(1,2);if(x=1)continue;x=new int5;return 1;八、分析下列程序,并回答后面的问题
7、。(10 分)程序内容如下:#include class Apublic:A(int i=0,int j=0)a1=i;a2=j;virtual void Print()couta1+a2endl;protected:int a1,a2;class B:public Apublic:B(int i=0,int j=0):A(i,j)void Print()couta1-a2endl;class C:public Apublic:C(int i=0,int j=0):A(i,j)void Print()couta1*a2endl;void main()int i=10,j=8;A a(i,j);
8、B b(i,j);C c(i,j);A*m3=&c,&b,&a;for(int n=0;nPrint();A&ra=c;ra.Print();A aa=c;aa.Print();请回答下列问题:(1)执行该程序后,输出结果是什么?802188018Press any key to continue(2)该程序中哪些语句采用了动态联编?(3)去掉 virtual void Print()中的关键字 virtual 后,该程序的输出结果是什么?九、分析下列程序,并回答后面的问题。(10 分)程序内容如下:#include class Apublic:A(int i)a=i;couta=aendl;
9、A()coutAs destructor aendl;int a;class B:virtual public Apublic:B(int i,int j):A(i)coutB:jendl;class C:virtual public Apublic:C(int i,int j):A(i)coutC:i+jendl;class D:public B,public Cpublic:D(int k1,int k2,int k3,int k4):B(k1,k2),C(k4,k3),A(k1)coutD:k4endl;void main()D d(1,2,3,4);A a(5);a=A(6);couta.a=a.aendl;coutd.a=d.aendl;请回答下列问题:(1)执行该程序后,输出结果是什么?(2)去掉 class B:virtual public A 和 class C:virtual public A 中的关键字 virtual后,该程序的哪个语句的执行会出现二义性?(3)将 class D:public B,public C修改成 class D:public C,public B 后,输出结果是否有变化?(4)将 B(k1,k2),C(k4,k3),A(k1)修改成 C(k4,k3),B(k1,k2),A(k1)后,输出结果是否有变化?