C期末复习试卷A
我们都是成功者-祝福话语
计算机科学与技术
信息管理与信息系统
专业《面向对象程序设计》试卷(卷)(闭
卷) A
C++
题号
分值
得分
一
10
二
20
三
四
五
25
1
总分
100
20
11 25
学号班级姓名
分)小题,每小题1分)(共10一、判断题:(10
重载函数必须有不同的参数列表。1.
私有继承中,基类中所有成员在派生类成员函数中都不可以访问。2.
动态绑定的多态性必须通过虚函数实现。3.
友元函数的声明在类体内,它是一种成员函数。4.
~CDate();中的析构函数可以声明为:void 在类 CDate 5.
中,只能重载已有的运算符。在 C++6.
引用和指针都可作为函数参数。7.
可以在类的构造函数中对静态成员进行初始化。8.
运算符分配的内存。new delete
释放不是用 9. 可以用
内联函数相比普通函数的优点是直接
将函数体展开,因此省去函数调用栈的开销。10.
分)小题,每小题2(共(20分)10二、单选题:
说明对象或变量初始化后不会被修改。 关键字 ____________1. inlineconst
D. B. public C.
staticA.
。C++
中,用于解决二义性问题的技术是_______2. 函数重载 B. A. 虚函数 虚继承D. C.
静
态函数 的默认值就作为这一参数值。如果调用带有默认参数的函数时缺少一个参数,则
__
____________3.
以上都不是 中间一个 D.B.A. 第一个
最后一个 C. __________________。4.
要让一个类的
所有对象具有共同的数据,要使用 私有数据成员 B. A. 静态数据成员
保护数据成员D. C. 公有
数据成员
。是一个自定义的类,请问以下代码调用拷贝构造函数的次数是A __________已知5.
pa){f(A* A&
A(); new =pa
*pa;return
}
int main()
{
A a
= f(NULL);
return 0;
}
A. 0 次 B. 1
次
C. 2 次 D. 3 次
6. 假定要对类 A 的对象 a、b 和 c
执行以下操作:
c = a+ b;
必须要重载加号运算符函数,以下写在 A
类体内的声明语句哪个能满足要求_________。
A
operator+ (A& a, (A& b); B.A& b); A. operator+
friend A & operator+D. ( A& b);
(A&C. friend A operator+ a, A& b);
float y,*q;则下面操作正确的是_________。 7. 如果有 int
x,*p;A. p=x B. p=q
C. p=&x D. p=&y
8.
模板的主要用途是为了_________。
A. 提高代码的可重用性
B.
提高代码的运行效率
C. 实现多态性
D. 加强类的封装性
9.
C++源文件的扩展名是____________。
A. .c B. .dsw C.
.dsp D. .cpp
10. 若已定义了 A 类的构造函数 A(int a=0);
以下关于 new 运算符的用法错误的是________。
A. A* p = new A;
B. A* p = new A(1); C. A* p=new A[1] D. A* p = new
A (1) [1];
三、填空题:(20分)(共10个空格,每格2分)
1.
已知以下程序的输出结果为:
name: crq
name: carter
请将程序补充完整
#include
#include
class A{
char*
name;
public:
void PrintName() { (1)
;}
(3)
(4)~A(){ }
public:
B( (5) ) :A(n){}
}; ){int main(
Bb1(crq), b2(carter); ame(); ame(); }
{
name) A(char* (2)
}
};A{
public B: class
2.
定义一个函数模板,能够完成数组元素的求和,将以下程序补充完整: template< (6)
>
n){T sum( ,
int(7)
i=0;i
s;return }
(8)
”的前缀方式和后缀方式的成员运算符函数形式的声明语请分别写出类 A 的一元运算符“++ 3.
句: 。(9) 、 (10)
分)2分,第小题15四、程序分析题:(25分)(共2小题,第1小
题10
1. 分析程序,写出运行结果,并分析原因 #include
Base{class y,m,d;int
public: _m; d = _d;} _y=1,int _m=2, int
_d=3){y= _y; m =Base(int ???
捻畯?礼? ?洼?
<
};
public Base{Derived:class
double y,m,d; public: Base(y,m,d),y(y),m(m),d(d)
d=3): { }doubledoubleDerived(double y=1,
m=2,
<
}; main(){int
4.5);a(3.5,Derived
c=a; a, = b Base&
();
();
(20.5);
return 0;
}
2. 分析程序,完成:
(1)写出程序的运行结果,并分析原因;
(2)程序没有编译错误,但程序仍然存在内存管理方面的问题,请指出错误之处,分析错误的
原因并进行改正。
#include
using
namespace std;
class A{
public:
A(int a=5) { cout<
class B: public A{
char *buf;
public:
B(int a){
A::A(15);
buf=(char*)malloc(a);
cout<
~B(){
free(buf);
cout<
};
int main(){
A* a=new
B(10);
delete a;
return 0;
}
五、程序设计题:(25分)
1. 编写程序,要求:
(1)定义抽象基类
CShape,由它派生出五个派生类:Circle(圆形)、Square(正方形)、
Rectangle(长方形)、Trapezoid(梯形)和
Triangle(三角形),用虚函数分别计算各种图形的面
积,并对它们按从大到小排序。
(2)要求用基类指针数组。使它的每一个元素指向一个派生类的对象。
注:主函数中定义如下对象:
circle(1.5);Circle
square(2.5);Square
rectangle(1.5,
Rectangle2.5);
Trapezoid trapezoid(1.5, 2.5,
1.0);
Triangle triangle(3.0, 4.0);
台州学院学年第学期2 0
计算机科学与技术
卷参考答案级专业《面向对象程序设计》试卷
信息管理与信息系统
C++A10
分)10小题,每小题1 一、判断题:(10分)(共
5 6 7 8
910 4 1 2 3
FF T TT FF F T T
分)小题,每小题2二、单选题:(20分)(共10
6 7 8 9 10 1 2
34 5
DB A B DA C C CD
(共2分)10三、填空题:个空格,每格(分)20(2)this->name = new
(1)cout<<
ame: <
char[strlen(name)+1]_
(3)_
strcpy(this->name,name)_ (4)_________ delete []
name; _
________
(5)____ char* n ______ (6) typename T
(7) T a[] (8)_____ T s = 0;
_______
(9)__________ A&
operator++() (10)__________ A&
operator++(int)_______
四、程序分析题:(25分)(共2小题,第1小题10分,第2小题15分)
1、
对象a的初始值为3.5 4.5 3,其中第三个参数默认值,初始化列表
3 2.5
4.5
里调用了基
类的构造函数,因此通过b和c访问到的成员值是3 4 3
3
41
()调用派生类函数,并修
改y值为2.5
34 20
()调用基类函数,并修改基类的y值为1
(20.5);调用基类函数,并修改基类的y值为20 2、
(1)构造对象时先调用基类构
造函数,再调用派生类构造函数;如
A::A(5)call
果没有在初始化列表中显式调用,则调用默认的基类构造函数;析
A::A(15)call
构函数的顺序与构造函数相反
A::~A(15)
call
(2)基类里的析构函数不是虚函数,通过基类的
指针指向派生类对
B::B(10)
call
象时,只会调用基类的析构函数,派生类的析构函数不会被调
用,
A::~A(5)call
导致了派生类对象指针的内存泄露,基类的析构函数加上virtual变
的多态性,能够解决问题。C++成虚函数后,由于
五、程序设计题:(25分)
程序设计基本代码框架10分,程序细节处理15分。
参考代码如下:
#include
#include
using namespace std;
class Shape
{
public:
virtual double area()
const =0;
};
class Circle:public
Shape
{
public:
Circle(double
r):radius(r){}
virtual double area() const
{return 3.14159*radius*radius;};
protected:
double radius;
};
class
Square:public Shape
{
public:
Square(double s):side(s){}
virtual double
area() const {return side*side;}
protected:
double side;
};
class
Rectangle:public Shape
{
public:
Rectangle(double w,double
h):width(w),height(h){}
virtual double area()
const {return width*height;}
protected:
double width,height;
};
class
Trapezoid:public Shape
{
public:
Trapezoid(double t,double b,double
h):top(t),bottom(t),height(h){}
virtual
double area() const {return
0.5*(top+bottom)*height;}
protected:
double top,bottom,height;
};
class Triangle:public Shape
{
public:
Triangle(double w,double
h):width(w),height(h){}
virtual double area()
const {return 0.5*width*height;}
protected:
double width,height;
};
bool
cmp(Shape* a, Shape* b)
{
return
a->area()>b->area();
}
int main()
{
Circle circle(1.5);
Square
square(2.5);
Rectangle rectangle(1.5, 2.5);
Trapezoid trapezoid(1.5, 2.5, 1.0);
Triangle triangle(3.0, 4.0);
Shape *pt[5]
={&circle,&square,&rectangle,&trapezoid,&triangle}
;
sort(pt,pt+5,cmp);
for(int
i=0;i<5;i++)
{
cout<
return
0;
}