033054A1面向对象程序设计A卷
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
上海电机学院2012–2013学年第二学期
(033054A1)《面向对象程序设计》课程期末考试试卷开课学院:电子信息学院考试时间120 分钟A卷
计算器×草稿纸√答题卡√考试形式:闭卷√
考生姓名:学号:班级:
一、填空题(共18分,每空格1分)
1. 公共派生(public)中,基类的公有成员在派生类中是。
2. 若要使用标准输入流机制从键盘输入一个整数赋给整型变量a,相应的C++语句是。
3.函数重载可使一个函数名具有多种功能,称这种特性为。
4.C++中重载“+”运算符的函数名是。
5.设为类A添加一个纯虚函数Fun,其第一个参数类型为整型,第二个参数类型为字符型,函数返回值类型为整型。
实现此操作的语句是。
6.C++函数中按引用调用传递参数时使用作为参数。
7. 设A为test类的对象且赋有初值,则语句test B(A); 表示。
8.C++中istream类的直接基类是。
9.要关闭一个文件输出流对象myFile,所用的C++语句是。
10.静态成员函数访问类的静态数据成员,可以访问类的非静态数据成员和静态成员。
11.在私有派生中,基类的权限为private的成员,在派生类中。
12. 在常成员函数里不能更新对象的数据成员,也不能调用该类中没用关键字修饰的成员函数。
13.利用成员函数对二元运算符重载,其左操作数为,右操作数为成员函数参数。
14.假定AB为一个类,该类中构造函数含有一个语句 new申请存储空间,则在该类的析构函数中应该包含有一条______________语句。
15.C++根据文件内容的数据格式可分为两类: 文本文件和二进制文件。
前者存取的最小信息单位为,后者
16.引进虚基类的根本目的是为了消除。
二.选择题(每题1分,共18分)
1.构造函数用于()。
A.定义对象B.清除对象C.初始化对象D.普通计算
2.对于类中的成员,使用private修饰,表明该成员的访问权限是()。
A.公有的B.私有的C.保护的D.不可见的
3.如声明对象数组,则下列描述正确的是( ) 。
A.对每个元素均调用一次构造函数
B.部分元素调用构造函数,其它元素不需调用
C.均不需要调用构造函数
D.只是首元素调用构造函数
4.下列哪个要素不是面向对象的关键要素( ) 。
A. 继承性
B.抽象性
C.封装性
D. 模块化
5.下列对于类的描述错误的是( ) 。
A.类要先声明后使用
B. 类是具有唯一标识的实体
C.两个类可以使用同一个名称
D.组成类的不仅有数据,还可以有对数据进行操作的函数6.使用引用调用方式将实参传给形参,下列说法正确的是( ) 。
A.形参是实参的备份
B. 形参和实参共享同一对象
C. 实参是形参的备份
D.形参和实参无联系
7. 对类AA,复制构造函数的原型是( )。
A. AA::AA(const AA &);
B. AA::AA(const AA *);
C.AA::AA(const AA);
D.AA::AA( );
8.如果一个类至少有一个纯虚函数,那么就称该类为()。
A.派生类 B.基类C.抽象类 D.以上都不对
9. 友元的声明可出现在()。
A.类的私有部分B.类的公有部分C.类的保护部分D.类的任何部分
10. 类A中存在静态数据成员x,设a和b是类A的两个对象,在执行a.x=10之后,b.x
的值为( )。
A.未初始化
B.等于10
C.等于0
D.随机
11.C++中专门定义一个仅在模板中使用的参数类型的关键字是()。
A.const B.inline C.typename D.shor t
12.当派生类中有和基类一样名字的成员时,一般来说,()。
A. 将产生二义性
B. 派生类的同名成员将覆盖基类的成员
C. 是不能允许的
D. 基类的同名成员将覆盖派生类的成员
13.使用new创建的对象,对其生命周期描述正确的是()。
A.由用户控制B.由系统决定C.全局生命周期D.永久存在
14.析构函数被调用的时间点是()。
A.对象被创建时B.不会被调用C.对象被销毁时D.主函数被调用时15.read()函数的功能是从输入流中读取()。
A.一个字符B.当前字符C.指定若干字节D.一行字符
16.关于友元的描述中,()是错误的。
A.友元函数是成员函数,它被说明在类体内
B.友元函数可直接访问类中的私有成员
C.友元函数破坏封装性,使用时尽量少用
D.友元类中的所有成员函数都是友元函数
17.C++中的虚基类机制可以保证:()。
A. 限定基类只通过一条路径派生出派生类
B. 允许基类通过多条路径派生出派生类,派生类也就能多次继承该基类
C. 当一个类多次间接从基类派生以后,派生类对象能保留多份间接基类的成员
D. 当一个类多次间接从基类派生以后,其基类只被一次继承
18.类模板的模板参数()。
A.只能作为数据成员的类型B.只可作为成员函数的返回类型C.只可作为成员函数的参数类型D.以上三种均可
三、看程序,写出运行结果(共20分,每题4分)
1. #include<iostream>
using namespace std;
class point
{ int x,y;
public:
point(int n=1,int m=2)
{x=n; y=m; cout<<"Constructor "<<x<<","<<y<<endl;}
~ point(){cout<<"destructors."<<x<<","<<y<<endl;}
} ;
void main()
{
point P(3),Q(5,5);
cout<<"Entering main"<<endl;
}
2. #include<iostream.h>
class M
{ public:
M(int a) { A=a;B+=a;}
static void f1(M m);
private:
int A;
static int B;
};
void M::f1(M m)
{ cout<<"A="<<m.A<<endl; cout<<"B="<<B<<endl; }
int M::B=0;
void main( )
{ M P(4),Q(6); M::f1(P); M::f1(Q); }
3. #include<iostream.h>
class BB
{ int x,y;
public:
BB(int i=0,int j=1) { x=i; y=j;}
BB operator * (BB z)
{ BB d; d.x=10*x *z.x; d.y=10*y*z.y; return d;}
BB operator /(BB c)
{ BB d; d.x=10*x/c.x; d.y=10*y/c.y; return d;}
void show() {cout<<'('<<x<<','<<y<<')'<<endl;}
};
void main()
{ BB a(3,2) , b(2,5),c;
c=a*b; c.show();
c=a/b; c.show();
}
4. #include<iostream.h>
class CC
{ public:
CC(){cout<<"调用基类构造函数."<<endl;}
void show() {cout<<"调用基类函数show().\n"; }
};
class SUBCC: public CC
{ public:
SUBCC(){cout<<"调用派生类构造函数."<<endl;}
void show() {cout<<"调用派生类函数show().\n"; }
};
void main()
{ CC tem; SUBCC obj;
::show(); obj.show();
tem=obj; tem.show();
}
5. #include <iostream.h>
class DD
{ public:
virtual void display(){cout<<"DD::display()"<<endl;}
};
class DDA:public DD
{ public:
void display(){cout<<"DDA::display()"<<endl;}
};
class DDB:public DD
{ void display(){cout<<"DDB::display()"<<endl;}
};
void fun(DD *ptr) { ptr->display( );}
void main( )
{ DD b0,*p; DDA b1; DDB d1;
p=&b0; fun(p); p=&b1; fun(p); p=&d1; fun(p);
}
四.程序填空(每空2分,共12分)
1.定义一个字符串onestr,包含一个存放字符串的成员变量,能够通过构造函数初始化字符串,通过成员函数显示字符串的内容。
在此基础上派生twostr类,增加一个存放字符串的成
员变量,并能够通过派生类的构造函数传递参数,初始化两个字符串,通过成员函数进行两个字符串的合并以及输出。
#include<iostream.h>
#include<string.h>
class onestr
{ protected:
char str1[30];
public:
onestr(char *p)
{strcpy(str1,p);}
};
class twostr: public (1)
{ char str2[40];
public:
twostr(char *q1,char *q2): (2)
{strcpy(str2,q2);}
void display(){ strcat(str2,str1); cout<<str2<<endl;}
};
void main()
{ twostr ch("This ia a string.","Shanghai.");
(3) ; //显示对象ch值
}
2. 将0~100之间的整数写入D盘上的write1.dat文件。
#include < iostream.h >
#include < stdlib.h >
#include < fstream.h >
void main ()
{ ofstream (1) ;
file1.open ( "A:\\write1.dat " ) ;
if ( ! file1 )
{ cerr << "\n d:\\write1.dat not open " << endl ;
exit (-1) ; }
for (int k=0 ; k<=100 ; k++ )
(2) << k << " " ;
file1. (3) ;
}
五.编写程序题(32分,每题8分)
1. 定义一个日期类date,它有三个私有数据成员:年、月、日和若干个成员函数,并实现如下要求:
(1)用构造函数对数据成员赋值;
(2)定义一个函数打印日期(输出格式年.月.日)。
并要求对数据输入、输出。
2. 利用成员函数重载运算符,使对整形数的运算符+、-适用于分数运算。
要求进行数据输入输出。
3.建立一个基类Building ,用来存储一座楼房的层数、房间数以及它的总平方英尺数。
建立派生类Housing,继承Building,并存储下面的内容:卧室(bedrooms)和浴室(bathrooms)的数量,另外,建立派生类Office,继承Building,并存储灭火器(extinguishers)和电话(phones)的数目。
然后,编制应用程序,建立住宅楼对象和办公楼对象,并输出它们的有关数据。
程序代码:
4. 应用抽象类,求圆、圆内接正方形和圆外切正方形的面积。