面向对象程序设计C++B卷答案.docx
《面向对象程序设计C++B卷答案.docx》由会员分享,可在线阅读,更多相关《面向对象程序设计C++B卷答案.docx(10页珍藏版)》请在冰豆网上搜索。
面向对象程序设计C++B卷答案
题号
一
二
三
四
五
总分
核分人
得分
得分
评卷人
一、选择题(每题2分,共20分)
1、 int *constp说明不能修改(A )。
A)p指针 B)p指针指向的变量;
C)p指针指向的数据类型 D)上述A、B、C三者。
2、下列函数原型声明中,错误的是(D)。
A)voidFun(intx=0,inty=0);B)voidFun(intx,inty);
C)voidFun(intx,inty=0);D)voidFun(intx=0,inty);
3、关于类和对象不正确的说法是(C )。
A) 类是一种类型,它封装了数据和操作 B) 对象是类的实例
C) 一个类的对象只有一个 D) 一个对象必属于某个类
4、下列的各类函数中,不是类的成员函数的是(C)。
A)构造函数B)析构函数C)友元函数D)复制构造函数
5、( B)是不可以作为该类的成员的。
A)自身类对象的指针 B)自身类的对象
C)自身类对象的引用 D)另一个类的对象
6、下列关于类的继承描述中,(A )是错误的。
A) 派生类可以访问基类的所有数据成员,也能调用基类的所有成员函数
B) 派生类也是基类,但基类不一定具有派生类的全部属性和方法
C) 继承描述类的层次关系,派生类可以具有与基类相同的属性和方法
D) 一个基类可以有多个派生类,一个派生类可以有多个基类
7、下列关于静态数据成员的描述中,正确的是( A )。
A)静态数据成员是类的所有对象共享的数据
B)类的每个对象都有自己的静态数据成员
C)类的不同对象有不同的静态数据成员值
D)静态数据成员不能通过类的对象调用
8、已知在一个类体中包含如下函数原型:
Volume operator-(Volume)const;,下列关于这个函数的叙述中,错误的是( B )。
A)这是运算符-的重载运算符函数
B)这个函数所重载的运算符是一个一元运算符
C)这是一个成员函数
D)这个函数不改变类的任何数据成员的值
9、带有虚基类的多层派生类构造函数的成员初始化列表中都要列出虚基类的构造函数,这样将对虚基类的子对象初始化( D )。
A) 与虚基类下面的派生类个数有关 B)多次
C)二次 D) 一次
10、下列关于类模板的描述中,错误的是(D)。
A.类模板的成员函数都是模板函数
B.可以为类模板参数设置默认值
C.类模板描述了一组类
D.类模板中只允许有一个类型参数
得分
评卷人
二、判断题(每题1分,共10分)
1、在保护继承中,对于垂直访问同于公有继承,而对于水平访问同于私有继承。
√
2、析构函数是一种函数体为空的成员函数。
×
3、重载函数必须有不同的参数列表。
√
4、可以用delete释放不是用new运算符分配的内存。
×
5、某类中的友元类的所有成员函数可以存取或修改该类中的私有成员。
√
6、关系运算符可以用来比较两个字符的大小,也可用来比较两个字符串的大小。
×
7、公有继承可以实现子类型。
√
8、纯虚函数是在基类中说明的虚函数,它在该基类中没有定义具体的操作内容。
√
9、引用是某个变量的别名,对引用的操作就是对被引用变量的操作。
√
10、在公有继承中,基类中的公有成员和私有成员在派生类中都是可见的。
×
得分
评卷人
三、填空题(每题2分,共20分)
1、类是对具有共同属性和行为的一类事物的抽象描述,共同属性被描述为类中的 数据成员,共同行为被描述为类中的成员函数。
2、假定A是一个类名,则该类的拷贝构造函数的原型说明语句为:
A(constA&a) 。
3、在派生类的成员中有私有成员、 保护成员 、公有成员 、不可访问成员 四类成员。
4、从实现的角度划分,C++所支持的两种多态性分别是编译时的多态性和运行时的多态性。
实现运行时多态,要使用 虚 函数。
7、带有 纯虚函数 的类称为抽象类,抽象类的特征是不能声明一个抽象类的 对象 ,但可以声明一个抽象类的指针或引用。
5、若需要把一个函数“void F( );”定义为一个类AB的友元函数,则应在类AB的定义中加入一条语句:
friendvoidF(AB&); 。
8、有如下类定义:
class Sample{
public:
Sample();
~Sample();
private:
static int data;
};
将静态数据成员data初始化为0的语句是 intSample:
:
data=0; 。
6、对双目运算符,被重载为成员函数时,有一个参数,被重载为友元函数时,有两个参数。
9、列出C++中的两种代码复用方式:
继承 和 模板 。
10、已知
int sum(int n){return n+n;}
long sum(long n){return n+n;}
是一个函数模板的两个实例,则该函数模板的定义是 。
( template
T sum(T n){return n+n;} )。
得分
评卷人
四、程序阅读题(共10分)
1、(4分)写出执行下面程序的输出结果。
213312
#include
using namespace std;
classPart{
public:
Part(intx=0):
val(x){cout<~Part(){cout<private:
intval;
};
classWhole{
public:
Whole(intx,inty,intz=0):
p2(x),p1(y),val(z){cout<~Whole(){cout<private:
Partp1,p2;
intval;
};
intmain(){
Wholeobj(1,2,3);
return0;
}
2、(3分)写出执行下面程序的输出结果。
const:
val=10val=20
#include
using namespace std;
classMyClass{
public:
MyClass(intx):
val(x){}
voidprint()const{cout<<"const:
val="<voidprint(){cout<<"val="<private:
intval;
};
intmain(){
constMyClassobj1(10);
MyClassobj2(20);
obj1.print();
obj2.print();
return0;
}
3、(3分)写出执行下面程序的输出结果。
#include
using namespace std;
classBase{
public:
voidfun1(){cout<<"Base\n";}
virtualvoidfun2(){cout<<"Base\n";}
};
classDerived:
publicBase{
public:
voidfun1(){cout<<"Derived\n";}
voidfun2(){cout<<"Derived\n";}
};
voidf(Base&b){b.fun1();b.fun2();}
intmain()
{
Derivedobj;
f(obj);
return0;
}
Base
Derived
得分
评卷人
四、程序改错题(每处2分,共10分)
有一个源程序文件proj.cpp,其中编号为①、②、③、④、⑤的语句有错误。
请修改这些错误,使程序的输出结果为:
12345678910。
源程序文件proj.cpp清单如下:
#include
usingnamespacestd;
#include
using namespace std;
class MyClass{
public:
voidMyClass(int len)-------------①MyClass(intlen)
{ array = new int[len];
arraySize = len;
for(int i = 0; i < arraySize; i++)
array[i] = i+1;
}
~MyClass(){
delete array[]; -------------②delete[]array;
}
void Print() const {
for(int i = 0; i < arraySize; i++)
cin << array[i] << ' '; --------------③cout< cout << endl;
}
private:
int *array;
int arraySize;
};
int main()
{MyClass obj;---------------④MyClassobj(10);
MyClass*p=&obj;
p.Print();---------------⑤p->Print();
return 0;
}
得分
评卷人
六、程序设计题(共30分)
1、(5分)编写一个对具有n个数组元素(通用类型)的数组进行升序排序的函数模板。
2、(10分)定义一个商品类CGoods,其中包含商品号(long no)、商品名(char *p_name)、商品价格(double price)三个数据成员,以及相应的构造函数、拷贝构造函数、析构函数、打印数据成员的成员函数。
3、(15分) 以CGoods类为基类,派生出服装类CClothes和食品类CFood两个派生类,并在这两个类中分别增加一个表示品牌的指针数据成员(char *p_brand)和表示用途的成员函数(void usedFor()——可分别输出一条表示服装和食品用途的信息)。
为了能够采用动态联编的方式调用派生类的usedFor()成员函数,应该在CGoods类及其派生类CClothes和CFood类中作何改动?
写出CClothes类和CFood类的完整定义(包括构造、析构和usedFor()成员函数的实现)。
1.#include
usingnamespacestd;
template
voidbubbleSort(Ta[],intn)
{inti,j;
Ttemp;
for(i=1;ifor(j=0;jif(a[j]>a[j+1]){temp=a[j];a[j]=a[j+1];a[j+1]=temp;}
}
template
voidprint(Ta[],intn){
for(inti=0;icout<}
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.#include
#include
usingnamespacestd;
classCGoods{
private:
longno;
char*p_name;
doubleprice;
public:
CGoods(longno_val,char*p_val,floatprice_val);
CGoods(constCGoods&r_good);
~CGoods(){delete[]p_name;}
voidprint()const;
virtualvoidusedFor()=0;
};
CGoods:
:
CGoods(longno_val,char*p_val,floatprice_val){
no=no_val;
p_name=newchar[strlen(p_val)+1];
strcpy(p_name,p_val);
price=price_val;
}
CGoods:
:
CGoods(constCGoods&r_good)
{
no=r_good.no;
p_name=newchar[strlen(r_good.p_name)+1];
strcpy(p_name,r_good.p_name);
price=r_good.price;
}
voidCGoods:
:
print()const{
cout<<"Coursenumber:
"<cout<<"Coursename:
"<cout<<"Courseprice:
"<}
3.classCClothes:
publicCGoods{
private:
char*p_brand;
public:
CClothes(longno_val,char*p_val,floatprice_val,char*p_brandby):
CGoods(no_val,p_val,price_val)
{
p_brand=newchar[strlen(p_brandby)+1];
strcpy(p_brand,p_brandby);
}
~CClothes(){deletep_brand;}
voidusedFor(){cout<<"Usedfordressing"<};
classCFood:
publicCGoods{
private:
char*p_brand;
public:
CFood(longno_val,char*p_val,floatprice_val,char*p_brandby):
CGoods(no_val,p_val,price_val)
{p_brand=newchar[strlen(p_brandby)+1];
strcpy(p_brand,p_brandby);}
~CFood(){delete[]p_brand;}
voidusedFor(){cout<<"Usedforeating"<};