资源描述
《面向对象程序设计C++》期末考试试卷(A)
班级: 姓名: 学号: 分数:
题号
一
二
三
四
总分
得分
试卷阐明:本套试题共四个大题,所有题目都答在答题纸上,写在其她地方均无效。
(答题纸在本套试卷第10页上)
一、选取题(每小题2分,共40分)
1、C++是( C)。
A. 面向对象程序设计语言
B. 面向过程程序设计语言
C. 既支持面向对象程序设计又支持面向过程程序设计混合型语言
D. 非构造化程序设计语言
2、面向对象程序设计思想重要特性中不涉及( D )。
A. 封装性 B. 多态性 C. 继承性 D. 功能分解,逐渐求精
3、若定义:string str; 当语句cin>>str;执行时,从键盘输入:
Microsoft Visual Studio 6.0!
所得成果是str=( B )。
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='*');
下面函数调用中,不合法是( C )。
A. testDefaulParam(5); B. testDefaulParam(5,8);
C. testDefaulParam(5,'#'); D. testDefaulParam(0,0,'*');
5、下列语句中,将函数int sum(int x,int y)对的重载是( C )。
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、下列表达引用办法中,( A )是对的。
已知:int a=1000;
A. int &x=a; B. char &y; C. int &z=1000; D. float &t=&a;
7、在一种函数中,规定通过函数来实现一种不太复杂功能,并且规定加快执行速度,选用( A )。
A. 内联函数 B. 重载函数 C. 递归调用 D. 嵌套调用
8、下列关于C++类说法中,不对的是( D )。
A. 类是一种顾客自定义数据类型
B. 只有类中成员函数或类友元函数才干存取类中私有成员
C. 在类中,如果不做特别阐明,所有成员访问权限均为私有
D. 在类中,如果不做特别阐明,所有成员访问权限均为公用
9、已知X类,则当程序执行到语句:X array[3];时,调用了( D )次构造函数。
A. 0 B. 1 C. 2 D. 3
10、下面说法中,对的是( B)
A. 一种类只能定义一种构造函数,但可以定义各种析构函数
B. 一种类只能定义一种析构函数,但可以定义各种构造函数
C. 构造函数与析构函数同名,只要名字前加了一种求反符号(~)
D. 构造函数可以指定返回类型,而析构函数不能指定任何返回类型,虽然是void类型也不可以
11、已知:print( )函数是一种类常成员函数,它无返回值,下列表达中,( A )是对的。
A. void print( ) const; B. const void print( );
C. void const print( ); D. void print(const);
12、下面描述中,表达错误是( B )
A. 公用继承时基类中public成员在派生类中仍是public
B. 公用继承时基类中private成员在派生类中仍是private
C. 公用继承时基类中protected成员在派生类中仍是protected
D. 私有继承时基类中public成员在派生类中是private
13、设立虚基类目是( B )。
A. 简化程序 B. 消除二义性 C. 提高运营效率 D. 减少目的代码
14、下面( B )论述不符合赋值兼容规则。
A. 派生类对象可以赋值给基类对象
B. 基类对象可以赋值给派生类对象
C. 派生类对象可以初始化基类对象
D. 派生类对象地址可以赋值给指向基类指针
15、关于虚函数描述中,( C )是对的。
A. 虚函数是一种static类型成员函数
B. 虚函数是一种非成员函数
C. 基类中阐明了虚函数后,派生类中与其相应函数可不必阐明为虚函数
D. 派生类虚函数与基类虚函数具备不同参数个数和类型
16、下面关于友元描述中,错误是( D )。
A. 友元函数可以访问该类私有数据成员
B. 一种类友元类中成员函数都是这个类友元函数
C. 友元可以提高程序运营效率
D. 类与类之间友元关系可以继承
17、下列关于静态数据成员说法,不对的是( C )。
A. 类中定义公用静态数据成员,可以通过类对象来访问
B. 类中定义所有静态数据成员,都必要在类外初始化
C. 静态数据成员不是所有对象所共用
D. 普通成员函数可以直接访问类中静态数据成员
18、如果表达式++i*k中“++”和“*”都是重载友元运算符,若采用运算符函数调用格式,则表达式还可以表达为( B )。
A. operator*(i.operator++(),k) B. operator*(operator++(i),k)
C. i.operator++().operator*(k) D. k.operator*(operator++(i))
19、下面对模板声明,对的是( C )。
A. template<T> B. template<class T1,T2>
C. template<class T1,class T2> D. template<class T1;class T2>
20、下列各类函数中,( C )不是类成员函数
A. 构造函数 B. 析构函数 C. 友元函数 D. 复制构造函数
二、填空题(前14个空,每空1分,后3个空,每空2分,共20分)
1、类和对象关系可表述为:类是对象 抽象 ,而对象则是类 实例 。
2、静态成员函数没有隐含 this指针 ,因此,在C++程序中,静态成员函数重要用来访问静态数据成员,而不访问非静态成员。
3、在图1中,A,B,C,D,E,F均是类,其中属于单继承派生类有 E ,属于多继承派生类有 D、F ,类F基类有 A、B、C、D、E ,类A派生类有 D、F 。
A
B
C
D
E
F
图1 类继承层次图
4、如果只想保存公共基类一种复制,就必要使用核心字 virtual 把这个公共基类声明为虚基类。
5、从实现角度来讲,多态性可以划分为两类: 静态多态性 和 动态多态性 。
6、如果一种类包括一种或各种纯虚函数,则该类称为 抽象类 。
7、若要把void fun()定义为类A友元函数,则应在类A定义中加入语句 friend void fun(A &a) 。
8、列出C++中两种代码复用方式: 继承 和 组合 或模板
9、析构函数作用是 在对象被系统释放之前做某些内存清理工作
10、假定A是一种类名,则该类拷贝构造函数原型阐明语句为: A(const A&)
11、后置自增运算符“++”重载为类成员函数(设类名为A)形式为:A operator++(int)
三、阅读下面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;
}
解1、a=89,b=56,c=12
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;
}
解2、ABC
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;
}解3、A::A() called. B::~B() called. A::~A() called. B::B() called.
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;
}解4、Call B's function f()
Call B's function g()
Call C's function g()
四、编程题(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函数计算)。
四、编程题(共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;
}
展开阅读全文