您好,欢迎访问三七文档
习题6及其解答6.1选择题1.若有以下说明,在类外使用对象objX成员的正确语句是(c)。classX{inta;voidfun1();public:voidfun2();};XobjX;(a)objX.a=0;(b)objX.fun1();(c)objX.fun2();(d)X::fun1();2.若有以下说明,对n的正确访问语句是(b)。classY{//……;public:staticintn;};intY::n;YobjY;(a)n=1;(b)Y::n=1;(c)objY::n=1;(d)Y-n3.若有以下类Z说明,函数fStatic中访问数据a错误的是(c)。classZ{staticinta;public:staticvoidfStatic();};intZ::a=0;ZobjZ;(a)voidZ::fStatic(){objZ.a=1;}(b)voidZ::fStatic(){a=1;}(c)voidZ::fStatic(){this-a=0;}(d)voidZ::fStatic(){Z::a=0;}4.若有以下类W说明,函数fConst的正确定义是(a)。更正(d)classW{inta;public:voidfConst(int)const;};(a)voidW::fConst(intk)const{k=a;}(b)voidW::fConst(intk)const{k=a++;}(c)voidW::fConst(intk)const{cina;}(d)voidW::fConst(intk)const{a=k;}5.若有以下类T说明,函数fFriend的错误定义是(c)。classT{inti;friendvoidfFriend(T&,int);};(a)voidfFriend(T&objT,intk){objT.i=k;}(b)voidfFriend(T&objT,intk){k=objT.i;}(c)voidT::fFriend(T&objT,intk){k+=objT.i;}(d)voidfFriend(T&objT,intk){objT.i+=k;}6.在类定义的外部,可以被访问的成员有(c)。(a)所有类成员(b)private或protected的类成员(c)public的类成员(d)public或private的类成员7.关于this指针的说法正确的是(c)。(a)this指针必须显式说明(b)定义一个类后,this指针就指向该类(c)成员函数拥有this指针(d)静态成员函数拥有this指针8.说明一个类的对象时,系统自动调用(b);撤消对象时,系统自动调用(c)。(a)成员函数(b)构造函数(c)析构函数(d)友员函数9.下面对构造函数的不正确描述是(b)。(a)系统提供默认的构造函数(b)构造函数可以有参数,所以也可以有返回值(c)构造函数可以重载(d)构造函数可以设置默认参数10.下面对析构函数的正确描述是(c)。(a)系统不提供默认的析构函数(b)析构函数必须由用户定义(c)析构函数没有参数,也没有返回值(d)析构函数可以设置默认参数11.关于类的静态成员的不正确描述是(d)。(a)静态成员不属于某个对象,是类的共享成员(b)静态数据成员要在类外定义和初始化(c)静态成员函数不拥有this指针,需要通过类参数访问对象成员(d)只有静态成员函数可以操作静态数据成员12.下面选项中,(c)不是类的成员函数。(a)构造函数(b)析构函数(c)友元函数(d)复制构造函数13.下面对友员的错误叙述是(d)。(a)关键字friend用于声明友员(b)一个类中的成员函数可以是另一个类的友员(c)友员函数访问对象的成员不受访问特性影响(d)友员函数通过this指针访问对象成员14.若classB中定义了一个classA的类成员Aa,关于类成员的正确叙述是(c)。(a)在类B的成员函数中可以访问A类的私有数据成员(b)在类B的成员函数中可以访问A类的保护数据成员(c)类B的构造函数可以调用类A的构造函数做数据成员初始化(d)类A的构造函数可以调用类B的构造函数做数据成员初始化6.2阅读下列程序,写出执行结果1.#includeiostreamusingnamespacestd;classA{public:intf1();intf2();voidsetx(intm){x=m;coutxendl;}voidsety(intn){y=n;coutyendl;}intgetx(){returnx;}intgety(){returny;}private:intx,y;};intA::f1(){returnx+y;}intA::f2(){returnx-y;}intmain(){Aa;a.setx(10);a.sety(5);couta.getx()'\t'a.gety()endl;couta.f1()'\t'a.f2()endl;}【解答】1051051552.#includeiostreamusingnamespacestd;classT{public:T(intx,inty){a=x;b=y;cout调用构造函数.endl;couta'\t'bendl;}T(T&d){cout调用构造函数.endl;coutd.a'\t'd.bendl;}~T(){cout调用析构函数.endl;}intadd(intx,inty=10){returnx+y;}private:inta,b;};intmain(){Td1(4,8);Td2(d1);coutd2.add(10)endl;}【解答】调用构造函数1.48调用构造函数2.4820调用析构函数.调用析构函数.3.#includeiostreamusingnamespacestd;classT{public:T(intx){a=x;b+=x;};staticvoiddisplay(Tc){couta=c.a'\t'b=c.bendl;}private:inta;staticintb;};intT::b=5;intmain(){TA(3),B(5);T::display(A);T::display(B);}【解答】a=3b=13a=5b=134.#includeiostreamusingnamespacestd;#includecmathclassPoint{public:Point(doublex,doubley){a=x;b=y;cout点(a,b);}frienddoubled(Point&A,Point&B){returnsqrt((A.a-B.a)*(A.a-B.a)+(A.b-B.b)*(A.b-B.b));}private:doublea,b;};intmain(){Pointp1(2,3);cout到;Pointp2(4,5);cout的距离是:d(p1,p2)endl;}【解答】点(3,4)到点(4,5)的距离是:2.828435.#includeiostreamusingnamespacestd;classA{public:A(){a=5;}voidprinta(){coutA:a=aendl;}private:inta;friendclassB;};classB{public:voiddisplay1(At){t.a++;coutdisplay1:a=t.aendl;};voiddisplay2(At){t.a--;coutdisplay2:a=t.aendl;};};intmain(){Aobj1;Bobj2;obj1.printa();obj2.display1(obj1);obj2.display2(obj1);obj1.printa();}【解答】A:a=5display1:a=6display2:a=4A:a=56.#includeiostreamusingnamespacestd;classA{public:A(intx):a(x){}voidgetA(int&A){A=a;}voidprintA(){couta=aendl;}private:inta;};classB{public:B(intx,inty):aa(x){b=y;}voidgetAB(int&A,int&outB){aa.getA(A);outB=b;}voidprintAB(){aa.printA();coutb=bendl;}private:Aaa;intb;};intmain(){AobjA(5);intm;objA.getA(m);coutobjA.a=mendl;coutobjB:\n;BobjB(12,56);objB.printAB();}【解答】objA:a=5objB:a=12b=566.3思考题1.结构和类有什么区别?如果把程序中定义结构的关键字struct直接改成class,会有什么问题?用教材上的一个例程试一试,想一想做什么修改能使程序正确运行?【解答】结构是数据的封装,类是数据和操作的封装。可以把结构看成是类的特例。结构和类都可以用关键字struct或class定义。区别是,struct定义的结构或类的全部成员都是公有的,用class定义的结构或类不做声明的成员是私有的。若把struct改成class,只需要把全部成员定义为public就可以了。2.有说明classA{inta;doublex;public:funMember();};Aa1,a2,a3;编译器为对象a1、a2和a3开辟了什么内存空间?它们有各自的funMember函数的副本吗?C++通过什么机制调用类的成员函数?【解答】开辟的存储空间有a1.a,a1.x,a2.a,a2.x,a3.a,a3.x。各对象没有funMember函数的副本,C++通过this指针调用成员函数。3.C++提供了默认版本的构造函数,为什么还需要用户自定义构造函数?编写一个验证程序,说明自定义构造函数的必要性。【解答】类的默认构造函数可以建立基本类型数据成员的存储空间。基于以下两个原因,需要用户定义构造函数:(1)对数据成员的值做指定初始化;(2)类的数据是由指针管理的堆。程序略。4.试从定义方式、访问方式、存储性质和作用域分析类的一般数据成员和静态数据成员的区别,并编写一个简单程序验证它。【解答】定义方式访问方式存储性质作用域一般数据成员类中定义对象.数据成员局部数据由访问属性public,protected,private决定静态数据成员类中声明,类外定义对象.数据成员类::数据成员全局数据程序略。5.试从定义方式、调用方式分析常成员函数、静态成员函数和友员函数的区别。考察教材的例6-15,若classGoods的指针域Goods*next;被声明为私有(private)成员,程序会出现什么错误?做什么最小修改能使程序正确运行?请你试一试。【解答】定义方式调用方式常成员函数函数原型以const做后缀this指针被约束为指向常量的常指针与一般成员函数调用形式相同对数据成员只读静态成员函数以static做函数原型前缀没有this指针通过类或对象调用用于操作静态数据成员友员函数以friend做函数原型前缀没有this指针通过参数访问对象可以访问对象的不同属性的成员在例6-15中,若把next声明为私有数据成员,只须把有关指针操作的函数定义为友员函数就可以了:friendvoidpurchase(Goods*&f,Goods*&r,intw);friendvoidsale(Goods*&f,Goods*&r);6.设有classM{inta;};classN{Mm;intb;voidfun(){/*……*/}};in
本文标题:习题6及其解答
链接地址:https://www.777doc.com/doc-4731830 .html