c++类与对象作业题 挺重要_第1页
c++类与对象作业题 挺重要_第2页
c++类与对象作业题 挺重要_第3页
c++类与对象作业题 挺重要_第4页
c++类与对象作业题 挺重要_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、做你想做的,但你首先要知道你想做的是什么一、选择与填空1.下列有关类的说法不正确的是( )。A对象是类的一个实例B任何一个对象只能属于一个具体的类C一个类只能有一个对象D 类与对象的关系和数据类型与变量的关系相似答案:C分析:对象是类的一个实例,类与对象的关系和数据与变量的关系相似,所以一个类可以有多个对象。2.下面( )项是对构造函数和析构函数的正确定义。Avoid X:X(), void X:X()BX:X(参数),X:X()CX:X(参数),X:X(参数)Dvoid X:X(参数),void X:X(参数)答案:B分析构造函数无返回类型、可带参数、可重载;析构函数无返回类型、不可带参数、

2、不可重载。3.( )的功能是对象进行初始化。A析构函数B. 数据成员 C.构造函数 D.静态成员函数答案:C分析:当一个对象定义时,C+编译系统自动调用构造函数建立该对象并进行初始化;当一个对象的生命周期结束时,C+编译系统自动调用析构函数注销该对象并进行善后工作;4.下列表达方式正确的是( )。Aclass PBclass Ppublic: public:int x=15; int x;voidshow()coutx; void show()coutx; C class P D. class Pintf; public: ; int a;f=25; void Seta (int x) a=x

3、;答案:D分析:在类体内不可对数据成员进行初始化;类定义结束时需用分号;只有类中的成员函数才能存取类中的私有数据。5.拷贝构造函数具有的下列特点中,( )是错误的。A如果一个类中没有定义拷贝构造函数时,系统将自动生成一个默认的B拷贝构造函数只有一个参数,并且是该类对象的引用C拷贝构造函数是一种成员函数D 拷贝构造函数的名字不能用类名答案:D分析:如果一个类中没有定义拷贝构造函数时,系统将自动生成一个默认的;拷贝构造函数只有一个参数,并且是该类对象的引用;拷贝构造函数的名字与类同名,并且不被指定返回类型;拷贝构造函数是一种成员函数。6.关于静态成员的描述中,( )是错误的。A静态成员可分为静态数

4、据成员和静态成员函数B静态数据成员定义后必须在类体内进行初始化C静态数据成员初始化不使用其构造函数D静态数据成员函数中不能直接引用非静态成员答案:B静态成员的初始化位置在哪 怎么初始化的分析:静态成员可分为静态数据成员和静态成员函数;静态数据成员被定义后,必须对它进行初始化,初始化在类体外进行,一般放在该类的实现部分最合适,也可以放在其他位置,例如,放在主函数前面等;静态数据成员初始化与该类的构造函数和析构函数无关;在静态成员函数的实现中,可以直接引用静态成员,但不能直接引用非静态成员。7.关于友元的描述中,( )是错误的。A友元函数是成员函数,它被说明在类体内B 友元函数可直接访问类中的私有

5、成员C 友元函数破坏封装性,使用时尽量少用D 友元类中的所有成员函数都是友元函数答案:A分析:友元函数是非成员函数,在类体内说明了,在类体外定义,定义和调用等同于一般的普通函数;由于它可以直接访问类的私有成员,因此破坏了类的封装性和隐藏性,尽量少用。8.设有如下程序结构:class Box ;void main()Box A,B,C; 该程序运行时调用 (1) 次构造函数;调用 (2) 次析构函数。答案:(1)3(2)3分析:每创建一个对象自动调用一次构造函数,在这里创建了A、B、C三个对象,所以共调用了三次构造函数;每释放一个对象,系统自动调用一次析构函数,A、B、C对象释放时,分别调用析构

6、函数,所以析构函数共调用了三次。9.设A为test类的对象且赋有初值,则语句test B(A); 表示 。答案:将对象A复制给对象B。分析:执行test B(A);语句相当于调用了默认复制构造函数,将A对象的属性复制给B对象。10.利用“对象名.成员变量”形式访问的对象成员仅限于被声明为 (1)的成员;若要访问其他成员变量,需要通过 (2) 函数或 (3) 函数。答案:(1) public (2) 成员函数 (3)友元函数分析:类体内的数据成员可声明为公有的、私有的和保护的,公有的数据成员可利用“对象名.成员变量”形式来进行访问;私有的数据成员能被类中的其他成员函数或友元函数所调用;保护的数据

7、成员可以在类体中使用,也可以在派生类中使用,但不能在其他类外通过对象使用。11对类的构造函数和析构函数描述正确的是()。A. 构造函数可以重载,析构函数不能重载B. 构造函数不能重载,析构函数可以重载C. 构造函数可以重载,析构函数也可以重载D. 构造函数不能重载,析构函数也不能重载答案:A12.类的析构函数的作用是(D)。A.一般成员函数B.类的初始化C.对象初始化 D.删除对象答案:D13.假设OneClass为一个类,则该类的拷贝初始化构造函数的声明语句为( )。A.OneClass(OneClass p); B. OneClass& (OneClass p);C. OneClass(O

8、neClass & p);D. OneClass (OneClass *p);答案:C14.下面对于友元函数描述正确的是( )。A.友元函数的实现必须在类的内部定义B.友元函数是类的成员C.友元函数破坏了类的封装性和隐藏性D.友元函数不能访问类的私有成员答案:C15.对于结构中定义的成员,其默认的访问权限为( )。A.public B. protected C.privateD. static答案:C16.为了使类中的某个成员不能被类的对象通过成员操作符访问,则不能把该成员的访问权限定义为()。A.public B. protected C.privateD. static答案:A17.下面对

9、静态数据成员的描述中,正确的是( )。A.静态数据成员可以在类体内进行初始化B.静态数据成员不可以在类体内进行初始化C.静态数据成员不能受private控制符的作用D.静态数据成员可以直接用类名调用答案:B18.下面对静态数据成员的描述中,正确的是( )。A.静态数据成员是类的所有对象共享的数据B.类的每一个对象都有自己的静态数据成员C.类的不同对象有不同的静态数据成员值D.静态数据成员不能通过类的对象调用答案:A二、分析程序执行结果,如果出错则分析其出错结果1.分析以下程序执行的结果 #include #include class Sample public: int x,y; Sample

10、()x=y=0; Sample(int a,int b)x=a;y=b; void disp() coutx=x,y=yendl; ; void main() Sample s1(2,3); s1.disp(); 解:本题说明了重载构造函数的定义方法。首先定义了一个类Sample,在main()中定义了它的一个对象,定义s1对象时调用其重载构造函数(x=2,y=3),然后,调用其成员函数输出数据成员。所以输出为:x=2,y=3。 注意:构造函数是唯一不能被显式调用的成员函数,它在定义类的对象时自动调用,也称为隐式调用。 - 2.分析以下程序的执行结果 #include class Sample

11、 int x,y; public: Sample()x=y=0; Sample(int a,int b)x=a;y=b; Sample() if(x=y) coutx=yendl; else coutx!=yendl; void disp() coutx=x,y=yendl; ; void main() Sample s1(2,3); s1.disp(); 解:本题说明了析构函数的定义方法。首先定义了一个类Sample,在main()中定义了它的一个对象,定义s1对象时调用其重载构造函数(x=2,y=3),然后,调用其成员函数输出数据成员,最后在退出程序时自动调用析构函数。所以输出为: x=2

12、,y=3 x!=y 注意:析构函数在对象的作用域结束时被自动隐式调用。 3.分析以下程序的输出结果 #include class Sample int x; public: Sample(int a) x=a; coutconstructing object:x=xendl; ; void func(int n) static Sample obj(n); void main() func(1); func(10); 解:本题说明静态对象构造函数的调用情况,由于在func()函数中定义的对象obj是静态对象,故只被构造一次,所以输出为: counstructing object:x=1 注意:

13、静态对象和静态变量一样,只被构造一次。块作用域的静态变量,在首次进入到定义该静态对象的函数时,构造该静态对象,以后进入该函数时不再构造静态对象。 - 4. 分析以下程序的执行结果 #include class Sample int x,y; public: Sample()x=y=0; Sample(int a,int b)x=a;y=b; void disp() coutx=x,y=ydisp(); 解:本题说明了对象指针的使用方法。这里通过指向对象的指针来调用对象的成员函数。对象指针p指向对象s,p-disp()等价于s.disp()。所以输出为: x=2,y=3.5.分析以下程序的执行结

14、果 #include class Sample public: int x; int y; void disp() coutx=x,y=yendl; ; void main() int Sample:*pc; Sample s; pc=&Sample:x; s.*pc=10; pc=&Sample:y; s.*pc=20; s.disp(); 解:本题说明了类数据成员指针的使用方法。在main()中定义的pc是一个指向Sample类数据成员的指针。执行pc=&Sample:x时,pc指向数据成员x,语句s.*pc=10等价于s.x=10(为了保证该语句正确执行,Sample类中的x必须是公共成

15、员);执行pc=&Sample:y时,pc指向数据成员y,语句s.*pc=20等价于s.y=20(同样,Sample类中的y必须是公共成员)。所以输出为: x=10,y=20。 - 6. 分析以下程序的执行结果 #include class Sample int x,y; public: Sample()x=y=0; Sample(int a,int b)x=a;y=b; void disp() coutx=x,y=yendl; ; void main() Sample s1,s2(2,3); s1.disp(); s2.disp(); 解: 本题说明了构造函数的调用顺序。首先定义了一个类Sa

16、mple,在main()中定义了它的两个对象,定义s1对象时调用其默认构造函数(x=0,y=0),定义s2对象时调用其重载构造函数(x=2,y=3),然后,调用各自的成员函数输出各自的数据成员。所以输出为: x=0,y=0 x=2,y=3 - 7. 分析以下程序执行的结果 #include class Sample int x,y; public: Sample() x=y=0; Sample(int a,int b) x=a;y=b; Sample() if(x=y) coutx=yendl; else coutx!=yendl; void disp() coutx=x,y=yendl; ;

17、 void main() Sample s1(2,3); s1.disp(); s1.Sample(); 解: 本题说明了可以显式调用析构函数。首先定义了一个类Sample,在main()中定义了它的一个对象,定义s1对象时调用其重载构造函数(x=2,y=3),然后,调用其成员函数输出数据成员,然后调用一次析构函数,最后在退出程序时又自动调用析构函数,所以输出为: x=2,y=3 x!=y x!=y 注意:析构函数不同于构造函数,析构函数既能被显式调用,也能被隐式调用。 - 8. 分析以下程序的执行结果 #include class Sample int x,y; public: Sample

18、() x=y=0; Sample(int a,int b) x=a;y=b; Sample() if(x=y) coutx=yendl; else coutx!=yendl; void disp() coutx=x,y=yendl; ; void main() Sample s1,s2(2,3); s1.disp(); s2.disp(); 解: 本题说明了析构函数的调用顺序,这里定义了两个对象,先顺序调用s1和s2对象的构造函数,再调用各自的成员函数disp(),最后顺序调用s2和s1的析构函数。所以输出为: x=0,y=0 x=2,y=3 x!=y x=y 9.分析以下程序的执行结果 #i

19、nclude #include class Sample public: int x,y; Sample()x=y=0; Sample(int a,int b)x=a;y=b; void disp() coutx=x,y=yendl; Sample() if(x=y) coutx=yendl; else coutx!=yendl; ; void main() Sample s1(2,3); s1.disp(); if(s1.x=2) exit(0); 解: 本题说明了非正常退出程序时析构函数调用的情况。定义了一个类Sample,在main()中定义了它的一个对象,定义s1对象时调用其重载构造函

20、数(x=2,y=3),然后,调用其成员函数输出数据成员,由于if条件成立,执行exit非正常退出,不会隐式调用析构函数,所以输出为: x=2,y=3 注意:如果程序使用exit、abort非正常退出,不会隐式调用析构函数,这样造成对象申请资源无法回收,从而导致操作系统的资源紧张而使应用程序无法运行。因此在通常情况下,应使用return语句正常退出。 - 10.分析以下程序的执行结果 (不用看了!)#include class Sample int x,y; public: Sample()x=y=0; Sample(int a,int b)x=a,y=b; Sample() if(x=y) c

21、outx=yendl; else coutx!=yendl; void disp() coutx=x,y=yendl; ; void main() Sample(2,3); 解: 本题说明了常量对象的构造函数和析构函数的调用情况。在main()中定义了一个常量对象,常量对象在构造之后立即析构。所以输出为: x!=y 注意:常量对象的作用域不是整个main()函数,而是仅限于包含该常量的值表达式,表达式一旦计算完成,其中的对象就按构造的逆序析构。 - 11.分析以下程序的执行结果 #include class Sample public: Sample(); Sample(int); Sampl

22、e(); void display(); protected: int x; ; Sample:Sample() x=0; coutconstructing normallyn; Sample:Sample(int m) x=m; coutconstructing with a number:xendl; void Sample:display() coutdisplay a number:xendl; Sample:Sample() coutdestructingn; void main() Sample obj1; Sample obj2(20); obj1.display(); obj2

23、.display(); 解: 本题构造函数与析构函数的调用顺序。这里定义了两个对象,先顺序调用obj1和obj2对象的构造函数,再调用各自的成员函数disp(),最后顺序调用obj2和obj1的析构函数。所以输出为: constructing nomally constructing with a number:20 display a number:0 display a number:20 destructing destructing - JJJAAAAAA#include class Sample int n; static int sum; public: Sample(int x)

24、n=x; void add()sum+=n; void disp() coutn=n,sum=sumendl; ; int Sample:sum=0; / 静态数据成员赋初值 void main() Sample a(2),b(3),c(5); a.add(); a.disp(); b.add(); b.disp(); c.add(); c.disp(); 解: 本题说明静态数据成员的使用方法。在类中定义了一个静态数据成员sum,在main()之前给它赋初值0,然后在main()中定义了三个对象,并执行各自的add()和disp()方法。所以输出为: n=2,sum=2 n=3,sum=5 n

25、=5,sum=10 注意:静态数据成员脱离具体的对象独立存在,其存储单元不是任何对象存储空间的一部分,但逻辑上所有对象都共享这一存储单元,对静态数据成员的任何操作都会访问这一存储单元,从而影响这一存储单元的所有对象。所以说静态数据成员不是对象成员,在引用时不需要用对象名。 13.分析以下程序执行的结果 #include class Sample int A; static int B; public: Sample(int a)A=a,B+=a; static void func(Sample s); ; void Sample:func(Sample s) coutA=s.A,B=Bendl

26、; int Sample:B=0; void main() Sample s1(2),s2(5); Sample:func(s1); Sample:func(s2); 解: 本题说明了静态成员函数的使用方法。其中的数据成员B是静态数据成员,求B之值是在构造函数中进行的。所以输出为: A=2,B=7 A=5,B=7 注意:静态成员函数与静态数据成员一样,也不是对象成员。静态成员函数的调用不同于普通的成员函数。在静态成员函数的实现中,引用类的非静态数据成员是通过对象进行的,如本题中s.A,引用类的静态数据成员是直接进行的,如本题中的B。 - 14.分析以下程序的执行结果 #include clas

27、s Sample char c1,c2; public: Sample(char a)c2=(c1=a)-32; void disp() coutc1转换为c2endl; ; void main() Sample a(a),b(b); a.disp(); b.disp(); 解: 本题说明了构造函数的调用方法。对于对象定义(c),构造函数执行c1=c,c2=c-32(小写转大写)。所以输出为: a转换为A b转换为B - 15.分析以下程序执行的结果 #include class Sample int x,y; public: Sample()x=y=0; Sample(int a,int b

28、)x=a;y=b; void disp() coutx=x,y=yendl; ; void main() Sample s1,s2(1,2),s3(10,20); Sample *pa3=&s1,&s2,&s3; for(int i=0;idisp(); 解: 本题说明对象指针数组赋初值方法。定义三个对象和一个对象指针数组,通过赋初值使后者的元素分别指向前面三个对象,然后使用for语句循环调用各个对象的disp()成员函数。所以输出为: x=0,y=0 x=1,y=2 x=10,y=20 - 16. 分析以下程序的执行结果 #include class Sample int x,y; publ

29、ic: Sample()x=y=0; Sample(int a,int b)x=a,y=b; void disp() coutx=x,y=yendl; ; void main() Sample s1,s2(1,2),s3(10,20); Sample *Pa3; Pa0=&s1; Pa1=&s2; Pa2=&s3; for(int i=0;idisp(); 解: 本题说明对象指针数组的赋值方法。定义三个对象和一个对象指针数组,通过赋值语句使后者的元素分别指向前面的三个对象(而不是采用上题的赋初值方法),然后使用for语句循环调用各个对象的disp()成员函数。所以输出为: x=0,y=0 x=

30、1,y=2 x=10,y=20 17. 分析以下程序的执行结果 #include class Sample public: int x; int y; void disp() coutx=x,y=y*pc=10; pc=&Sample:y; p-*pc=20; p-disp(); 解: 本题说明了类数据成员指针的使用方法。这里通过指向对象的指针来给类数据成员赋值,其原理与上题相似。输出为: x=10,y=20 - 18.分析以下程序的执行结果 #include class Sample int x; int y; public: Sample(int a,int b) x=a;y=b; int

31、 getx()return x; int gety()return y; ; void main() int (Sample:*fp)(); fp=&Sample:getx; Sample s(2,7); int v=(s.*fp)(); fp=&Sample:gety; int t=(s.*fp)(); coutv=v,t=tendl; 解: 本题说明了类成员函数指针的使用方法。在main()中定义的fp是一个指向Sample类成员函数的指针。执行fp=Sample:getx后。fp指向成员函数getx(),int v=(s.*fp)()语句等价于int v.getx(),v=x=2;执行f

32、p=Sample:gety之后,fp指向成员函数gety(),int t=(s.*fp)()语句等价于int t=s.gety(),t=x=7。所以输出为: v=2,t=7 - 19.分析以下程序的执行结果 #include class Sample int x; int y; public: Sample(int a,int b) x=a;y=b; int getx()return x; int gety()return y; ; void main() int (Sample:*fp)(); fp=&Sample:getx; Sample s(2,7),*p=&s; int v=(p-*f

33、p)(); fp=&Sample:gety; int t=(p-*fp)(); coutv=v,t=tendl; 解: 本题说明了类成员函数指针的使用方法。这里通过指向对象的指针来调用指向类成员函数的指针,其原理与上题相似。输出仍为: v=2,t=7 20.分析找出以下程序中的错误,说明错误原因,给出修改方案使之能正确运行。#includeclass one int a1,a2;public:one(int x1=0, x2=0);void main()one data(2,3);coutdata.a1endl;coutdata.a2endl;分析:出错原因:构造函数参数表语法错;构造函数没有

34、函数体;类的对象不能直接访问类的私有成员变量。改正后的程序如下:#includeclass one int a1, a2;public:one(int x1=0, int x2=0) a1=x1;a2=x2;int geta1() return a1; int geta2() return a2; ;void main()one data(2,3);coutdata.geta1()endl;coutdata.geta2()endl;21.分析以下程序的错误原因,给出修改方案使之能正确运行。#include class Amplifierfloat invol,outvol;public:Amp

35、lifier(float vin,float vout)invol=vin;outvol=vout;float gain();Amplifier:float gain() return outvol/invol; void main()Amplifier amp(5.0,10.0);coutgain()endl;分析:成员函数在类体外定义格式是:函数返回类型类名:成员函数名(参数表);成员函数调用格式是:对象名.成员函数名(参数表)。改正后的程序如下:#include class Amplifier float invol,outvol;public:Amplifier(float vin,f

36、loat vout) invol=vin;outvol=vout;float gain();float Amplifier:gain() return outvol/invol;void main() Amplifier amp(5.0,10.0);coutamp.gain()endl;22.下列程序的运行结果是 。#include class pointint x,y;public:point(int a,int b)x=a;y=b;coutcalling the constructor function.endl;point(point &p);friend point move(poin

37、t q);point()coutcalling the destructor function.n;int getx()return x;int gety() return y;point:point(point &p)x=p.x;y=p.y;coutcalling the copy_initialization constructor function.n;point move(point q)coutOK!n;int i,j; i=q.x+10;j=q.y+20;point r(i,j);return r;void main() point m(15,40),p(0,0);point n(

38、m);p=move(n);coutp=p.getx(),p.gety()endl;分析:根据构造函数、拷贝构造函数和友元函数的特点,执行该程序后,输出结果是:calling the constructor function.calling the constructor function.calling the copy_initialization constructor function.calling the copy_initialization constructor function.OK!calling the constructor function.calling the c

39、opy_initialization constructor function.calling the destructor function.calling the destructor function.calling the destructor function.P=25,60calling the destructor function.calling the destructor function.calling the destructor function.说明:(1)构造函数执行三次,分别初始化主函数中的对象m,p和move函数中的对象r。(2)拷贝构造函数共执行了三次。第一

40、次,初始化对象n;第二次在调用函数move()时,实参n给形参q进行初始化;第三次是执行函数move的return r;语句时,系统用r初始化一个匿名对象时使用了拷贝构造函数。(3)析构函数执行了六次。在退出函数move时释放对象r和q共调用二次;返回主函数后,匿名对象赋值给对象p后,释放匿名对象又调用一次析构函数;最后退出整个程序时释放对象m,n和p调用三次。23.#include class Pointint x,y;public:Point()x=1;y=1;Point()coutPoint x,y is deleted.endl; ;void main()Pointa;运行结果为:Po

41、int 1,1 is deleted.24. #include #include int count=0;class Pointint x,y;public:Point() x=1;y=1;count+;Point()count-;friend void display();;void display() cout There are count points,endl;void main() Point a;display();Point b5;display();display();运行结果为:There are 1 points,There are 6 points,There are

42、1 points,25.#includeclass Csampleint i;public:Csample( );void Display( );Csample();Csample:Csample( ) cout”Constructor”,”;i=0;void Csample:Display() cout”i=”i”,”;Csample:Csample( ) cout”Destructor”endl;void main( ) Csample a;a.Display( );运行结果为:Constructor,i=0,Destructor26. #include #include class Cs

43、ample int i;public:Csample()cout constructor1 endl; Csample(int val)cout Constructor2endl;i=val;void Display()couti=iendl;Csample()coutDestructorendl;getch(); ;void main()Csample a,b(10);a.Display();b.Display();运行结果为:Constructor1Constructor2i=-858993460i=10DestructorDestructor27.#includeclass Csampl

44、eprivate:int i;static int k;public:Csample( );void Display( );int Csample:k=0;Csample:Csample( ) i=0;k+;void Csample:Display( ) cout”i=”i”,k=”kendl;void main( ) Csample a,b;a.Display( );b.Display( );运行结果为:i=0,k=2i=0,k=2三、编程题1、定义盒子Box类,要求具有以下成员:可设置盒子形状;可计算盒子体积;可计算盒子的表面积,要求有默认构造函数、复制构造函数和析构函数。#includeclass Box int x,y,z;int v,s;public:void init(int x1=0,int y1=0,int z1=0)x=x1;y=y1;z=z1;void volue()v=x*y*z;void area() s=2*(x*y+x*z+y*z);void show()coutx= xy= y z=zendl;couts= sv=

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论