您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > C++II程序习题及其解答
6.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(){/*……*/}};intmain(){Nn;N*p=&n;/*……*/}描述在N::fun中如何访问M类的数据成员a;在main函数中又如何访问对象n的全部数据成员?【解答】在N::fun中访问M类的数据成员a的形式是:m.a在main函数中访问M类的数据成员的形式是:n.b,n.m.a6.4编程题1.定义一个Book(图书)类,在该类定义中包括数据成员:bookname(书名)、price(价格)和number(存书数量);成员函数:display()显示图书的情况;borrow()将存书数量减1,并显示当前存书数量;restore()将存书数量加1,并显示当前存书数量。在main函数中,要求创建某一种图书对象,并对该图书进行简单的显示、借阅和归还管理。【解答】#includeiostreamusingnamespacestd;classBook{public:voidsetBook(char*,double,int);voidborrow();voidrestore();voiddisplay();private:charbookname[40];doubleprice;intnumber;};//在类外定义Book类的成员函数voidBook::setBook(char*name,doublepri,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;}intmain(){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();}2.定义一个Box(盒子)类,在该类定义中包括数据成员:length(长)、width(宽)和height(高);成员函数:构造函数Box,设置盒子长、宽和高三个初始数据;用函数volume计算并输出盒子的体积。在main函数中,要求创建Box对象,并求盒子的体积。【解答】#includeiostreamusingnamespacestd;classBOX{public:BOX(doublel,doublew,doubleh){length=l;width=w;height=h;}voidvolume(){coutvolume=length*width*heightendl;}private:doublelength,width,height;};intmain(){BOXbox1(1,3,5);box1.volume();BOXbox2(2,4,6);box2.volume();}3.定义一个Student类,在该类定义中包括:一个数据成员score(分数)及两个静态数据成员total(总分)和学生人数count;成员函数scoretotalcount(doubles)用于设置分数、求总分和累计学生人数;静态成员函数sum()用于返回总分;静态成员函数average()用于求平均值。在main函数中,输入某班同学的成绩,并调用上述函数求全班学生的总分和平均分。【解答】#includeiostreamusingnamespacestd;classstudent{public:voidscoretotalcount(doubles){score=s;total=total+score;count++;}staticdoublesum(){returntotal;}staticdoubleaverage(){returntotal/count;}private:doublescore;staticdoubletotal;staticdoublecount;};doublestudent::total=0;doublestudent::count=0;intmain(){inti,n;doubles;cout请输入学生人数:;cinn;studentstu;for(i=1;i=n;i++){cout请输入第i个学生的分数:;cins;stu.scoretotalcount(s);}cout总分:student::sum()endl;cout平均分:student::average()endl;}4.定义一个表示点的结构类型Point和一个由直线方程y=ax+b确定的直线类Line。结构类型Point有x和y两个成员,分别表示点的横坐标和纵坐标。Line类有两个数据成员a和b,分别表示直线方程中的系数。Line类有一个成员函数print用于显示直线方程;友员函数setPoint(Line&l1,Line&l2)用于求两条直线的交点。在main函数中,建立两个直线对象,分别调用print函数显示两条直线的方程,并调用函数setPoint求这两条直线的交点。【解答】#includeiostreamusingnamespacestd;structpoint{doublex;doubley;};classline{public:line(doubleu,doublev){a=u;b=v;}voidprint(){couty=ax+bendl;}friendpointsetpoint(line&l1,line&l2);private:doublea,b;};pointsetpoint(line&l1,line&l2){pointp;p.x=(l2.b-l1.b)/(l1.a-l2.a);p.y=(l1.a*l2.b-l2.a*l1.b)/(l1.a-l2.a);returnp;}intmain(){pointsetp;linel1(2,3),l2(4,5);cout直线l1:;l1.print();cout直线l2:;l2.print();setp=setpoint(l1,l2);cout直线l1和直线l2的交点:(setp.x,setp.y)endl;}5.用类成员结构修改习题6.4第4小题的程序,使其实现相同的功能。定义Point类和Line类,表示点和线;定义setPoint类,包含2个Line类成员和1个表示直线交点的Point成员,并定义类中求直线交点的成员函数。编写每个类相应的成员函数和测试用的主函数。【解答】略。7.3思考题1.一个运算符重载函数被定义为成员函数或友员函数,从定义方式、解释方式和调用方式上有何区别?可能会出现什么问题?请用一个实例说明之。【解答】以二元运算符为例。运算符重载定义解释调用成员函数Obj&operatorop();Objoperatorop(object);Obj.operatorop()ObjL.operatorop(ObjR)Objop或opObjObjLopObjR左操作数通过this指针指定,右操作数由参数传递友员函数friendObj&operatorop(Obj&);friendObjoperatorop(Obj,Obj);operatorop(Obj)operatorop(ObjL,ObjR)Objop或opObjObjLopObjR操作数均由参数传递可能会出现的问题:(1)运算符的左右操作数不同,须用友员函数重载;(2)当运算符的操作需要修改类对象状态时,应用成员函数重载。(3)友员函数不能重载运算符=()[]-必须要用友员函数重载的运算符程序略。2.类类型对象之间,类类型和基本类型对象之间用什么函数进行类型转换?归纳进行类型转换的构造函数和类型转换函数的定义形式、调用形式和调用时机。【解答】构造函数可以把基本类型、类类型数据转换成类类型数据;类类型转换函数可以在类类型和基本数据类型之间做数据转换。定义形式调用形式调用时机构造函数ClassX::ClassX(arg,arg1=E1,...,argn=En);隐式调用建立对象、参数传递时类类型转换函数ClassX::operatorType(
本文标题:C++II程序习题及其解答
链接地址:https://www.777doc.com/doc-4782985 .html