1习题及其解答第5章类与对象5.1选择题第7章1.在下列结构变量的定义中,不正确的是(d)。第8章第9章第10章(a)structemployee{charname[20];longcode;}emp;(b)struct{charname[20];longcode;}emp;(c)structemployee{charname[20];longcode;};employeeemp;(d)struct{charname[20];longcode;}employee;employeeemp;2.已知有职工情况结构变量emp定义为:structemployee{charname[20];longcode;struct{intyear;intmonth;intday;}birth;}emp;下列对emp的birth正确赋值方法是(d)。(a)year=1980;month=5;day=1;(b)birth.year=1980;birth.month=5;birth.day=1;(c)emp.year=1980;emp.month=5;emp.day=1;(d)emp.birth.year=1980;emp.birth.month=5;emp.birth.day=1;3.假定有以下声明和定义,则下面引用形式错误的是(b)。37structstudent{intnum;floatscore;}stu[3]={{1001,80},{1002,75},{1003,91}},*p=stu;(a)p-num(b)(p++).num(c)(p++)-num(d)(*p).num4.下列四个运算符中,优先级最低的是(a)。(a)++(b).(c)-(d)()5.若有以下声明和定义,则下列错误的引用是(d)。structworker{intno;charname[20];}w,*p=&w;(a)w.no(b)p-no(c)(*p).no(d)*p.no6.若有以下声明和定义,则下列引用非法的是(d)。structdata{intn;floatscore;data*q;};dataa[3]={1001,87,&a[1],1002,75,&a[2],1003,90,&a[0]};data*p=a;(a)p-n++(b)(*p).n++(c)++p-n(d)*p-n7.关于类和对象不正确的说法是(c)。(a)类是一种类型,它封装了数据和操作(b)对象是类的实例(c)一个类的对象只有一个(d)一个对象必属于某个类8.在类定义的外部,可以被访问的成员有(c)。(a)所有类成员(b)private或protected的类成员(c)public的类成员(d)public或private的类成员9.关于this指针的说法错误的是(a,d)。(a)this指针必须显式说明(b)当创建一个对象后,this指针就指向该对象(c)成员函数拥有this指针(d)静态成员函数拥有this指针10.声明一个类的对象时,系统自动调用(b,d)函数;撤消对象时,系统自动调用(c)函数。(a)成员函数(b)构造函数(c)析构函数(d)复制构造函数11.下面对构造函数的不正确描述是(b)。第11章(a)系统可以提供默认的构造函数(b)构造函数可以有参数,所以也可以有返回值38(c)构造函数可以重载(d)构造函数可以设置默认参数12.下面对析构函数的正确描述是(a,c)。(a)系统可以提供默认的析构函数(b)析构函数必须由用户定义(c)析构函数没有参数(d)析构函数可以设置默认参数13.对静态成员的不正确描述是(c,d)。(a)静态成员不属于对象,是类的共享成员(b)静态数据成员要在类外定义和初始化(c)调用静态成员函数时要通过类或对象激活,所以静态成员函数拥有this指针(d)只有静态成员函数可以操作静态数据成员14.下面选项中,不是类的成员函数为(c)。(a)构造函数(b)析构函数(c)友元函数(d)复制构造函数15.下面对友员的错误描述是(d)。(a)关键字friend用于声明友员(b)一个类中的成员函数可以是另一个类的友员(c)友员函数访问对象的成员不受访问特性影响(d)友员函数通过this指针访问对象成员5.2阅读下列程序,写出执行结果4.#includeiostream.hclassA{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;}voidmain(){Aa;a.setx(10);a.sety(5);couta.getx()'\t'a.gety()endl;couta.f1()'\t'a.f2()endl;39}答案:1051051555.#includeiostream.hclassT{public:T(intx,inty){a=x;b=y;cout调用构造函数1.endl;couta'\t'bendl;}T(T&d){cout调用构造函数2.endl;coutd.a'\t'd.bendl;}~T(){cout调用析构函数.endl;}intadd(intx,inty=10){returnx+y;}private:inta,b;};voidmain(){Td1(4,8);Td2(d1);coutd2.add(10)endl;}答案:调用构造函数1.48调用构造函数2.4820调用析构函数.调用析构函数.6.#includeiostream.h40classT{public:T(intx){a=x;b+=x;};staticvoiddisplay(Tc){couta=c.a'\t'b=c.bendl;}private:inta;staticintb;};intT::b=5;voidmain(){TA(3),B(5);T::display(A);T::display(B);}答案:a=3b=13a=5b=137.#includeiostream.h#includemath.hclasspoint{public:point(floatx,floaty){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;};voidmain(){pointp1(2,3);cout到;pointp2(4,5);cout的距离是:d(p1,p2)endl;}答案:点(3,4)到点(4,5)的距离是:2.82843418.#includeiostream.hclassA{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;};};voidmain(){Aobj1;Bobj2;obj1.printa();obj2.display1(obj1);obj2.display2(obj1);obj1.printa();}答案:A:a=5display1:a=6display2:a=4A:a=55.3编程题6.定义一个Book(图书)类,在该类定义中包括数据成员:bookname(书名)、price(价格)和number(存书数量);成员函数:display()显示图书的情况;borrow()将存书数量减1,并显示当前存书数量;restore()将存书数量加1,并显示当前存书数量。在main函数中,要求创建某一种图书对象,并对该图书进行简单的显示、借阅和归还42管理。解答:#includeiostream.h#includestring.h#includestdlib.hclassBook{public:voidsetBook(char*,float,int);voidborrow();voidrestore();voiddisplay();private:charbookname[40];floatprice;intnumber;};//在类外定义Book类的成员函数voidBook::setBook(char*name,floatpri,intnum){strcpy(bookname,name);price=pri;number=num;}voidBook::borrow(){if(number==0){cout已没存书,退出!endl;abort();}number=number-1;cout借一次,现存书量为:numberendl;}voidBook::restore(){number=number+1;cout还一次,现存书量为:numberendl;}voidBook::display(){cout存书情况:endlbookname:booknameendlprice:priceendlnumber:numberendl;43}voidmain(){charflag,ch;Bookcomputer;computer.setBook(c++程序设计基础,32,1000);computer.display();ch='y';while(ch=='y'){cout请输入借阅或归还标志(b/r):;cinflag;switch(flag){case'b':computer.borrow();break;case'r':computer.restore();}cout是否继续?(y/n);cinch;}computer.display();}7.定义一个Box(盒子)类,在该类定义中包括数据成员:length(长)、width(宽)和height(高);成员函数:构造函数Box设置盒子长、宽和高三个初始数据;函数volume计算并输出盒子的体积。在main函数中,要求创建Box对象,并求盒子的体积。解答:略。8.定义一个Student类,在该类定义中包括:一个数据成员score(分数)及两个静态数据成员total(总分)和学生人数count;成员函数scoretotalcount(floats)用于设置分数、求总分和累计学生人数;静态成员函数sum()用于返回总分;静态成员函数average()用于求平均值。在main函数中,输入某班同学的成绩,并调用上述函数求全班学生的总分和平均分。解答:类声明如下,实现代码略。classstudent{public:voidscoretotalcount(float);staticfloatsum();staticfloataverage();44private:floatscore;staticfloattotal;staticfloatcount;};floatstudent::total=0;floatstudent::count=0;9.定义一个表示点的结构类型Point和一个由直线方程y=ax+b确定的直线类Line。结构类型Point有x和y两个成员,它们分别表示点的横坐标和纵坐标。Line类有两个数据