my_istrm.close();
}
doubleave(intp[])/*求和函数的实现,形参用数组*/
{ints=0;
for(inti=0;i<6;i++)s+=p[i];
returns/6.0;}
intmax(intp[])/*求极大值函数的实现,形参用数组*/
{intmaxv=p[0];
for(inti=0;i<6;i++)if(p[i]>maxv)maxv=p[i];
returnmaxv;}
一、名词解释
1.继承性2.多态性3.抽象性4.重载5.封装性
二、选择题
1.关于对象概念的描述中,()是错误的。
A)对象就是C语言中的结构体B)对象是状态和操作的封装体
C)对象之间的信息传递是通过消息进行的D)对象是某个类的一个实例
2.假设MyClass是一个类,则该类的拷贝构造函数的声明语句为()
A)MyClass(MyClassp);B)MyClass&(MyClassp);
C)MyClass(MyClass&p);D)MyClass(MyClass*p);
3.下列说法中正确的是()
A)类定义中只能说明函数成员的函数头,不能定义函数体
B)类中的成员函数可以在类体中定义,也可以在类体外定义
C)类中的函数成员在类体外定义时必须要与类声明在同一文件中
D)在类体之外定义的函数成员不能操作该类的私有数据成员
4.下列的各类函数中,()不是类的成员函数。
A.构造函数B.析构函数C.友元函数D.拷贝构造函数
5.下面叙述错误的是()
A)基类的protected成员在派生类中仍然是protected
B)基类的protected成员在public派生类中仍然是protected的
C)基类的protected成员在private派生类中是private的
D)基类的protected成员不能被派生类的对象访问
6.友元的作用是。
()
A.提高程序的运行效率B.加强类的封装性
C.实现数据的隐蔽D.增加成员函数的种类
7.有关类的说法不正确的是_________。
()
A.类是一种用户自定义的数据类型
B.只有类中的成员函数才能存取类中的私有数据
C.在类中,如果不作特别说明,所有的数据均为私有类型
D.在类中,如果不作特别说明,所有的成员函数均为公有类型
8.有关析构函数的说法不正确的是__________。
()
A.析构函数有且只有一个B.析构函数无任何函数类型
C.析构函数和构造函数一样可以有形参
D.析构函数的作用是在对象被撤销时收回先前分配的内存空间
9.下列关于对象数组的描述中,是错的。
()
A.对象数组的下标是从0开始的B.对象数组的数组名是一个常量指针
C.对象数组的每个元素是同一个类的对象
D.对象数组的只能赋初值,而不能被赋值
10.设置虚基类的目的是()
A)简化程序B)消除二义性C)提高程序运行效率D)减少目标代码
三、不定项选择题
1、定义析构函数时,应该注意()
A、其名与类名完全相同B、返回类型是void类型
C、无形参,也不可重载D、函数体中必须有delete语句
2、每个类()构造函数。
A、只能有一个B、只可有公有的
C、可以有多个D、只可有缺省的
3、在一个类中可以对一个操作符进行()重载。
A、1种B、2种以下C、3种以下D、多种
4、在()情况下适宜采用inline定义内联函数。
A、函数体含有循环语句B、函数体含有递归语句
C、函数代码少、频繁调用D、函数代码多、不常调用
E、需要加快程序执行速度
5、在类中说明的成员可以使用关键字()进行修饰。
A、privateB、externC、autoD、publicE、register
6、如果类A被说明成类B的友元,则()。
A、类A的成员即类B的成员B、类B的成员即类A的成员
C、类A的成员函数不能访问类B的成员
D、类A的成员函数可以访问类B的成员
E、类B不一定是类A的友元
7、在派生类中重新定义虚函数时必须在()方面与基类保持一致。
A、参数个数B、参数类型C、参数名字D、操作内容E、返回类型
8、下列()的调用方式是引用调用。
A.形参是指针,实参是地址值
B.形参和实参都是变量
C.形参是数组名,实参是数组名
D.形参是引用,实参是变量
四、程序题
1.写出以下程序运行的结果。
()
#include
classCSample{
public:
CSample();
voidDisplay();
private:
inti;
staticintk;
};
CSample:
:
CSample(){
i=0;
k++;
}
voidCSample:
:
Display(){
cout<<"i="<
}
intCSample:
:
k=0;
intmain(){
CSamplea,b;
a.Display();
b.Display();
return0;
}
2.写出以下程序运行的结果。
()
#include
classCSample{
inti;
public:
CSample();
CSample(intval);
voidDisplay();
~CSample();
};
CSample:
:
CSample(){
cout<<"Constructor1"<i=0;
}
CSample:
:
CSample(intval){
cout<<"Constructor2"<i=val;
}
voidCSample:
:
Display(){
cout<<"i="<
}
CSample:
:
~CSample(){
cout<<"Destructor"<}
intmain(){
CSamplea,b(10);
a.Display();
b.Display();
return0;
}
3.写出以下有关动态创建多维数组的程序运行的结果。
()
#include
voidmain()
{
float(*cp)[3][4];
cp=newfloat[2][3][4];
inti,j,k;
for(i=0;i<2;i++)
for(j=0;j<3;j++)
for(k=0;k<4;k++)
*(*(*(cp+i)+j)+k)=i*100+j*10+k;
for(i=0;i<2;i++)
{
for(j=0;j<3;j++)
{
for(k=0;k<4;k++)
cout<cout<}
cout<}
}
4.写出以下有关求线段距离的程序运行的结果。
()
#include
#include
classPoint
{public:
Point(intxx=0,intyy=0){X=xx;Y=yy;cout<<"point构造函数被调用"<Point(Point&p);
intGetX(){returnX;}
intGetY(){returnY;}
private:
intX,Y;
};
Point:
:
Point(Point&p)
{
X=p.X;
Y=p.Y;
cout<<"X="<}
classDistance
{
public:
Distance(Pointxp1,Pointxp2);
doubleGetDis(){returndist;}
private:
Pointp1,p2;
doubledist;
};
//类的聚集的构造函数
Distance:
:
Distance(Pointxp1,Pointxp2)
:
p1(xp1),p2(xp2)
{
cout<<"Distance构造函数被调用"<doublex=double(p1.GetX()-p2.GetX());
doubley=double(p1.GetY()-p2.GetY());
dist=sqrt(x*x+y*y);
}
//主函数
voidmain()
{
Pointmyp1(1,1),myp2(4,5);
Distancemyd(myp1,myp2);
cout<<"Thedistanceis:
";
cout<}
5.写出以下有关虚基类及其构造函数的程序运行的结果。
()
#include
classB0//声明基类B0
{
public:
B0(intn){nV=n;cout<<"B0constructor"<intnV;
voidfun(){cout<<"MemberofB0"<};
classB1:
virtualpublicB0//B0为虚基类,派生B1类
{
public:
B1(inta):
B0(a){cout<<"B1constructor"<intnV1;
};
classB2:
virtualpublicB0//B0为虚基类派生B2类
{
public:
B2(inta):
B0(a){cout<<"B2constructor"<intnV2;
};
classD1:
publicB1,publicB2//派生类D1声明
{
public:
D1(inta=0):
B1(a),B0(a),B2(a){cout<<"D1constructor"<intnVd;
voidfund(){cout<<"MemberofD1"<};
voidmain()
{
D1d1;
d1.nV=2;
d1.fun();
}
6.请找出下列程序中的错误,并说明错误原因,以及如何改。
(程序的每一行前加上了行号,你可以通过行号来指出错误位置。
)
1.classMyClass
2.{
3.public:
4.MyClass(intini){member=ini;}
5.voidSetMember(intm)const{member=m;}
6.staticintGetMember(){returnmember;}
7.private:
8.intmember;
9.};
10.voidmain()
11.{
12.MyClassobj1;
13.MyClassobj2(3);
14.obj1.member=5;
15.MyClass:
:
GetMember();
16.}
作业2参考答案
一、简答题
1.继承是一种联结类与类的层次模型。
继承性是指特殊类的对象拥有其一般类的属性和行为的特性。
2.多态性是指类中同一函数名对应多个具有相似功能的不同函数,可以使用相同的调用方式来调用这些具有不同功能的同名函数的特性。
3.抽象就是忽略事物中与当前目标无关的非本质特征,更充分地注意与当前目标有关的本质特征。
4.函数重载是指具有相似功能的不同函数使用同一函数名,但这些同名函数的参数类型、参数个数、返回值、函数功能可以不同。
编译系统将根据函数参数的类型和个数来判断使用哪一个函数。
5.封装就是把对象的属性和行为结合成一个独立的单位,并尽可能隐蔽对象的内部细节。
其有两个含义:
一是封装性,另一个是“信息隐蔽”。
二、单选题:
ACBCAADCDB
三、多项选择
ACDCEADDEABED
四、程序阅读题:
1、
i=0,k=2
i=0,k=2
2、
Constructor1
Constructor2
i=0
i=10
Destructor
Destructor
3、
0123
10111213
20212223
100101102103
110111112113
120121122123
4、
point构造函数被调用
point构造函数被调用
X=4Y=5Point拷贝构造函数被调用
X=1Y=1Point拷贝构造函数被调用
X=1Y=1Point拷贝构造函数被调用
X=4Y