面向对象程序设计形成性考核及解答作业四.doc
《面向对象程序设计形成性考核及解答作业四.doc》由会员分享,可在线阅读,更多相关《面向对象程序设计形成性考核及解答作业四.doc(9页珍藏版)》请在冰点文库上搜索。
2011春面向对象程序设计单元复习指导(4)
一、填空题:
1.设px是指向一个类对象的指针变量,则执行“deletepx;”语句时,将自动调用该类的()。
A.无参构造函数B.带参构造函数C.析构函数D.拷贝构造函数
2.假定AB为一个类,则执行“ABa[10];”语句时调用该类无参构造函数的次数为()。
A.0B.1C.9D.10
3.假定AB为一个类,则执行“ABa
(2),b[3],*p[4];”语句时共调用该类构造函数的次数为()。
A.3B.4C.5D.9
4.假定AB为一个类,px为指向该类的一个含有n个对象的动态数组的指针,则执行“delete[]px;”语句时共调用该类析构函数的次数为()。
A.0B.1C.nD.n+1
5.对类中引用成员的初始化是通过构造函数中给出的()实现的。
A.函数体B.参数表C.初始化表D.初始化表或函数体
6.一个类的静态数据成员所表示属性()。
A.是类的或对象的属性B.只是对象的属性
C.只是类的属性D.类和友元的属性
7.被非静态成员函数访问的类的数据成员()。
A.可以是非静态数据成员或静态数据成员B.不可能是类的静态数据成员
C.只能是类的非静态数据成员D.只能是类的静态数据成员
8.引入友元的主要目的是为了()。
A.增强数据安全性B.提高程序的可靠性
C.提高程序的效率和灵活性D.保证类的封装性
9.在重载一个运算符时,其参数表中没有任何参数,这表明该运算符是()。
A.作为友元函数重载的1元运算符B.作为成员函数重载的1元运算符
C.作为友元函数重载的2元运算符D.作为成员函数重载的2元运算符
10.如果表达式a+b中的“+”是作为成员函数重载的运算符,若采用运算符函数调用格式,则可表示为()。
A.a.operator+(b)B.b.operator+(a)
C.operator+(a,b)D.operator(a+b)
11.如果表达式a++中的“++”是作为普通函数重载的运算符,若采用运算符函数调用格式,则可表示为()。
A.a.operator++()B.operator++(a)
C.operator++(a,1)D.operator++(1,a)
12.一个程序中数组a和变量k定义为“inta[5][10],k;”,且程序中包含有语句“a(2,5)=++k*3;”,则此语句中肯定属于重载操作符的是()。
A.()B.=C.++D.*
13.下面是重载双目运算符+的普通函数原形,其中最符合+原来含义的是()。
A.Valueoperator+(Value,Value);B.Valueoperator+(Value,int);
C.Value&operator+(Value,Value);D.Value&operator+(Value&,Value&);
14.关于插入运算符<<的重载,下列说法不正确的是()。
A.运算符函数的返回值类型是ostream&。
B.重载的运算符必须定义为类的成员函数。
C.运算符函数的第一个参数的类型是ostream&。
D.运算符函数有两个参数。
15.C++的继承性允许派生类继承基类的()。
A.部分特性,并允许增加新的特性或重定义基类的特性
B.部分特性,但不允许增加新的特性或重定义基类的特性
C.所有特性,并允许增加新的特性或重定义基类的特性
D.所有特性,但不允许增加新的特性或重定义基类的特性
二、填空题
1.当一个队列为满时,不能对其做________元素的操作。
2.在一个用链表实现的队列类中,假定每个结点包含的值域用elem表示,包含的指针域用next表示,链队的队首指针用elemHead表示,队尾指针用elemTail表示,当链队非空时,_____________指向队首结点的后继(即下一个)结点。
3.在一个用链表实现的队列类中,若链队为空或只含有一个结点,则队首指针的值与队尾指针的值________。
4.一个类的__________函数通常用于实现释放该类对象中指针成员所指向的动态存储空间的任务。
5.定义类动态对象数组时,其元素只能靠自动调用该类的____________来进行初始化。
6.假定AB为一个类,则执行“ABa[10];”语句时,系统自动调用该类构造函数的次数为________。
7.对类中引用成员的初始化只能通过在构造函数中给出的______________来实现。
8.假定要把aa定义为AB类中的一个引用整数型数据成员,则定义语句为____________。
9.假定用户为类AB定义了一个构造函数“AB(intaa){a=aa;}”,则系统(会/不会)_________为该类自动定义一个无参构造函数"AB(){}"。
10.假定用户为类AB定义了一个构造函数“AB(intaa=0):
a(aa){}”,则定义该类的对象时,可以有________种不同的定义格式。
11.派生类的成员函数能够直接访问所含基类的__________成员函数和___________成员函数。
12.在定义一个派生类时,使用private关键字表示为私有继承,使用__________关键字表示为公有继承。
三、程序填空:
1.已知一个利用数组实现栈的类定义如下:
constintARRAY_SIZE=10;
classStack{
public:
voidInit(){top=-1;}//初始化栈为空
voidPush(intnewElem);//向栈中压入一个元素
intPop();//从栈顶弹出一个元素
boolEmpty(){//判栈空
if(top==-1)returntrue;elsereturnfalse;}
intDepth(){returntop+1;}//返回栈的深度
voidPrint();
//按照后进先出原则依次输出栈中每个元素,直到栈空为止
private:
intelem[ARRAY_SIZE];//用于保存堆栈元素的数组
inttop;//指明栈顶元素位置的指针
};
该类的Pop和Print函数的实现分别如下:
___
(1)___{
if(top==-1){
cout<<"栈空!
"< exit
(1);//中止运行
}
return___
(2)___;
}
voidStack:
:
Print(){
while(!
Empty())
cout<<___(3)___<<'';
}
(1)
(2)(3)
2.#include
#include
classA{
int*a;intn;intMaxLen;
public:
A():
a(0),n(0),MaxLen(0){}
A(int*aa,intnn,intMM){
n=nn;
MaxLen=MM;
if(n>MaxLen)exit
(1);
___
(1)___;//由a指向长度为MaxLen的动态数组
for(inti=0;i}
~A(){delete[]a;}
intGetValue(inti)___
(2)___//函数体返回a[i]的值
};
voidmain()
{
intb[10]={1,2,3,4,5,6,7,8,9,10};
Ar(b,10,10);
inti,s=0;
for(i=0;i<10;i++);___(3)___//把r对象的a数据成员中的每个
//元素值依次累加到s中
cout<<"s="<
}
(1)
(2)(3)
3.在下面一段类定义中,Derived类公有继承了基类Base。
需要填充的函数由注释内容给出了功能。
classBase
{
private:
intmem1,mem2;//基类的数据成员
public:
Base(intm1,intm2){
mem1=m1;mem2=m2;
}
voidoutput(){cout<//...
};
classDerived:
publicBase
{
private:
intmem3;//派生类本身的数据成员
public:
//构造函数,由m1和m2分别初始化mem1和mem2,由m3初始化mem3
Derived(intm1,intm2,intm3);
//输出mem1,mem2和mem3数据成员的值
voidoutput(){
___
(1)___;cout< }
//...
};
Derived:
:
Derived(intm1,intm2,intm3):
___
(2)___{___(3)___;}
(1)
(2)(3)
四、写出程序运行结果:
1.#include
classFranction{//定义分数类
intnume;//定义分子
intdeno;//定义分母
public:
//把*this化简为最简分数,具体定义在另外文件中实现
voidFranSimp();
//返回两个分数*this和x之和,具体定义在另外文件中实现
FranctionFranAdd(constFranction&x);
//置分数的分子和分母分别0和1
voidInitFranction(){nume=0;deno=1;}
//置分数的分子和分母分别n和d
voidInitFranction(intn,intd){nume=n;deno=d;}
//输出一个分数
voidFranOutput(){cout<};
voidmain()
{
Franctiona,b,c,d;
a.InitFranction(6,15);
b.InitFranction(3,10);
c.InitFranction();
c=a.FranAdd(b);
d=c.FranAdd(a);
cout<<"a:
";a.FranOutput();
cout<<"b:
";b.FranOutput();
cout<<"c:
";c.FranOutput();
cout<<"d:
";d.FranOutput();
}
2.#include
classA{
inta,b;
public:
A(){a=b=0;}
A(intaa,intbb){a=aa;b=bb;}
intSum(){returna+b;}
int*Mult(){
int*p=newint(a*b);
returnp;
}
};
voidmain(){
int*k;
Ax(2,3),*p;
p=newA(4,5);
cout<cout<Sum()<<''<<*(k=p->Mult())<deletek;
}
五、指出程序或函数的功能
1.intCount(IntNode*f)
{
if(!
f)return0;
intc=0;
while(f){
c++;
f=f->next;
}
returnc;
}
假定IntNode的类型定义为:
structIntNode{
intdata;//结点值域
IntNode*next;//结点指针域
};
2.intf(constchar*s)
{
inti=0;
while(*s++)i++;
returni;
};
六、程序改错,请根据程序段或函数模块的功能改写个别地方的错误。
1.下面是分数类fract的定义及测试主程序,在类定义及其友元函数定义中有两处错误,更正错误后程序应显示41/28,请指出错误所在行的行号并给出改正意见。
classfract{
intden;//分子
intnum;//分母
public:
fract(intd=0,intn=1):
den(d),num(n){}//1行
friendfract&operator+=(fract,fract&);//2行
voidshow(){cout<};//4行
friendfract&operator+=(fractf1,fractf2)//5行
{//7行
f1.den=f1.den*f2.num+f1.num*f2.den;//8行
f1.num*=f2.num;//9行
returnf1;//10行
}
voidmain(){
fractfr(3,4);
fr+=fract(5,7);
fr.show();
}
错误行的行号为______和________。
分别改正为______________________________
和______________________________。
《面向对象程序设计》单元复习指导四参考答案
一、选择题:
1.C2.D3.B4.C5.C6.C7.A8.C9.B10.A
11.C12.A13.A14.B15.C
二、填空题:
1.插入2.ElemHead->next3.相同4.析构
5.无参构造函数6.107.初始化表8.int&aa;
9.不会10.211.公有保护12.Public
三、程序填充参考解答
1.
(1)intStack:
:
Pop()
(2)elem[top--](3)Pop()
2.答案:
(1)a=newint[MaxLen]
(b){returna[i];}
(c)s+=r.GetValue(i)
3.
(1)Base:
:
output()
(2)Base(m1,m2)(3)mem3=m3
四、程序运行结果参考解答
1.a:
6/15
b:
3/10
c:
7/10
d:
11/10
2.56
920
五、指出程序或函数的功能
1.统计出以表头指针为f的链表中结点的个数。
2.求出并返回字符指针参数s所指向的字符串长度。
六、程序改错,请根据程序段或函数模块的功能改写个别地方的错误。
1.25
friendfract&operator+=(fract&,fract);
fract&operator+=(fract&f1,fractf2);
七、编程:
1.
Strings:
:
Strings(char*str){
n=strlen(str);
s=newchar[n+1];
strcpy(s,str);
}
2.
classA_class{
private:
intx,y,t;
public:
A_class(inti,intj):
x(i),y(j){
if(y>x){t=x;x=y;y=t;};
}
//其它函数从略
friendintVariance(A_class&ac);//参数名任意
};
intVariance(A_class&ac)
{
returnac.x*ac.x-ac.y*ac.y;
}
voidmain(){
A_classA_obj(3,5);
cout<<"Result:
"<}
9