分享

整理之c++笔试2

 lhzstudio 2013-05-04

一、填空题(分)
1.采用内联函数的目的在于提高 程序的运行效率 。
2.采用函数重载的目的在于提高 程序设计的简化程度 。
3.用一个已知对象来初始化一个新对象时,系统会调用 复制(或称拷贝) 构造函数来完成。
4.静态数据成员与一般数据成员不同,它的初始化应在 类体外 进行。
5.在 C++中,不能为 抽象 类定义对象。
6.单个参数的构造函数可以提供 类型 转换功能。
7.在定义派生类时,默认的继承方式是 私有private方式 。
8.在 公有 继承方式下,派生类对象的地址值可以赋值给基类的对象指针。
9.虚基类的构造函数和非虚基类的构造函数在成员初始化列表中同时出现时,
虚基类 的构造函数优先执行。
10.构造函数中调用虚函数时,采用 动态 联编。

二、选择题(请在正确答案上打上○) (分)
1.下列各表达式中,哪一个可能会有二义性? (B)
已知:int a(4), b(5);
A.a+b<<3 B.++a*b++
C.(a=3)+a++ D.b+(a=3)

2.下列关于结构的定义中,有几处错误? (C)
struct d {
int a;
double a;
} a,d;
A.1 B.2 C.3 D.4

3.下列关于goto语句的描述中,哪个是正确的? (D)
A.goto语句可在一个文件中随意转向;
B.goto语句后面要跟上一个它所转向的语句;
C.goto语句可以同时转向多条语句;
D.goto语句可以从循环体内转到循环体外。

4.下列哪一个描述是关于引用调用的? (B)
A.形参是指针,实参是地址值;
B.形参是引用,实参是变量。
C.形参和实参都是变量;
D.形参和实参都是数组名;
5.定义函数模板需使用下列哪一个关键字?(C)
A.class B.inline C.template D.operator

6. 下列关于成员函数特征的描述中,哪个是错误的? (A)
A.成员函数一定是内联函数;
B.成员函数可以重载;
C.成员函数的函数体可以为空;
D.成员函数可以是静态的。

7. 已知一个类A, 下列哪个是指向成员函数的指针?假设类A有公有成员void f( )和 int a。(C)
A.A *p;
B.int A:: *pc=& A:: a;
C.void (A:: *pa)();
D.A **pp;

8. 下列关于new运算符的描述中,哪个是错误的? (D)
A.它可以用来动态创建对象和对象数组;
B.使用它创建的对象或对象数组,可以使用delete删除;
C.使用它创建对象时要调用构造函数;
D.使用它创建对象数组时必须指定初始值。

9.下列对派生类的描述中,哪个是错误的? (B)
A.一个派生类可以作另一个派生类的基类;
B.派生类中继承的基类成员的访问权限到派生类仍然保持不变。
C.派生类至少有一个基类;
D.派生类的成员除了自己的成员外,还包含它的基类的成员;

10.下列运算符中,哪一个不能重载? (D)
A.<< B.>> C.( ) D.?:

三、试编写求两个数中最小值的函数模板。(分)

四、输入一字符串,去掉当中的重复字符。如字符串“ABADB”, 去掉重复字符后的字符串应为“ABD”。(分)

五、求下列分数序列的前15项之和。(分)

六、下面是一个利用重载运算符实现复数加和乘的类。在该类中复数加运算的实现代码已完成,但复数乘运算还未完成,试在类体外完成之。(分)

class complex
{
public:
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;
};

七、找出下列程序中的语法错误,并注明出错类型。(分)
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 int[5];
return 1;
}

八、分析下列程序,并回答后面的问题。(分)
程序内容如下:
#include <iostream.h>
class A
{
public:
A(int i=0, int j=0){ a1=i; a2=j;}
virtual void Print( )
{
cout<<a1+a2<<endl;
}
protected:
int a1,a2;
};

class B: public A
{
public:
B(int i=0, int j=0): A(i,j){}
void Print()
{
cout<<a1-a2<<endl;
}
};

class C: public A
{
public:
C(int i=0, int j=0): A(i,j){}
void Print()
{
cout<<a1*a2<<endl;
}
};

void main()
{ int i=10, j=8;
A a(i, j);
B b(i, j);
C c(i, j);
A *m[3]={&c, &b, &a};
for(int n=0; n<3; n++) m[n]->Print();
A &ra=c;
ra.Print();
A aa=c;
aa.Print();
}

请回答下列问题:
(1)执行该程序后,输出结果是什么?
(2)该程序中哪些语句采用了动态联编?
(3)去掉virtual void Print( )中的关键字virtual后,该程序的输出结果是什么?

九、分析下列程序,并回答后面的问题。(分)
程序内容如下:
#include <iostream.h>
class A
{
public:
A(int i){
a=i;
cout<<”a=”<<a<<endl;
}
~A(){ cout<<”A’s destructor “<<a<<endl; }
int a;
};
class B: virtual public A
{
public:
B(int i, int j): A(i) { cout<<”B:”<<j<<endl; }
};

class C: virtual public A
{
public:
C(int i, int j): A(i)
{ cout<<”C:”<<i+j<<endl; }
};
class D: public B, public C
{
public:
D(int k1, int k2, int k3, int k4): B(k1,k2), C(k4,k3), A(k1)
{
cout<<”D:”<<k4<<endl;
}
};
void main()
{ D d(1,2,3,4);
A a(5);
a=A(6);
cout<<”a.a=”<<a.a<<endl;
cout<<”d.a=”<<d.a<<endl;
}

请回答下列问题:
(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)后,输出结果是否有变化?

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多