第三章习题答案一、填空题1.类的成员包括两类成员,一类是代表对象属性的_数据成员_,另一类是实现对象行为的___成员函数____。2.C++对类的成员提供了_public(公有类型)、private(私有类型)和protected(保护类型)三种不同的访问权限。3.C++中,___main___是主函数名,一个项目中___一个___名为main的函数,它表示程序执行的___开始点__。4.在C++中,构造函数的名字必须与____类名___相同,它可以有任意类型的__参数__,但没有_返回值类型__,也不能指定为_void_类型。定义对象时,系统会_自动__调用构造函数。5.在C++中,析构函数的名字必须由_~__和_类名_组成,它没有_参数_,也没有_返回值_,也不能_被重载_。6.在C++中,函数的参数传递有___三种_方式,即__值传递__、_指针传递__和_引用传递_。7.对象数组是指每一数组元素都是___对象_的数组。对象数组的元素不仅具有___数据成员__,而且具有__成员函数__。二、判断正误1.若没有明确的声明,则类中的成员的访问权限为protected。(X)2.类中的任何成员函数都可以被定义为内联函数。(X)3.构造函数必须定义,不能默认。(X)4.在类中定义的函数默认为内联函数。(√)5.声明为protected的类成员,只能被它所在类及从该类派生的子类的成员函数及友元函数访问。(√)6.在声明类的同时,不能直接定义对象。(X)7.对象数组的元素是对象,但只能有数据成员。(X)8.C++语言中,函数的参数和返回值的传递方式只有值传递和引用传递两种。(X)9.拷贝构造函数的形参只能是本类对象的引用。(√)三、选择题1.下面关于重载函数说法中正确的是(D)。A.重载函数必须具有不同的返回类型B.重载函数的参数个数必须不同C.重载函数参数名称必须不同D.重载函数必须有不同的参数列表2.关于参数默认值描述正确的是(D)。A.要设置参数的默认值,就必须全部设置B.参数设置默认值后,调用函数时不能再对参数赋值C.参数默认值的设置,可以任意设置D.参数默认值的设置,只能在函数声明时设置。3.关于构造函数,下面说法正确的是(A)。A.构造函数没有返回类型B.构造函数的名字可以与类名不同C.构造函数不能重载D.构造函数只能在类外定义4.(D)不是构造函数的特征。A.构造函数的函数名与类名相同B.构造函数可以重载C.构造函数可以设置缺省参数D.构造函数必须指定类型说明5.关于析构函数,下面说法正确的是(B)。A.析构函数可以重载B.析构函数不能指定返回类型C.析构函数的名字与类名相同D.析构函数可以定义在私有部分6.通常的拷贝构造函数的参数是(C)A.某个对象名B.某个对象的成员名C.某个对象的引用名D.某个对象的指针名7.关于成员函数特征,下属描述中,(A)是错误的。A.成员函数一定是内联函数B.成员函数可以重载C.成员函数可以设置参数的缺省值D.成员函数可以是静态的8.Student是已定义的一个类,那么执行语句“Studentstu1,stu2(3),*stu3,*stu4;”,调用了(B)次构造函数。A.1B.2C.3D.49.“voidpoint(Student&s);”是某类中的一个成员函数声明,Student&s的含义为(B)。A.将s的地址赋给变量B.s是类Student的对象引用,用来作为point()的形参C.指向类Student的指针为sD.&s是类Student的对象,用来作为point()的形参四、改错题,请指出下面程序中的错误代码,并说出错误原因和改错方法。1.classDate{private:intyear,month,day;public:Date(inty,intm,intd);voidPrint(Timet);};classTime{private:inthour,minute,second;public:Time(inth,intm,ints);friendvoidDate::Print(Timet);};应在classDate语句前面加入语句classTime;表示向前引用。因为友元函数Print使用了Time类的对象作为参数,而类Time要在类Date后面才进行声明。2.#includeiostreamusingnamespacestd;classBase{protected:intx;public:Base(intm){x=m;}};voidmian(){Basea(10);couta.xendl;}couta.xendl;语句有错。因为数据成员x是受保护数据成员,因此不能被类Base的对象a访问。改错方法有两种(任选一种):1)去掉couta.xendl;语句;2)修改语句protected:为public:。3.#includestdafx.h#includeiostreamusingnamespacestd;classClock{inthour,minute,second;public:voidSetTime(inth=0,intm=0,ints=0);voidShowTime();};intmain(){Clockclock;coutFirsttimesetandoutput:endl;clock.SetTime();clock.ShowTime();coutSecondtimesetandoutput:endl;clock.SetTime(10,10,10);clock.ShowTime();clock.hour=12;return0;}voidClock::SetTime(inth,intm,ints){hour=h;minute=m;second=s;}voidClock::ShowTime(){couthour:minute:secondendl;}clock.hour=12;语句有错。因为数据成员hour是私有成员,所以不能被Clock类的对象clock访问。改正方法:去掉语句clock.hour=12;4.#includestdafx.h#includeiostreamusingnamespacestd;classCube{public:Cube(int=10,int,int=10);intvolume();private:intheight;intwidth;intlength;};Cube::Cube(inth,intw,intlen){height=h;width=w;length=len;}intCube::volume(){return(height*width*length);}Cube(int=10,int,int=10);语句有错。因为对一个函数的参数设置默认值时,所有给默认值的参数都必须在不给默认值的参数的右面。改错方法有两种(任选一种):1)Cube(int=10,int,int=10);改为Cube(int,int,int=10);;2)Cube(int=10,int,int=10);改为Cube(int=10,int=10,int=10);五、写出下面程序的运行结果1.#includestdafx.h#includeiostreamusingnamespacestd;classPoint{intx,y;public:Point(intxx=0,intyy=0){x=xx;y=yy;}Point(Point&p){x=p.x;y=p.y;cout拷贝构造函数被调用endl;}intGetx(){returnx;}intGety(){returny;}};voidfun1(Pointp){coutp.Getx()endl;}Pointfun2(){Pointa(3,4);returna;}intmain(){Pointa(7,8);couta.Getx()endl;Pointb(a);coutb.Getx()endl;fun1(b);b=fun2();coutb.Getx()endl;return0;}运行结果为:7拷贝构造函数被调用7拷贝构造函数被调用7拷贝构造函数被调用32.#includestdafx.h#includeiostreamusingnamespacestd;classPoint{intx,y;public:Point(inta,intb){x=a;y=b;}voidPrint(){cout(x,y)endl;}};intmain(){Pointa[3]={Point(1,1),Point(2,2),Point(3,3)};inti;for(i=0;i3;i++)a[i].Print();return0;}运行结果为:(1,1)(2,2)(3,3)3.#includestdafx.h#includeiostreamusingnamespacestd;classCexample{inti;public:Cexample(intn);Cexample(Cexample&b);~Cexample();intGet();};intadd(Cexamplea);intmain(){Cexamplex(12);coutx.Get()endl;coutadd(x)endl;return0;}Cexample::Cexample(intn){i=n;coutConstructingendl;}Cexample::Cexample(Cexample&b){i=b.i;coutCopyconstructingendl;}Cexample::~Cexample(){coutDestructingendl;}intCexample::Get(){returni;}intadd(Cexamplea){returna.Get()*a.Get();}运行结果为:Constructing12CopyconstructingDestructing144Destructing六、编程题1.设计一个名为Rectangle的矩形类,其属性为矩形的左上角和右下角两个点的坐标,能计算和输出矩形的周长和面积。#includestdafx.h#includeiostreamusingnamespacestd;structPoint{inta;intb;};classRectangle{PointtopLeft;PointbottomRight;public:Rectangle(Pointa,Pointb);intArea();intSideLength();};intmain(){Pointm,n;m.a=3;m.b=4;n.a=12;n.b=10;Rectanglerect(m,n);cout矩形的面积为:rect.Area()endl;cout矩形的周长为:rect.SideLength()endl;return0;}Rectangle::Rectangle(Pointa,Pointb){topLeft=a;bottomRight=b;}intRectangle::Area(){intx=bottomRight.a-topLeft.a;inty=bottomRight.b-topLeft.b;returnx*y;}intRectangle::SideLength(){intx=bottomRight.a-topLeft.a;inty=bottomRight.b-topLeft.b;return2*(x+y);}2.声明一个datatype类,能处理包含字符型、整型和浮点型三种类型的数据,给出其构造函数。#includestdafx.hclassdatatype{charx;inty;doublez;public:datatype(charx1);dat