资源描述:
《练习(第十章)参考答案》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、1为什么要引入构造函数和析构函数?答案:(1)由于系统在创建一个类的对象时,需要使所创建的对象始终与所属类的定义域相关,即创建时:①为对象的属性(数据成员)分配空间;②有时还需要对对象的属性进行必要的初始化。因此需要类通过一个特殊的操作,即构造函数完成一个对象的创建工作。⑵而一个对象在被撤消时,必须:①回收被撤消对象的属性空间;②有时还需要做一些对象撤消之前的善后工作。因此又需要另一个特殊操作,即析构函数完成一个对象的撤消工作。2类A,B,C的定义如下:classA{inta;public:A(inta)A::a=a;};clas
2、sintb;public:B(intb){B:b=b;}};classC{Bdatal;Adata2;public:C(inta,intb):data2(a),datal(b)};试分析当类C的对象创建时,类A,B,C构造函数被调用的关系和顺序,并说明为什么?答案:在调用类C构造函数创建类对象的过程中,类A和B的构造函数被调用。它们被调用的顺序如下:C(inta,intb)开始执行->B(intb)被调用->A(inta)被调用->C(inta,intb)结束执行。因为类对象的数据成员是在类对象的创建过程中顺序创建的,是类对象构造
3、函数操作的一部分,并在类对象创建完成之前完成创建。数据成员的创建操作是由数据成员的类型构造函数完成的,数据成员类型构造函数被调用的顺序取决于数据成员在类中的定义顺序,而与类构造函数的初始化表中的书写顺序无关。4下面有一段程序,若有不正确的地方请改正过来:#includeclasspointintx15y1;public:point(intx5inty);〃…};main(){pointdata1(5,5);cout«datal.xl«“rT;cout«datal.y1«“rT;pointdata2[10
4、];return1;}答案:程序的错误有三处:①构造函数只有声明没有定义(实现代码);②没有一个不需要传递参数的构造函数,因此不能创建对象数组;③不能在main函数(类外)中直接访问类对象的私有成员。因此,需要对程序进行如下的符合面向对象的修改(黑体字为修改和添加的部分):includeclasspoint{intx1,y1;public:point(intx=0,inty=0);intgetx();intgety();〃…};point::point(intx,inty){x1=X;yi=y;}intpo
5、int::getx(){returnx1;}intpoint::gety(){returny1;main()pointdatal(5,5);cout«datal.getx()«“”;cout«datal.gety()«An";pointdata2[10];return1;}4为什么下面这个C++程序无法通过编译?classXinti;public:X(inti){X::i=i;}};intmain()XxArray[10];return0;答案:这是因为类X没有一个不需要传递参数的构造函数,所以不能创建X类对象数组xArray
6、o5有一个point类,其中包含两个整型变量x,y;另有一个line类,其中包含两个point类对象,表示直线的两个端点。line类具有定义直线、画线.清除线、移动和复制直线的能力。给出这两个类的定义及所有可能的操作。答案:classline;classpoint{intx,y;public:point(intx,inty){this->x=x;this->y=y;}friendclassline;classline{pointp1,p2;public:line(pointp15pointp2){this->p1=p1;this-
7、>p2=p2;}voiddraw();voidclear();voidmove(intdx,intdy);voidcopy(constline&line){*this=line;}};6、l=0,k=21=0,k=27、Constructor^i=0,Destructor8、ConstructorConstructori=0i=10DestructorDestructor9、CCounterConstructor!CExampleConstructor!value=2CExampleDestructorCCounterDestru
8、ctor