2学期 《面向对象方法》B卷.docx
《2学期 《面向对象方法》B卷.docx》由会员分享,可在线阅读,更多相关《2学期 《面向对象方法》B卷.docx(12页珍藏版)》请在冰豆网上搜索。
![2学期 《面向对象方法》B卷.docx](https://file1.bdocx.com/fileroot1/2023-7/24/4d289062-d8b7-423e-b955-c3614e67c1ca/4d289062-d8b7-423e-b955-c3614e67c1ca1.gif)
2学期《面向对象方法》B卷
2005-2006-2学期《面向对象方法》B卷
一.单项选择(本题共10小题,每题2分,共20分)
1. C++中,封装体现在()上。
A.指针B.类C.数组D.函数
2.以下属于C++中异常所使用的关键字的是()
A.exeption B.friendC.throwD.const
3.对于结构中定义的成员,其默认访问权限为()
A.public B.protectedC.privateD.static
4.对于构造函数下列描述正确的是()。
A.构造函数只能有一个B.构造函数只能有私有(private)的
C.构造函数可以重载D.构造函数只能有默认的
5.用于类中虚成员函数说明的关键字是()
A.publicB.virtualC.protectedD.private
6.下面是关于一个类的友元的说法,其中正确的是()
A. 友元函数不可以访问该类的私有数据成员
B. 友元的声明必须放在类的外部
C. 友元增强了类的封装性
D. 类与类之间的友元关系不可以被继承
7.对于基类中的私有(private)数据成员,在其派生类中是()数据成员。
A.publicB.不可见C.protectedD.private
8.对于拷贝构造函数的描述中,正确的是()
A.用户没有定义拷贝构造函数时,系统会产生一个默认的
B.对于类AB,当执行ABa;ABb=a;时,需要调用类AB的拷贝构造函数
C.默认拷贝构造函数什么事情都不做
D.拷贝构造函数的参数是指针类型
9.关于纯虚函数和抽象类的描述中,()是错误的。
A.纯虚函数是一种特殊的虚函数,它没有具体实现
B.抽象类中一定具有一个或多个纯虚函数
C.抽象类的派生类中一定不会有纯虚函数
D.抽象类一般作为基类使用,其纯虚函数的实现由其派生类给出
10.关于模板的描述正确的是()
A.函数模板的实例化是模板函数B.模板所使用的关键字是standard
C.函数模板就是一种函数D.类模板是一种类
二.判断题(本题共5小题,每小题2分,共10分)
1.析构函数不能是虚函数()
2.类类型数据成员只能在初始化符表中进行初始化()
3.构造函数和析构函数都可以重载,因为它们都是成员函数()
4.面向对象方法具有三大特性:
封装性、继承性和友元()
5.一元运算符,作为友元函数重载时需要声明操作对象作为形参;作为类成员函数重载时则不需要形参()
三.填空题(本题共5小题,每空1分,共10分)
1.假定类AB中有一个公用属性的静态数据成员bb,在主函数中访问bb的写法为 。
2.在c++中,文件输入/出流的头文件是。
3.类A继承类B,则A称为B的,B称为A的。
4.用户申请的内存(用new申请的空间)是在程序的区;函数中局部变量在程序的区。
5.C++中提供的类的默认成员函数有、、、等。
四.简答题与填空(本题共4小题,每小题5分,共20分)
1.C++中new/delete取代了malloc/free,二者有什么区别。
2.C++类中有哪些成员函数不能是虚函数,一般情况下哪些函数定义为虚函数?
3.简述什么情况下必须定义拷贝构造函数,写出类AB的拷贝构造函数的声明?
4.简述纯虚函数的作用,对于类BC的纯虚成员函数virFun(),写出其声明?
五.程序阅读题(本题共3小题,第一小题6分,后两题各7分,共20分)
2005-2006-2学期《面向对象方法》B卷参考答案
一.单项选择(本题共10小题,每题2分,共20分)
1~5:
BCACB6~10:
DBACA
二.判断题(本题共5小题,每小题2分,共10分)
1~5:
FTFFT
三.填空题(本题共5小题,每空1分,共10分)
1.AB:
:
bb2.fstream.h3.派生类、基类4.堆、栈5.构造函数、析构函数、拷贝构造函数、赋值运算符
四.简答题(本题共4小题,每题5分,共20分)
1.答:
new/delete是C++中的关键字,且当使用它们申请或释放对象的堆内存空间时,会去调用构造函数或析构函数。
而malloc/free是C语言提供的库函数,用malloc申请堆内存的函数的参数是类型的长度,如果是类对象的话,不会也调用类的构造函数,同理free也不会调用析构函数。
2.答:
不能是虚函数的成员函数有:
构造函数、内联函数、静态成员函数等,一般情况下析构函数定义为虚函数。
3.答:
如果对象的数据成员包括指向堆空间的指针,此时必须自定义拷贝构造函数;否则系统自带的默认拷贝构造函数只完成成员之间的位拷贝(浅拷贝),只有定义拷贝构造函数,为创建的对象分配堆空间。
AB(constAB&a);
4.纯虚函数的作用就是为其派生类提供函数接口,在派生类中实现这个接口函数,从而实现多态。
voidvirFun()=0;
五.程序阅读题(本题共3小题,第一小题6分,后两题各7分。
共20分)
1.constructing
constructing
a=1.1b=2.2c=3.3
a=3b=4c=5
destructing
destructing
2.thenumberofwheelsis4
constructingVehiclemazda6
thenumberofwheelsis6
constructingVehicleDongfeng140
theendofmainfunction
destructing
destructing
3.thevalueis2.33
5yuan66fen
thevalueis5.66
五.程序设计题(本题共2小题,每小题10分,共20分)
1.Animal:
:
Animal(char*pname,char*voice)
{
m_pStrName=newchar[strlen(pname)+1];
strcpy(m_pStrName,pname);
strcpy(m_StrVoice,voice);
}
Animal:
:
Animal(constAnimal&a)
{
m_pStrName=newchar[strlen(p.m_pStrName)+1];
strcpy(m_pStrName,p.m_pStrName);
strcpy(m_StrVoice,a.m_StrVoice);
}
Animal:
:
~Animal()
{
delete[]m_pStrName;
}
voidAnimal:
:
shout()
{
cout<}
2.
classCircle:
Shape
{
public:
doublearea()
{
Return3.14*m_dR*m_dR;
}
protected:
doublem_dR;
};
classRectangle:
Shape
{
public:
doublearea()
{
Returnm_dX*m_dY;
}
protected:
doublem_dX;
doublem_dY;
};
1.#include
classMyClass
{
public:
MyClass(doublea,doubleb,doublec)
{
m_A=a;m_B=b;m_C=c;
cout<<“constructiong”<}
~MyClass()
{
cout<<“destructiong”<}
voiddisplay()
{
cout<<“a=”<}
private:
doublem_A,m_B,m_C;
};
voidmain()
{
MyClassm(1.1,2.2,3.3);
MyClassn(3,4,5);
m.display();
n.display();
}
2.#include
#include
classVehicle
{
public:
Vehicle(char*type;intnum):
m_wh(num)
{
strcpy(m_StrType,type);
cout<<“constructingVehicle”<}
private:
char*m_StrType;
Wheelsm_wh;
};
classWheels
{
public:
Wheels(intnum)
{
m_Num=num;
cout<<“thenumberofwheelsis”<}
~Wheels()
{
cout<<“destructing”<}
private:
intm_Num;
};
voidmain()
{
Vehiclev1(“Mazda6”,4);
Vehiclev2(“Dongfeng140”,6);
cout<<“theendofmainfunction”<}
3.#include
classCurrency
{
public:
Currency(doublevalue)
{
m_dValue=value;
}
virtualdisplay()
{
cout<<“thevalueis”<}
private:
doublem_dValue;
}
classRMB
{
RMB(doublevalue):
Currency(value)
{
m_nYuan=(int)value;
m_nJiaofen=value–m_nYuan;
}
voiddisplay()
{
cout<}
};
voidmain()
{
Currencyc(2.33);
c.display();
RMBr(5.66);
r.display();
Currency*pc=&r;
pc->display();
}
六.程序设计题(本题共2小题,每小题10分,共20分)
1.编写类Animal的构造函数、析构函数、拷贝构造函数以及叫声函数shout。
已知类Animal的声明部分为:
classAnimal
{
public:
Animal(char*pname,char*voice);
~Animal();
Animal(constAnimal&a);
voidshout();
private:
char*m_pStrName;
charm_StrVoice[10];
};
主函数及程序输出结果为
voidmain()
{
Animaldog(“Nick”,”wangwang”);
Animalcat(“Galphie”,”miaomiao”);
Animaldogee=dog;
dog.shout();
cat.shout();
dogee.shout();
}
输出结果为:
Nick’svoiceiswangwang
Galphie’svoiceismiaomiao
Nick’svoiceiswangwang
2.下列Shape类是一个表示形状的抽象类,area()为求图形面积的成员函数,calArea()则是一个通用的用以求不同形状的图形面积的函数。
请从Shape类派生圆类(Circle)、矩形类(Rectangle),并给出具体的求面积函数。
classShape
{
public:
virtualdoublearea()=0;
};
doublecalArea(Shape&s)
{
returns.area();
}
voidmain()
{
Circlec(2.0);
cout<<“Theareais”<Rectangler(3,4);
cout<<“Theareais”<}
输出结果为:
Theareais12.56
Theareais12