1、面向对象程序设计形成性考核及解答作业四2011春面向对象程序设计单元复习指导(4)一、填空题:1.设px是指向一个类对象的指针变量,则执行“deletepx;”语句时,将自动调用该类的( )。A.无参构造函数B.带参构造函数C.析构函数D.拷贝构造函数2.假定AB为一个类,则执行“AB a10;”语句时调用该类无参构造函数的次数为( )。A. 0 B. 1 C. 9 D. 103.假定AB为一个类,则执行“ABa(2),b3,*p4;”语句时共调用该类构造函数的次数为( )。A. 3 B. 4 C. 5 D. 94.假定AB为一个类,px为指向该类的一个含有n个对象的动态数组的指针,则执行“d
2、eletepx;”语句时共调用该类析构函数的次数为( )。A. 0 B. 1 C. n D. n+15.对类中引用成员的初始化是通过构造函数中给出的( )实现的。A.函数体B.参数表C.初始化表D.初始化表或函数体6.一个类的静态数据成员所表示属性( )。A.是类的或对象的属性B.只是对象的属性C.只是类的属性D.类和友元的属性7.被非静态成员函数访问的类的数据成员( )。A.可以是非静态数据成员或静态数据成员B.不可能是类的静态数据成员C.只能是类的非静态数据成员D.只能是类的静态数据成员8.引入友元的主要目的是为了()。A.增强数据安全性B.提高程序的可靠性C.提高程序的效率和灵活性D.保
3、证类的封装性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. operat
4、or+(a)C. operator+(a,1)D. operator+(1,a)12.一个程序中数组a和变量k定义为“int a510,k;”,且程序中包含有语句“a(2,5)=+k*3;”,则此语句中肯定属于重载操作符的是()。A. ( ) B. = C. + D. *13.下面是重载双目运算符+的普通函数原形,其中最符合+原来含义的是()。A. Value operator+(Value, Value); B. Value operator+(Value,int);C. Value &operator+(Value, Value); D. Value &operator+(Value&,
5、Value&);14.关于插入运算符的重载,下列说法不正确的是()。1A.运算符函数的返回值类型是ostream &。B.重载的运算符必须定义为类的成员函数。C.运算符函数的第一个参数的类型是ostream &。D.运算符函数有两个参数。15. C+的继承性允许派生类继承基类的()。A.部分特性,并允许增加新的特性或重定义基类的特性B.部分特性,但不允许增加新的特性或重定义基类的特性C.所有特性,并允许增加新的特性或重定义基类的特性D.所有特性,但不允许增加新的特性或重定义基类的特性二、填空题1.当一个队列为满时,不能对其做_元素的操作。2在一个用链表实现的队列类中,假定每个结点包含的值域用e
6、lem表示,包含的指针域用next表示,链队的队首指针用elemHead表示,队尾指针用elemTail表示,当链队非空时,_指向队首结点的后继(即下一个)结点。3.在一个用链表实现的队列类中,若链队为空或只含有一个结点,则队首指针的值与队尾指针的值_。4一个类的_函数通常用于实现释放该类对象中指针成员所指向的动态存储空间的任务。5定义类动态对象数组时,其元素只能靠自动调用该类的_来进行初始化。6.假定AB为一个类,则执行“AB a10;”语句时,系统自动调用该类构造函数的次数为_。7对类中引用成员的初始化只能通过在构造函数中给出的_来实现。8.假定要把aa定义为AB类中的一个引用整数型数据成
7、员,则定义语句为_。9假定用户为类AB定义了一个构造函数“AB(intaa)a=aa;”,则系统(会/不会)_为该类自动定义一个无参构造函数AB() 。10假定用户为类AB定义了一个构造函数“AB(intaa=0):a(aa)”,则定义该类的对象时,可以有_种不同的定义格式。11.派生类的成员函数能够直接访问所含基类的_成员函数和_成员函数。12在定义一个派生类时,使用private关键字表示为私有继承,使用_关键字表示为公有继承。三、程序填空:1.已知一个利用数组实现栈的类定义如下:const int ARRAY_SIZE=10;class Stack public:void Init()
8、top=-1; /初始化栈为空void Push(int newElem); /向栈中压入一个元素int Pop(); /从栈顶弹出一个元素bool Empty() /判栈空if(top=-1) return true;else return false;int Depth() return top+1; /返回栈的深度2void Print();/按照后进先出原则依次输出栈中每个元素,直到栈空为止private:int elemARRAY_SIZE; /用于保存堆栈元素的数组int top; /指明栈顶元素位置的指针;该类的Pop和Print函数的实现分别如下:_(1)_ if(top=-1
9、) cout栈空!endl;exit(1); /中止运行return _(2)_;void Stack:Print() while(!Empty()cout_(3)_ ;(1) (2) (3)2. #include#includeclass A int *a; int n; int MaxLen;public:A(): a(0), n(0), MaxLen(0) A(int *aa, int nn, int MM) n=nn;MaxLen=MM;if(nMaxLen) exit(1);_(1)_; /由a指向长度为MaxLen的动态数组for(int i=0; in; i+) ai=aai;A
10、() delete a;int GetValue(int i) _(2)_ /函数体返回ai的值;void main()int b10=1,2,3,4,5,6,7,8,9,10;A r(b,10,10);int i,s=0;for(i=0; i10; i+); _(3)_ /把r对象的a数据成员中的每个3/元素值依次累加到s中couts=sendl;(1) (2) (3)3.在下面一段类定义中,Derived类公有继承了基类Base。需要填充的函数由注释内容给出了功能。class Baseprivate:int mem1,mem2; /基类的数据成员public:Base(int m1,int
11、 m2) mem1=m1; mem2=m2;void output()coutmem1 mem2 ;/.;class Derived: public Baseprivate:int mem3; /派生类本身的数据成员public:/构造函数,由m1和m2分别初始化mem1和mem2,由m3初始化mem3Derived(int m1,int m2, int m3);/输出mem1,mem2和mem3数据成员的值void output()_(1)_; coutmem3endl;/.;Derived:Derived(int m1,int m2, int m3): _(2)_ _(3)_;(1) (2
12、) (3)四、写出程序运行结果:1. #includeclass Franction /定义分数类int nume; /定义分子int deno; /定义分母public:/把*this化简为最简分数,具体定义在另外文件中实现void FranSimp();4/返回两个分数*this和x之和,具体定义在另外文件中实现Franction FranAdd(const Franction& x);/置分数的分子和分母分别0和1void InitFranction() nume=0; deno=1;/置分数的分子和分母分别n和dvoid InitFranction(int n, int d) nume
13、=n; deno=d;/输出一个分数void FranOutput() coutnume/denoendl;void main()Franction a,b,c,d;a.InitFranction(6,15);b.InitFranction(3,10);c.InitFranction();c=a.FranAdd(b);d=c.FranAdd(a);couta: ; a.FranOutput();coutb: ; b.FranOutput();coutc: ; c.FranOutput();coutd: ; d.FranOutput();2. #includeclass A int a,b;pu
14、blic:A() a=b=0;A(int aa, int bb) a=aa; b=bb;int Sum() return a+b;int* Mult() int *p=new int(a*b);return p;void main() int *k;A x(2,3), *p;p=new A(4,5);coutx.Sum() *(x.Mult()endl;coutSum() Mult()next;return c;假定IntNode的类型定义为:struct IntNode int data; /结点值域IntNode* next; /结点指针域;2. int f(const char *s)i
15、nt i=0;while(*s+)i+;return i;六、程序改错,请根据程序段或函数模块的功能改写个别地方的错误。1.下面是分数类fract的定义及测试主程序,在类定义及其友元函数定义中有两处错误,更正错误后程序应显示41/28,请指出错误所在行的行号并给出改正意见。class fractint den; /分子int num; /分母public:fract(int d=0,int n=1):den(d),num(n) /1行friend fract &operator+=(fract,fract&); /2行void show() coutden/next 3.相同4.析构5.无参构
16、造函数6. 10 7.初始化表8. int& aa;9.不会10. 2 11.公有保护12Public三、程序填充参考解答1. (1) int Stack:Pop() (2) elemtop- (3) Pop()2.答案:(1) a=new intMaxLen(b) return ai;(c) s+=r.GetValue(i)3. (1) Base:output() (2) Base(m1,m2) (3) mem3=m3四、程序运行结果参考解答1. a: 6/15b: 3/10c: 7/10d: 11/102. 5 69 20五、指出程序或函数的功能1.统计出以表头指针为f的链表中结点的个数。
17、2.求出并返回字符指针参数s所指向的字符串长度。六、程序改错,请根据程序段或函数模块的功能改写个别地方的错误。1. 2 5friend fract &operator+=(fract&,fract);fract &operator+=(fract &f1,fract f2);七、编程:1.Strings:Strings(char*str) n=strlen(str);s=new charn+1;strcpy(s,str);2.class A_class private:int x,y,t;8public:A_class(int i,int j):x(i),y(j)if(yx)t=x;x=y;y=t;/其它函数从略friend int Variance (A_class& ac); /参数名任意;int Variance (A_class& ac)return ac.x*ac.x-ac.y*ac.y;void main() A_class A_obj(3,5);coutResult:Variance(A_obj)endl;9
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1