《面向对象程序设计C--》期末试卷及标准答案集总解析
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《面向对象程序设计C++》期末考试试卷(B)
班级:姓名:学号:分数:
试卷说明:本套试题共四个大题,全部题目都答在答题纸上,写在其他地方均无效。
(答题纸在本套试卷的第8页上)
一、单项选择题(每小题2分,共40分)
1、关于C++与C语言关系的描述中,( D )是错误的。
A.C语言是C++语言的一个子集B.C语言与C++语言是兼容的
C.C++语言对C语言进行了一些改进D.C++语言和C语言都是面向对象的2、已知:int m=10; 下列表示引用的方法中,(A )是正确的。
A.int &x=m; B.int &y=10; C.int &z; D.float &t=&m;
3、考虑下面的函数原型声明:void testDefaulParam(int a,int b=7,char z='*');
下面函数调用中,不合法的是( C )。
A.testDefaulParam(5); B.testDefaulParam(5,8); C.testDefaulParam(5,'#'); D.testDefaulParam(0,0,'*');
4、系统在调用重载函数时往往根据一些条件确定哪个重载函数被调用,在下列选项中,不能作为依据的是( A )。
A.函数的返回值类型B.参数的类型C.函数名称D.参数个数5、下列有关C++类的说法中,不正确的是( D )。
A.类是一种用户自定义的数据类型
B.只有类中的成员函数或类的友元函数才能存取类中的私有成员
C.在类中,如果不做特别说明,所有成员的访问权限均为私有的
D.在类中,如果不做特别说明,所有成员的访问权限均为公用的
6、已知X类,则当程序执行到语句X array[3];时,调用了(D )次构造函数。
7、有关析构函数的说法,不正确的是( B )。
A.析构函数有且仅有一个
B.析构函数和构造函数一样可以有形参
C.析构函数的功能是在系统释放对象之前作一些内存清理工作
D.析构函数无任何函数类型
8、类定义的内容允许被其对象无限制地存取的是( C )。
A.private 部分B.protected 部分C.public 部分D.以上都不对9、关于常数据成员的说法,不正确的是()。
A.常数据成员的定义形式与一般常变量的定义形式相同,只不过常数据成员的定义必须出现在类体中
B.常数据成员必须进行初始化,并且不能被更新
C.常数据成员通过构造函数的成员初始化列表进行初始化
D.常数据成员可以在定义时直接初始化
10、运用运算符delete删除一个动态对象时()。
A.系统首先为该动态对象调用构造函数,再释放其占用的内存
B.系统首先释放该动态对象占用的内存,再为其调用构造函数
C.系统首先为该动态对象调用析构函数,再释放其占用的内存
D.系统首先释放动态对象占用的内存,再为其调用析构函数
11、可以在类外用p.a的形式访问派生类对象p的基类成员a,其中a是(D )。
A.私有继承的公用成员B.公用继承的私有成员
C.公用继承的保护成员D.公用继承的公用成员
12、在公用继承方式下,有关派生类对象和基类对象的关系,不正确的叙述是()。
A.派生类的对象可以赋给基类的对象
B.派生类的对象可以初始化基类的引用
C.派生类的对象可以直接访问基类中的成员
D.派生类的对象的地址可以赋给指向基类的指针
A.简化程序B.消除二义性C.提高运行效率D.减少目标代码14、在C++中,用于实现动态多态性的是(D )。
A.内联函数B.重载函数C.模板函数D.虚函数
15、不能说明为虚函数的是()。
A.析构函数B.构造函数C.类的成员函数D.以上都不对
16、如果一个类至少有一个纯虚函数,那么就称该类为()。
A.抽象类B.派生类C.纯基类D.以上都不对
17、下面关于友元的描述中,错误的是()。
A.友元函数可以访问该类的私有数据成员
B.一个类的友元类中的成员函数都是这个类的友元函数
C.友元可以提高程序的运行效率
D.类与类之间的友元关系可以继承
18、下列运算符中,()运算符在C++中不能被重载。
A.&& B.[] C.:: D.new
19、模板的使用实际上是将类模板实例化成一个()。
A.函数B.对象C.类D.抽象类
20、假定MyClass为一个类,则该类的拷贝构造函数的声明语句为()。
A.MyClass(MyClass x) B.MyClass&(MyClass x)
C.MyClass(MyClass &x) D.MyClass(MyClass *x)
二、填空题(前16个空,每空1分,后2个空,每空2分,共20分)
1、类和对象的关系可表述为:类是对象的,而对象则是类的。
2、在C++中,三种继承方式的说明符号为、和,如果不加说明,则默认的继承方式为。
3、如果只想保留公共基类的一个复制,就必须使用关键字把这个公共基类声明为虚基类。
4、若要把void fun()定义为类A的友元函数,则应在类A的定义中加入语
5、类的静态成员分为和。
6、运算符重载要求保持其原来的操作数个数、、和语法结构。
7、通过关键字可以声明模板,通过关键字指定函数模板的类型参数,有几个类型参数就有几个类型关键字。
8、列出C++中两种用户自定义的数据类型:、。
9、构造函数的作用是。
10、后置自增运算符“++”重载为类的成员函数(设类名为A)的形式为。
三、阅读下面3个程序,写出程序运行时输出的结果:(共13分)
1、#include<iostream >
using namespace std;
void fun(int &a,int &b)
{ int p;
p=a; a=b; b=p;
}
void exchange(int &a,int &b,int &c)
{ if(a<b)fun(a,b);
if(a<c)fun(a,c);
if(b<c)fun(b,c);
}
int main()
{ int a=12,b=89,c=56;
exchange(a,b,c);
cout<<"a="<<a<<",b="<<b<<",c="<<c<<endl;
return 0;
}
class Date
{public:
Date(int,int,int);
Date(int,int);
Date(int);
Date();
void display();
private:
int month, day, year;
};
Date::Date(int m,int d,int y):month(m),day(d),year(y) { } Date::Date(int m,int d):month(m),day(d) {year=2009;}
Date::Date(int m):month(m){day=1; year=2010; }
Date::Date() {month=1; day=1; year=2010; }
void Date::display(){cout<<month<<"/"<<day<<"/"<<year<<endl;} int main()
{ Date d1(12,31,2009);
Date d2(12,31);
Date d3(1);
Date d4;
d1.display();
d2.display();
d3.display();
d4.display();
return 0; }
class A
{ public:
A(){cout<<"constructing A "<<endl;}
~A(){cout<<"destructing A "<<endl;}};
class B: public A
{ public:
B(){cout<<"constructing B "<<endl;}
~B(){cout<<"destructing B "<<endl;}};
class C : public B
{ public:
C(){cout<<"constructing C "<<endl;}
~C(){cout<<"destructing C "<<endl;}};
int main()
{ C c1;
return 0;
}
四、编程题(共27分)
1、(10分)已知复数类Complex的声明如下:
class Complex
{public:
Complex(); //无参构造函数
Complex(double ); //转换构造函数
Complex(double, double);//有两个形参的构造函数
friend Complex operator+(Complex&, Complex&); //对“+”运算符进行重载friend ostream& operator<<(ostream&, Complex&); //对“<<”运算符进行重载
private:
double real,imag;
};
要求:(1)写出该类的所有构造函数的类外定义代码。
(2)写出对运算符“+”、“<<”、“>>”进行重载的运算符重载函数的定义。
2、(17分)下列Shape类是一个表示形状的抽象类,area( )为求图形面积的函数,total( )则是一个通用的用以求不同形状的图形面积总和的函数。
class Shape
{public:
virtual double area()=0;
};
double total(Shape *s[ ], int n)
{ double sum=0.0;
for(int i=0; i<n; i++) sum+=s[i]->area( );
return sum;
}
要求:(1)从Shape类派生圆类(Circle)、正方形类(Square),圆类新增数据成员半径(radius),正方形类新增数据成员边长(a),圆类和正方形类都有构造函数,修改、显示数据成员值的函数,求面积函数。
(2)写出main()函数,计算半径为5.5的圆和边长为9.9的正方形的面积和(必须通过调用total函数计算)。
《面向对象程序设计C++》期末考试试卷(B)标准答案
班级:姓名:学号:分数:
一、单项选择题(每小题2分,共40分)
1-5.D A C A D6-10.D B C D C
11-15.D C B D B16-20.A D C C C
二、填空题(前16个空,每空1分,后2个空,每空2分,共20分)
1.抽象、实例
2.public 、private _ ___、protected 、private _ ___ 3.virtual ___ 4.friend void fun(A &a) _ 5.静态数据成员、静态成员函数6.结合性、优先级_ ___ 7.Template 、 class(或typename) 8.类、结构体___ 9.在创建对象时初始化对象的数据成员___ 10. A operator++(int)___
三、阅读程序(共13分)
1、a=89,b=56,c=12
2、12/31/2009
12/31/2009
1/1/2010
1/1/2010
3、constructing A
constructing B
constructing C
destructing C
destructing B
destructing A
四、编程题(共27分)
1、(10分)
Complex::Complex(){real=0;imag=0;}
Complex::Complex(double r){real=r;}
Complex::Complex(double r,double i){real=r;imag=i;} Complex operator+(Complex &c1,Complex &c2)
{ Complex c;
c.real=c1.real+c2.real; c.imag=c1.imag+c2.imag;
return c;
}
ostream& operator << (ostream& output,Complex& c)
{ output<<"("<<c.real<<"+"<<c.imag<<"i)"<<endl;
return output;
}
istream& operator >> (istream& input,Complex& c)
{ cout<<"input real and imaginary part of complex number:";
input>>c.real>>c.imag;
return input;
2、(17分)
class Circle:public Shape
{public:
Circle(double r){radius=r;}
void set()
{ cout<<"Please input the value of the circle:"<<endl;
cin>>radius;
}
void show()
{ cout<<"the radius of the circle="<<radius<<endl; }
double area() {return 3.14159*radius*radius;} private:
double radius;
};
class Square:public Shape
{public:
Square(double a){this->a=a;}
void set()
{ cout<<"Please input the value of a:"<<endl;
cin>>a;
}
void show()
{ cout<<"a="<<a<<endl; }
double area(){return a*a;}
private:
double a;
int main()
{
Circle C(5.5);
C.show();
Square S(9.9);
S.show();
Shape *s[]={&C,&S};
cout<<"total="<<total(s,2)<<endl;
return 0;
}
《面向对象程序设计C++》期末考试试卷
一、选择题(每小题3分,共48分。
)
01、下列关于C++函数的叙述中,正确的是( C )。
A)每个函数至少要具有一个参数 B)每个函数都必须返回一个值
C)函数在被调用之前必须先声明 D)函数不能自己调用自己
02、下列关于类和对象的叙述中,错误的是( A )。
A)一个类只能有一个对象 B)对象是类的具体实例 C)类是对某一类对象的抽象 D)类和对象的关系是一种数据类型与变量的关系
03、在C++中,用于实现运行时多态性的是(D )。
A)内联函数 B)重载函数 C)模板函数D)虚函数
04、下列关于运算符重载的叙述中,正确的是(B )。
A)通过运算符重载,可以定义新的运算符 B)有的运算符只能作为成员函数重载
C)若重载运算符+,则相应的运算符函数名是+ D)重载二元运算符时,必须声明两个形参
05、对于语句 cout<<x<<endl;错误的是描述是(D )。
A)“cout”是一个输出流对象B)“endl”的作用是输
出回车换行
C)“x”是一个变量D)“<<”称作提取运算
符
06、有如下类声明,则类MyDERIVED中保护的数据成员和成员函数的个数是( )。
class MyBASE
{ private: int k;
public: void set(int n){ k=n;}
int get( )const{ return k;} };
class MyDERIVED: protected MyBASE
{ protected: int j;
public: void set(int m, int n){ MyBASE::set(m); j=n;}
int get( ) const { return MyBASE::get( )+j; } };
A)4 B)3 C)2 D)1
07、已知在一个类体中包含如下函数原型: Volume
operator-(Volume)const;,下列关于这个函数的叙述中,错误的是( B )。
A)这是运算符-的重载运算符函数B)这个函数所重载的
运算符是一个一元运算符
C)这是一个成员函数D)这个函数不改变类
的任何数据成员的值
08、执行如下的程序段后,输出结果是( C )。
cout.fill('*'); cout.width(6); cout.fill('#'); cout << 123 << endl;
A)###123 B)123### C)***123 D)123***
09、在下列函数原型中,可以作为类AA构造函数的是(B )。
A)void AA(int); B)int AA(); C)AA(int)const;
D)AA(int);
10、下面四个选项中,( A)是用来声明虚函数的。
A)virtual B)public C)include D)using namespace
11、实现运行时的多态性要使用( D )。
A)重载函数 B)构造函数 C)析构函数D)虚函数
12、要实现动态联编,必须通过( )调用虚函数。
A)对象指针 B)成员名限定 C)对象名 D)派生类
名
13、以下( C )成员函数表示纯虚函数。
A)virtual int vf(int); B)void vf(int)=0;
C)virtual void vf()=0; D)virtual void vf(int){}
14、有如下类声明:class XA
{ private: int x;
public: XA(int n){ x=n;} };
class XB: public XA
{ private: int y;
public: XB(int a,int b); };
在构造函数XB的下列定义中,正确的是( )。
A)XB::XB(int a,int b): x(a),y(b){ } B)XB::XB(int a,int b): XA(a),y(b){ }
C)XB::XB(int a,int b): x(a),XB(b){ } D)XB::XB(int a,int b): XA(a),XB(b){ }
15、在表达式 x+y*z中, + 是作为成员函数重载的运算符,* 是作为非成员函数重载的运算符。
则 operator+ 有个参数,operator* 有参数。
( )
A)2、2 B)2、1 C)1、2 D)1、1
16、应在下列程序划线处填入的正确语句是( )。
class Base
{ public:
void fun(){cout<<"Base::fun"<<endl;} };
class Derived:public Base
{ void fun()
{ //显示调用基类的函数fun()
cout<<"Derived::fun"<<endl; } };
A)fun(); B)Base.fun(); C)Base::fun(); D) Base->fun();
二、填空题(每空2分,共20分。
)
17、继承、多态性18、友元19、私有
20、private或私有 21、成员、友元
22、width/setw 23、抽象类
17、面向对象程序设计有四个主要特点,即抽象、封装、_多态性___和_继承性__。
18、非成员函数应声明为类的_友元___函数才能访问这个类的private成员。
19、派生类中的成员不能直接访问基类中的_私有、成员。
20、在用class定义一个类时,数据成员和成员函数的默认访问权限是私有。
21、运算符重载函数可能是类的__友元_函数,也可以是类的__成员__函数,还可以是普通函数。
22、用流对象的成员函数控制输出格式时,用于设置字段宽度的流成员函数的名称是_width___,与之作用相同的控制符名称是__setw__。
23、含有纯虚函数的类称为__抽象类。
四、编程题(12分)
29、编写一个程序计算“三角形、正方形、圆形”三种图形的面积,要求:
a)抽象出一个基类base;b)在其中说明一个虚函数用来求面积;c)利用派生类定义“三角形、正方形、圆形”;d)编写主函数并测试。
参考答案
一、选择题(每小题3分,共48分。
)
01-05 C A D B D
06-10 B B A D A
11-16 D A C B C C
三、程序的填空、程序的执行(每题4分,共20分。
)
24、counter operator + (counter c)
25、virtual
26、23,23
27、ABC
28、XY
四、编程题(12分)
29、
#include <iostream>
using namespace std;
class base
{ public:
virtual float area() const
{ return 0; }
};
class triangle: public base
{ protected:
float bian,height;
public:
triangle(float a=0, float h=0) { bian=a; height=h; } virtual float area() const
{ return bian*height/2; }
};
class square: public base
{ protected:
float bian;
public:
square(float a=0) { bian=a; }
virtual float area() const
{ return bian*bian; }
};
class circle: public base
{ protected:
float radius;
public:
circle(float r=0) { radius=r; }
virtual float area() const
{ return 3.14*radius*radius; }
};
int main()
{ triangle t(3,4); square s(5); circle c(2);
base *p;
p=&t; cout<<"triangle's area:"<<p->area()<<endl; p=&s; cout<<"square's area:"<<p->area()<<endl; p=&c; cout<<"circle's area:"<<p->area()<<endl; return 0;
}
《面向对象程序设计C++》期末考试试卷(A)
班级:姓名:学号:分数:
试卷说明:本套试题共四个大题,全部题目都答在答题纸上,写在其他地方均无效。
(答题纸在本套试卷的第10页上)
一、选择题(每小题2分,共40分)
1、C++是()。
A. 面向对象的程序设计语言
B. 面向过程的程序设计语言
C. 既支持面向对象的程序设计又支持面向过程的程序设计的混合型语言
D. 非结构化的程序设计语言
2、面向对象程序设计思想的主要特征中不包括()。
A. 封装性
B. 多态性
C. 继承性
D. 功能分解,逐步求精
3、若定义:string str; 当语句cin>>str; 执行时,从键盘输入:
Microsoft Visual Studio 6.0!
所得的结果是str=()。
A. Microsoft Visual Studio 6.0!
B. Microsoft
C. Microsoft Visual
D. Microsoft Visual Studio 6.0
4、考虑下面的函数原型声明:void testDefaulParam(int a,int b=7,char z='*');
下面函数调用中,不合法的是()。
A. testDefaulParam(5);
B. testDefaulParam(5,8);
C. testDefaulParam(5,'#');
D. testDefaulParam(0,0,'*');
5、下列语句中,将函数int sum(int x, int y)正确重载的是()。
A. float sum(int x, int y);
B. int sum(int a, int b);
C. float sum(float x, float y);
D. double sum(int y, int x);
6、下列表示引用的方法中,()是正确的。
已知:int a=1000;
A. int &x=a;
B. char &y;
C. int &z=1000;
D. float &t=&a;
7、在一个函数中,要求通过函数来实现一种不太复杂的功能,并且要求加快执行速度,选用()。
A. 内联函数
B. 重载函数
C. 递归调用
D. 嵌套调用
8、下列有关C++类的说法中,不正确的是()。
A. 类是一种用户自定义的数据类型
B. 只有类中的成员函数或类的友元函数才能存取类中的私有成员
C. 在类中,如果不做特别说明,所有成员的访问权限均为私有的
D. 在类中,如果不做特别说明,所有成员的访问权限均为公用的
9、已知X类,则当程序执行到语句:X array[3];时,调用了()次构造函数。
A. 0
B. 1
C. 2
D. 3
10、下面说法中,正确的是()
A. 一个类只能定义一个构造函数,但可以定义多个析构函数
B. 一个类只能定义一个析构函数,但可以定义多个构造函数
C. 构造函数与析构函数同名,只要名字前加了一个求反符号(~)
D. 构造函数可以指定返回类型,而析构函数不能指定任何返回类型,即使是void 类型也不可以
11、已知:print( )函数是一个类的常成员函数,它无返回值,下列表示中,()是正确的。
A. void print( ) const;
B. const void print( );
C. void const print( );
D. void print(const);
12、下面描述中,表达错误的是()
A. 公用继承时基类中的public成员在派生类中仍是public的
B. 公用继承时基类中的private成员在派生类中仍是private的
C. 公用继承时基类中的protected成员在派生类中仍是protected的
D. 私有继承时基类中的public成员在派生类中是private的
13、设置虚基类的目的是()。
A. 简化程序
B. 消除二义性
C. 提高运行效率
D. 减少目标代码
14、下面()的叙述不符合赋值兼容规则。
A. 派生类的对象可以赋值给基类的对象
B. 基类的对象可以赋值给派生类的对象
C. 派生类的对象可以初始化基类的对象
D. 派生类的对象的地址可以赋值给指向基类的指针
15、关于虚函数的描述中,()是正确的。
A. 虚函数是一个static类型的成员函数
B. 虚函数是一个非成员函数
C. 基类中说明了虚函数后,派生类中与其对应的函数可不必说明为虚函数
D. 派生类的虚函数与基类的虚函数具有不同的参数个数和类型
16、下面关于友元的描述中,错误的是()。
A. 友元函数可以访问该类的私有数据成员
B. 一个类的友元类中的成员函数都是这个类的友元函数
C. 友元可以提高程序的运行效率
D. 类与类之间的友元关系可以继承
17、下列关于静态数据成员的说法,不正确的是()。
A. 类中定义的公用静态数据成员,可以通过类的对象来访问
B. 类中定义的所有静态数据成员,都必须在类外初始化
C. 静态数据成员不是所有对象所共用的
D. 普通的成员函数可以直接访问类中的静态数据成员
18、如果表达式++i*k中的“++”和“*”都是重载的友元运算符,若采用运算符函数调用格式,则表达式还可以表示为()。
A. operator*(i.operator++(),k)
B. operator*(operator++(i),k)
C. i.operator++().operator*(k)
D. k.operator*(operator++(i))
19、下面对模板的声明,正确的是()。
A. template<T>
B. template<class T1, T2>
C. template<class T1, class T2>
D. template<class T1; class T2>
20、下列的各类函数中,()不是类的成员函数
A. 构造函数
B. 析构函数
C. 友元函数
D. 复制构造函数
二、填空题(前14个空,每空1分,后3个空,每空2分,共20分)
1、类和对象的关系可表述为:类是对象的,而对象则是类的。
2、静态成员函数没有隐含的,所以,在C++程序中,静态成员函数主要用来访问静态数据成员,而不访问非静态成员。
3、在图1中,A,B,C,D,E,F均是类,其中属于单继承的派生类有,属于多继承的派生类有,类F的基类有,类A的派生类有。
A B C
D E
F
图1 类的继承层次图
4、如果只想保留公共基类的一个复制,就必须使用关键字把这个公共基类声明为虚基类。
5、从实现的角度来讲,多态性可以划分为两类:和。
6、如果一个类包含一个或多个纯虚函数,则该类称为。
7、若要把void fun()定义为类A的友元函数,则应在类A的定义中加入语句。
8、列出C++中的两种代码复用方式:和。
9、析构函数的作用是。
10、假定A是一个类名,则该类的拷贝构造函数的原型说明语句为:。
11、后置自增运算符“++”重载为类的成员函数(设类名为A)的形式为:。
三、阅读下面4个程序,写出程序运行时输出的结果。
(共13分)
1、
#include<iostream >
using namespace std;
void fun(int &a, int &b)
{ int p;
p=a; a=b; b=p;
}
void exchange(int &a, int &b, int &c)
{ if( a<b ) fun(a, b);
if( a<c ) fun(a, c);
if( b<c ) fun(b, c);
}
int main()
{ int a=12,b=89,c=56;
exchange(a, b, c);
cout<<"a="<<a<<",b="<<b<<",c="<<c<<endl;
return 0;
}
2、
#include <iostream>
using namespace std;
class A {
public:
A( ) { cout << "A"; }
};
class B {
public:
B( ) { cout <<"B"; }
};
class C: public A {
public:
C( ) { cout << "C"; }
private:
B b;
};
int main ( ) {
C obj;
return 0;
}
3、
#include <iostream>
using namespace std;
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;
};
int main()
{ A *a=new B(15);
delete a;
return 0;
}
4、
#include <iostream>
using namespace std;
class A
{public:
void f(){cout<<"Call A's function f()"<<endl;} };
class B
{public:
void f() {cout<<"Call B's function f()"<<endl;} void g() {cout<<"Call B's function g()"<<endl;} };
class C: public A, public B
{public:
void g(){cout<<"Call C's function g()"<<endl;} };
int main()
{ C cc;
cc.B::f();
cc.B::g();
cc.g();
return 0;
}
四、编程题(27分)
1、(10分)已知复数类Complex的声明如下:
class Complex
{public:
Complex(); //无参构造函数
Complex(double ); //转换构造函数
Complex(double, double); //有两个形参的构造函数
friend Complex operator+(Complex&, Complex&); //对“+”运算符进行重载friend ostream& operator<<(ostream&, Complex&); //对“<<”运算符进行重载friend istream& operator>>(istream&, Complex&); //对“>>”运算符进行重载private:
double real,imag;
};
要求:(1)写出该类的所有构造函数的类外定义代码。
(2)写出对运算符“+”、“<<”、“>>”进行重载的运算符重载函数的定义。
2、(17分)下列Shape类是一个表示形状的抽象类,area( )为求图形面积的函数,total( )则是一个通用的用以求不同形状的图形面积总和的函数。
class Shape
{public:
virtual double area()=0;
};
double total(Shape *s[ ], int n)
{ double sum=0.0;
for(int i=0; i<n; i++) sum+=s[i]->area( );
return sum;
}
要求:(1)从Shape类派生圆类(Circle)、正方形类(Square),圆类新增数据成员半径(radius),正方形类新增数据成员边长(a),圆类和正方形类都有构造函数,修改、显示数据成员值的函数,求面积函数。
(2)写出main()函数,计算半径为5.5的圆和边长为9.9的正方形的面积和(必须通过调用total函数计算)。
《面向对象程序设计C++》期末考试试卷(A)标准答案
班级:姓名:学号:分数:
一、单项选择题(每小题2分,共40分)
1-5.C D B C C6-10.A A D D B
11-15.A B B B C16-20.D C B C C
二、填空题(前14个空,每空1分,后3个空,每空2分,共20分)
1.抽象实例 2. this指针
3. E D、F A、B、C、D、E D、F 4. virtual 5.静态多态性动态多态性
6. 抽象类
7. friend void fun(A &a)
8. 继承组合或模板
9. 在对象被系统释放之前做一些内存清理工作
10. A(const A&) 11. A operator++(int)
三、阅读程序(13分)
1、a=89,b=56,c=12
2、ABC
3、A::A() called.
B::B() called.
B::~B() called.
A::~A() called.
4、Call B's function f()
Call B's function g()
Call C's function g()
四、编程题(共27分)
1、(10分)
Complex::Complex(){real=0;imag=0;}
Complex::Complex(double r){real=r;}
Complex::Complex(double r,double i){real=r;imag=i;} Complex operator+(Complex &c1,Complex &c2)
{ Complex c;
c.real=c1.real+c2.real; c.imag=c1.imag+c2.imag;
return c;
}
ostream& operator << (ostream& output,Complex& c)
{ output<<"("<<c.real<<"+"<<c.imag<<"i)"<<endl;
return output;
}
istream& operator >> (istream& input,Complex& c)
{ cout<<"input real and imaginary part of complex number:";
input>>c.real>>c.imag;
return input;
}
2、(17分)
class Circle:public Shape
{public:
Circle(double r){radius=r;}
void set()
{ cout<<"Please input the value of the circle:"<<endl;
cin>>radius;
}
void show()
{ cout<<"the radius of the circle="<<radius<<endl; } double area() {return 3.14159*radius*radius;} private:
double radius;
};
class Square:public Shape
{public:
Square(double a){this->a=a;}
void set()
{ cout<<"Please input the value of a:"<<endl;
cin>>a;
}
void show()
{ cout<<"a="<<a<<endl; }
double area(){return a*a;}
private:
double a;
};
int main()
{
Circle C(5.5);
C.show();
Square S(9.9);
S.show();
Shape *s[]={&C,&S};
cout<<"total="<<total(s,2)<<endl;
return 0;
}。