一、选择题 (每小题2分,共12分)
1 C++源文件的缺省扩展名为()A
A.cpp
B.exe
C.obj
D.lik
2 程序运行中需要从键盘上输入多于一个数据时,各数据之间应该使用()符号作为分隔符 A
A.空格或逗号
B.逗号或回车
C.逗号或分号
D.空格或回车
3 在每个C++程序中都必须包含有这样一个函数,该函数的名称为()A
A.main
B.MAIN
C.name
D.function
4 假定a 为一个短整型(short int)数组名,则元素a[8]的地址为()B
A.a+4
B.a+8
C.a+16
D.a+32
5 假定AB 为一个类,则执行“ABa(4),b[4],*p[5]”语句时,自动调用该类够造函数的次数为()B
A.4
B.5
C.8
D.13
6 当需要使用istrstream流类定义一个流类对象并联系一个字符串时,应在文件开始使用#include命令,使之包含()文件A
A.iostream.h
B.iomanip.h
C.fstream.h
D.ststrea.h
二 填空题(每小题3分,共30分)
1. 在C++中,函数的参数有两种传递方式,它们是值传递和(址传递)。
2. 当一个成员函数被调用时,该成员函数的(this指针)指向调用它的对象。
3. 在公有继承的情况下,基类数据成员在派生类中的访问权限 (私有不可以访问,其他同基类一致) 。
4. 用new申请某一个类的动态对象数组时,在该类中必须能够匹配到 (无参) 构造函数,否则应用程序会产生一个编译错误。
5. 静态数据成员在类外进行初始化,且静态数据成员的一个拷贝被类的所有对象 (共享)。
6. 面向对象的程序设计有四大特征,它们是(封装,多态,继承,抽象) 。
7. 在C++类中,有一种不能定义对象的类,这样的类只能被继承,称之为 (虚基类) ,定义该类至少具有一个 (虚函数) 。
8. 在C++类中,const关键字可以修饰对象和成员函数,const对象不能 (作为左值)。
9.假定一个枚举类型的定义为“enum RB{ab,ac,ad,ae}x=ad;”则x的值为(2)
10.若需要把一个类AB定义一个类CD的友元素,则应在类CD的定义中加入一条语句为(friend class AB)。
三 给出下列程序运行后的输出结果(每小题5分,共20分)
1. 下面程序的运行结果是(3) 。
#include <stdio.h>
void main()
{
char a=’a’,b=’j’;
float x;
x=(b-a)/(‘F’-‘A’);
printf(“%dn”,(int)(3.14*x));
}
2. 下面程序的运行结果是()。
#include “iostream.h”
void main( )
{
int i=1;
while (i<=15){
i++;
if (i%3!=2) continue;
else cout <<“i=”<<i<<endl;
}
}
i=2
i=5
i=8
i=11
i=14
3. 下面程序的运行结果是()。
#include “iostream.h”
class test
{
private:
int num;
float fl;
public:
test( );
int getint( ){return num;}
float getfloat( ){return fl;}
~test( );
};
test::test( )
{
cout << “Initalizing default” << endl;
num=0;fl=0.0;
}
test::~test( )
{
cout << “Desdtructor is active” << endl;
}
void main( )
{
test array[2];
cout << array[1].getint( )<< ” ” << array[1].getfloat( ) <<endl;
}
Initalizing defaul
Initalizing defaul
0 0.0
Desdtructor is active
Desdtructor is active
4. 下面程序的运行结果是()。
#include <iostream.h>
class A
{
public:
A(){cout<<“A::A() called.n”;}
virtual ~A(){cout<<“A::~A() called.n”;}
};
class B:public A
{
public:
B(int i){
cout<<“B::B() called.n”;
buf=new char[i];}
virtual ~B()
{
delete []buf;
cout<<“B::~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.
5. 下面程序的运行结果是()。
#include <stdio.h>
int a[ ]={1,3,5,7,9};
int *p[ ]={a,a+1,a+2,a+3,a+4};
void main( )
{
printf(“%dt%dt%dn”,a[4],*(a+2),*p[1]);
printf(“%dt%dt%dn”,**(p+1)+a[2],*(p+4)-*(p+0),*(a+3)%a[4]);
}
9 5 3
8 4 7
四、 问答题(每小题5分,共20分)
1. 若程序员没有定义拷贝构造函数,则编译器自动生成一个缺省的拷贝构造函数,它可能会产生什么问题?
浅拷贝问题,主要原因为类中如果有指针成员变量时,当调用拷贝构造函数时只拷贝地址从而使两个对象的指针变量指向了一个地址空间。
2. 简述成员函数、全局函数和友元函数的差别。
成员函数只能由该类所实例化的对象来进行调用。[静态成员除外]
全局函数可以在任意位置进行调用。
友元函数可以让本类和友元类对象调用。
3. 简述结构化的程序设计、面向对象的程序设计的基本思想。
结构化程序设计为从程序代码的开始处按照顺序方式执行至代码的结束位置。是一种顺序的方式,函数与变量没有明显的联系
面向对象主要把处理事情的事物和方法结合为一体成为一个类,一个类具备处理一件事情的数据变量和处理方法,把数据和方法有机的结合为了一体,使每一件事情都具备一定的独立性,形成一个模块。增加了内聚性,降低了耦合性。同时也增加了代码的可读性以及代码的重用性。
4. 结构struct和类class有什么异同?
在c语言中struct只能对数据进行聚合,而c++的class把数据以及对数据的处理方法也同时聚合为一体,增加了内聚性。
此外class拥有可再生性和可抽象性,实现的代码的复用。集中体现在派生的功能和多态的功能。
同时class也比struct具备更好的封装性,体现在三种访问权限上。
在C++ 中的struct和class的结构基本一致,只是struct的默认权限为Public而class为private。
五 下列shape类是一个表示形状的抽象类,area( )为求图形面积的函数,total( )则是一个通用的用以求不同形状的图形面积总和的函数。请从shape类派生三角形类(triangle)、矩形类(rectangle),并给出具体的求面积函数(18分)
Class Shape
{
Public:
Shape(){}
~shape(){}
Virtual int area();
}
/* 求所有面积 */
Int total( Vector< Shape*> vecshape);
Vector< Shape*> vecShape;
Int total(Vector< Shape*> vecshape)
{
Vector< Shape*>::iterator VecIt;
Int ntotal = 0;
For( VecIt=vecShape.begin(); VecIt!=vecShape.end(); VecIt++)
{
ntotal += (*VecIt)->area();
}
Return ntotal;
}
Class trangle :public shape
{
Public:
Trangle(){}
~trangle(){}
Int area();
Private:
Int m_nheigh;
Int m_nwidth;
}
/* 求三角形面积 */
Int Trangle::area()
{
Return m_nheigh*m_nwidth/2;
}
Class rectangle :public shape
{
Public:
Rectangle(){}
~rectangle(){}
Int area();
Private:
Int m_nheigh;
Int m_nwidth;
}
/* 求矩形面积 */
Int Rectangle::area()
{
Return m_nheigh*m_nwidth;
}