面向对象程序设计C++A卷答案.docx
《面向对象程序设计C++A卷答案.docx》由会员分享,可在线阅读,更多相关《面向对象程序设计C++A卷答案.docx(13页珍藏版)》请在冰豆网上搜索。
![面向对象程序设计C++A卷答案.docx](https://file1.bdocx.com/fileroot1/2023-1/23/5ad4d9e3-f7df-4918-8927-053ea4515517/5ad4d9e3-f7df-4918-8927-053ea45155171.gif)
面向对象程序设计C++A卷答案
题号
一
二
三
四
五
总分
核分人
得分
得分
评卷人
一、选择题(每题2分,共20分)
1、已知函数f的原型是:
voidf(int*a,long&b);变量v1、v2的定义是:
intv1;longv2;,正确的调用语句是(C)。
A)f(v1,&v2);B)f(v1,v2);C)f(&v1,v2);D)f(&v1,&v2);
2、下列描述中,(C)是错误的。
A)内联函数主要解决程序的运行效率问题
B)内联函数的定义必须出现在内联函数第一次被调用之前
C)内联函数中可以包括各种语句
D)对内联函数不可以进行异常接口声明
3、下列关于类和对象的叙述中,错误的是(A)。
A)一个类只能有一个对象
B)对象是类的具体实例
C)类是对某一类对象的抽象
D)类和对象的关系是一种数据类型与变量的关系
4、(C)不是构造函数的特征。
A)构造函数的函数名与类名相同 B)构造函数可以重载
C)构造函数不可以设置缺省参数 D)构造函数无须指定类型说明
5、友元的作用是(A )。
A)提高程序的运用效率 B)加强类的封装性
C)实现数据的隐藏性 D)增加成员函数的种类
6、下列关于运算符重载的叙述中,正确的是( B )。
A)通过运算符重载,可以定义新的运算符
B)有的运算符只能作为成员函数重载
C)若重载运算符+,则相应的运算符函数名是+
D)重载二元运算符时,必须声明两个形参
7、设置虚基类的目的是( B )。
A)简化程序 B)消除二义性 C)提高运行效率 D)减少目标代码
8、已知在一个类体中包含如下函数原型:
Volume operator-(Volume)const;,下列关于这个函数的叙述中,错误的是( B )。
A)这是运算符-的重载运算符函数
B)这个函数所重载的运算符是一个一元运算符
C)这是一个成员函数
D)这个函数不改变类的任何数据成员的值
9、关于子类型的描述中,(A )是错误的。
A)子类型就是指派生类是基类的子类型;
B)一种类型当它至少提供了另一种类型的行为,则这种类型是另一种类型的子类型;
C)在公有继承下,派生类是基类的子类型;
D)子类型关系是不可逆的。
10、下列是模板声明的开始部分,其中正确的是(C)。
A)templateB)template
C)templateD)template
得分
评卷人
二、判断题(每题1分,共10分)
1、C++语言引入类主要起两个作用:
数据封装和类型定义。
√
2、只要是类M继承了类N,就可以说类M是类N的子类型。
×
3、构造函数可以声明为虚函数。
×
4、多继承情况下,派生类的构造函数的执行顺序取决于成员初始化列表中的顺序。
×
5、重载函数必须有不同的参数列表。
√
6、用new动态分配的内存是在堆中分配的,而不是在栈中分配的。
√
7、关系运算符可以用来比较两个字符的大小,也可用来比较两个字符串的大小。
×
8、如果一个成员函数只存取一个类的静态数据成员,则可将该成员函数说明为静态成员函数。
√
9、通过使用不同的类型参数,函数模板可以生成不同类型的函数。
√
10、在私有继承中,基类中只有公有成员对派生类是可见的。
×
得分
评卷人
三、填空题(每题2分,共20分)
1、任何类中允许有三种访问权限的数据,这三种访问权限分别是 public 、private、 protected ,默认访问权限为private(或私有)。
2、类Sample的构造函数将形参data赋值给数据成员data。
请将类定义补充完整。
class Sample{
public:
Sample(int data=0);
private:
int data;
};
Sample:
:
Sample(int data){
this->data=data;
}
3、设px是指向一个类动态对象的指针变量,则执行“delete px”语句时,将自动调用该类的析构函数。
4、当一个函数或一个类希望能够直接访问另一个类中的非公用成员时,应该将该函数或该类声名为另一个类的友元函数或友元类。
5、在MyClass 类的定义中,对赋值运算符=进行重载。
请将画线处缺失的部分补充完整。
MyClass& MyClass:
:
operator=(const MyClass &rhs) {
if(this==&rhs) return *this;
value=rhs.value;
return *this;
}
6、设A为test类的对象且赋有初值,则语句test B(A); 表示用已经存在的对象A初始化正在被创建的同类新对象B 。
7、函数重载时要求同名函数的参数类型 或 个数不同,否则无法确定是哪个函数。
8、从实现的角度划分,C++所支持的两种多态性分别是编译时的多态性和运行时的多态性。
实现运行时多态,要使用 虚 函数。
9、带有 纯虚函数 的类称为抽象类,抽象类的特征是不能声明一个抽象类的 对象 ,但可以声明一个抽象类的指针或引用。
10、一个 类模板 允许用户为类定义一种模式,使得类中某些数据成员、某些成员函数的参数和返回值能取任意数据类型。
得分
评卷人
四、程序阅读题(每题5分,共10分)
1、写出执行下面程序的输出结果。
9SS9S
#include
using namespace std;
class A{
int a;
public:
A():
a(9){}
virtual void print() const
{cout<};
class B:
public A{
char b;
public:
B(){b= ‘S’;}
void print()const
{cout<
};
void show(A& X){X.print();}
int main() {
A d1,*p;
B d2;
p=&d2;
d1.print();
d2.print();
p->print();
show(d1);
show(d2);
return 0;
}
2、写出执行下面程序的输出结果。
#include
using namespace std;
classPart{
public:
Part(){cout<<"classPart"<};
classA
{public:
A(char*s){cout<
~A(){}
};
classB:
virtualpublicA
{public:
B(char*s1,char*s2):
A(s1)
{cout<};
classC:
virtualpublicA{
public:
C(char*s1,char*s2):
A(s1){cout<};
classD:
publicC,publicB{
Partp;
public:
D(char*s1,char*s2,char*s3,char*s4):
B(s1,s2),C(s1,s3),A(s1)
{cout<};
intmain()
{
D*p=newD("classA","classB","classC","classD");
deletep;
return0;
}
结果:
classA
classC
classB
classPart
classD
得分
评卷人
五、程序改错题(每个错误2分,共10分)
有一个源程序文件proj.cpp,其中编号为①、②、③、④、⑤的语句有错误,请修改这些错误。
源程序文件proj.cpp清单如下:
#include
usingnamespacestd;
#include
classCBook{
private:
char*p_book;
public:
voidCBook(constchar*p_val)-----------①去掉void
{
p_book=newchar[strlen(p_val)+1];
strcpy(p_book,p_val);
}
voidprint()const;
~CBook(){deletep_book[];}-----------②去掉[]
};
intmain(){
charbook_title[60];
CBook*p_book_obj;
cout<<"Enterbooktitle:
";
cin>>book_title;
CBookabook;--------------③改成CBookabook(book_title);
p_book_obj=&abook;
p_book_obj.print();-----------④改成p_book_obj-〉print();
return0;
}
voidprint()const-----------⑤改成voidCBook:
:
print()const
{cout<得分
评卷人
六、程序设计题(共30分)
1、(15分)编写一个实现两个数交换的函数模板swap,然后使用该函数模板再编写一个对具有n个数组元素(通用类型)的数组采用冒泡排序算法进行排序的函数模板。
2、(15分)编写一个程序计算“三角形(triangle)、正方形(square)、圆形(circle)”三种图形的面积,要求:
(1)抽象出一个基类Base,在其中说明一个虚函数用来求面积;
(2)利用派生类定义三角形、正方形、圆形;
(3)编写主函数并测试。
1、#include
usingnamespacestd;
template
voidswap(T&a,T&b){
Ttemp;
temp=a;a=b;b=temp;
}
template
voidbubbleSort(Ta[],intn)
{inti,j;
for(i=1;ifor(j=0;jif(a[j]>a[j+1])swap(a[j],a[j+1]);
}
template
voidprint(T1a[],intn){
for(inti=0;i}
intmain(){
inta[]={2,3,1,6,43,22};
doubleb[]={2.3,3.2,1.6,-6.0,4.3,2.2};
print(a,6);
bubbleSort(a,6);
print(a,6);
print(b,6);
bubbleSort(b,6);
print(b,6);
return0;
}
2、class Base {
public:
double area(double s=0);
};
class Triangle:
public base {
double D,H;
public:
Triangle (double d=0,double h=0) { D=d; H=h; }
double area() { double s; s=(D*H)/2; return s; }
void display() {
cout<<"三角形的底和高:
"<cout<<"三角形的面积:
"<
}
};
class Square:
public base {
double L;
public:
Square(double l=0) { L=l; }
double area() { double s; s=L*L; return s; }
void display() {
cout<<"正方形的边长为:
"<cout<<"正方形的面积为:
"<
};
class Circle:
public base {
double R;
public:
Circle(double r=0) { R=r; }
double area() { double s; s=3.14*R*R; return s; }
void display() {
cout<<"圆的半径:
"<cout<<"圆形的面积为:
"<
};
intmain(){
Shape*p=NULL;
Trianglet(3,4,5);
Squares
(2);
Circlec(3);
p=&t;
cout<<"三角形的面积为:
"<area()<p=&s;
cout<<"正方形的面积为:
"<area()<p=&c;
cout<<"圆的面积为:
"<area()<return0;
}