第三章第四章习题答案_第1页
第三章第四章习题答案_第2页
第三章第四章习题答案_第3页
第三章第四章习题答案_第4页
第三章第四章习题答案_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第三章习题答案一、填空题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.#include<iostream>usingnamespacestd;classBase { protected: intx; public: Base(intm){x=m;} };voidmian() { Basea(10); cout<<a.x<<endl; }cout<<a.x<<endl;语句有错。因为数据组员x是受保护数据组员,所以不能被类Base对象a访问。改错方法有两种(任选一个):1)去掉cout<<a.x<<endl;语句;2)修改语句protected:为public:。3.#include"stdafx.h"#include"iostream"usingnamespacestd;classClock{ inthour,minute,second;public: voidSetTime(inth=0,intm=0,ints=0); voidShowTime();};intmain(){ Clockclock; cout<<"Firsttimesetandoutput:"<<endl; clock.SetTime(); clock.ShowTime(); cout<<"Secondtimesetandoutput:"<<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(){ cout<<hour<<":"<<minute<<":"<<second<<endl;}clock.hour=12;语句有错。因为数据组员hour是私有组员,所以不能被Clock类对象clock访问。改过方法:去掉语句clock.hour=12;4.#include"stdafx.h"#include<iostream>usingnamespacestd;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.#include"stdafx.h"#include"iostream"usingnamespacestd;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){ cout<<p.Getx()<<endl;}Pointfun2(){ Pointa(3,4); returna;}intmain(){ Pointa(7,8); cout<<a.Getx()<<endl; Pointb(a); cout<<b.Getx()<<endl; fun1(b); b=fun2(); cout<<b.Getx()<<endl; return0;}运行结果为:7拷贝结构函数被调用7拷贝结构函数被调用7拷贝结构函数被调用32.#include"stdafx.h"#include"iostream"usingnamespacestd;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;i<3;i++) a[i].Print();return0;}运行结果为:(1,1)(2,2)(3,3)3.#include"stdafx.h"#include"iostream"usingnamespacestd;classCexample{inti;public: Cexample(intn); Cexample(Cexample&b); ~Cexample(); intGet();};intadd(Cexamplea);intmain(){ Cexamplex(12); cout<<x.Get()<<endl; cout<<add(x)<<endl;return0;}Cexample::Cexample(intn){i=n; cout<<"Constructing"<<endl;}Cexample::Cexample(Cexample&b){ i=b.i; cout<<"Copyconstructing"<<endl;}Cexample::~Cexample(){ cout<<"Destructing"<<endl;}intCexample::Get(){ returni;}intadd(Cexamplea){ returna.Get()*a.Get();}运行结果为:Constructing12CopyconstructingDestructing144Destructing六、编程题1.设计一个名为Rectangle矩形类,其属性为矩形左上角和右下角两个点坐标,能计算和输出矩形周长和面积。#include"stdafx.h"#include"iostream"usingnamespacestd;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类,能处理包含字符型、整型和浮点型三种类型数据,给出其结构函数。#include"stdafx.h"classdatatype{ charx; inty; doublez;public: datatype(charx1); datatype(inty1); datatype(doublez1);};datatype::datatype(charx1){ x=x1;}datatype::datatype(inty1){ y=y1;}datatype::datatype(doublez1):z(z1){}int_tmain(intargc,_TCHAR*argv[]){ return0;}3.一矩形体育场以下列图所表示,现在需在其周围建一矩形过道,并在四面围安上栅栏。栅栏价格为50/米,过道造价为240元/平方米。过道宽为3米,体育场长宽由键盘输入。请编写程序计算并输出过道和栅栏造价。#include"stdafx.h"#include"iostream"usingnamespacestd;classRectangle{ doublelength; doublewidth;public: Rectangle(doubleLength=10.,doubleWidth=5.); doubleArea(); doubleSideLength();};intmain(){ inta=50,b=240; doublex,y; cout<<"请输入矩形长和宽:"; cin>>x>>y; cout<<endl; Rectanglerect1(x,y),rect2(x+3,y+3); cout<<"栅栏长度为:"<<rect2.SideLength()<<",造价为:"<<rect2.SideLength()*a<<endl;doublearea12; area12=rect2.Area()-rect1.Area(); cout<<"过道面积为:"<<area12<<",造价为:"<<area12*b<<endl; return0;}Rectangle::Rectangle(doubleLength,doubleWidth){ length=Length; width=Width;}doubleRectangle::Area(){ returnlength*width;}doubleRectangle::SideLength(){ return2*(length+width);}4.定义一个员工类,员工信息由编号、姓名、性别、年纪、职务、职称、岗位、薪酬等组成,要求利用队列实现员工增加、删除和输出等功效。#include"stdafx.h"#include"iomanip"#include"iostream"usingnamespacestd;#defineMAXSIZE5000structEmployees{longno;//编号 charname[10];//姓名 charsex[3];//性别 intage;//年纪 charpositions[20];//职务 charprofessionalTitles[20];//职称 charjobs[20];//岗位 floatremuneration;//薪酬};classEmployees_c{private: EmployeesEmployees_struct[MAXSIZE]; inttotal;public: Employees_c(); intInsert_seq(inti,Employeesx);//插入第i员工信息 intDelete_seq(inti);//删除第i个员工信息 voidPrint_seq();//打印全部员工信息};voidmenu();intmain(){ Employees_cEmployees_Object; intn; boolm=true; while(m) { menu(); cin>>n; switch(n) { case1: { inti; Employeesx; cout<<"请输入插入位置:"; cin>>i; cout<<"请输入员工编号、姓名、性别、年纪、"<<"职务、职称、岗位和薪酬:"<<endl; cin>>x.no>>>>x.sex>>x.age>>x.positions>>fessionalTitles>>>>x.remuneration; Employees_Object.Insert_seq(i,x); cout<<"插入后情况:"<<endl; Employees_Object.Print_seq(); break; } case2: { inti; cout<<"请输入删除位置:; cin>>i; Employees_Object.Delete_seq(i); cout<<"删除后情况:"<<endl; Employees_Object.Print_seq(); break; } case0:m=false; } } return0;}voidmenu(){ cout<<endl; cout<<"1.插入"<<endl; cout<<"2.删除"<<endl; cout<<"0.退出"<<endl; cout<<endl; cout<<"请选择:";}Employees_c::Employees_c(){total=0;}intEmployees_c::Insert_seq(inti,Employeesx){ intj; if(total==MAXSIZE) { cout<<"tableisfull"<<endl; return-1; } if(i<1||i>(total+1)) { cout<<"placeiswrong!"<<endl; return0; }for(j=total-1;j>=i-1;j--) { Employees_struct[j+1]=Employees_struct[j]; }Employees_struct[i-1]=x; ++total; return1;}intEmployees_c::Delete_seq(inti){ intj; if(i<1||i>total) { cout<<"thiselementdon'texist!"<<endl; return-1; } for(j=i;j<=total-1;j++) { Employees_struct[j-1]=Employees_struct[j]; } --total; return1;}voidEmployees_c::Print_seq(){ inti; for(i=0;i<=total-1;i++) { cout<<Employees_struct[i].no<<setw(10)<<Employees_struct[i].name<<setw(10)<<Employees_struct[i].sex<<setw(10)<<Employees_struct[i].age <<setw(10)<<Employees_struct[i].positions<<setw(10)<<Employees_struct[i].professionalTitles <<setw(10)<<Employees_struct[i].jobs<<setw(10)<<Employees_struct[i].remuneration<<endl; } cout<<endl;}5.设计一个复数类,要求对其结构函数进行重载。#include"stdafx.h"classComplex{ doublereal,imag;public: Complex(); Complex(doublereal1); Complex(doublereal1,doubleimag1);};Complex::Complex(){ real=0.; imag=0.;}Complex::Complex(doublereal1){ real=real1; imag=0.;}Complex::Complex(doublereal1,doubleimag1){ real=real1; imag=imag1;}

第四章习题答案一、填空题1.静态数据组员是一个_特殊_数据组员类型,它定义以关键字_static_开头。2.静态数据组员不能在类_结构函数_中初始化,也不可在类_体内_进行赋初值,它初始化工作只能在_类外_进行,而且在_对象生成_之前进行。3.静态组员函数是_类_一部分,而不是_对象_一部分。假如要在类外调用公用静态组员函数,要使用_类名和域运算符”::”_。4.类友元是一个定义在_该类_外部或者普通函数或者另一个类组员函数或者另一个类,但需要在该_类体内_进行说明,在说明时前面需加关键字_friend_。5.类友元虽不是该类组员函数,不过能够访问该类_私有_组员。当友元是一个函数时,我们称该函数为_友元函数_;当友元是一个类时,我们称该类为_友元类_。6.按生存期不一样,对象可分为__局部对象_、_静态对象_、__全局对象_和_动态对象_四种。7.常量对象特点是它数据组员_值_在对象整个生存期内都不能被__修改_。8.const与_指针_配合使用有两种方式:一个是用const修饰指针指向变量,称为_指向常量指针_;另一个是用const修饰指针,称为_常量指针_。二、判断正误1.类中静态数据组员能够采取结构函数进行初始化。(X)2.假如某个对象在其生命周期内不能被修改,那么将这个对象定义为const对象。(√)3.静态数据组员初始化在类体外进行,而且前面必须加static。(X)4.静态组员函数能够在类内定义,也能够在类外定义。在类外定义时,和普通组员函数不一样是要使用static前缀。(X)5.按生存期不一样,对象只可分为局部对象、静态对象和全局对象三种。(X)6.常量数据组员初始化只能经过结构函数初始化列表进行。(√)三、选择题1.下述静态数据组员特征中,(D)是错误。A.说明静态数据组员时,前面要加修饰符staticB.静态数据组员要在类体外进行初始化C.引用静态数据组员时,要在静态数据组员名前加<类名>和作用域运算符D.静态数据组员不是全部对象所共用2.友元作用是(A)。A.提升程序运行效率B.加强类封装性C.实现数据隐藏性D.增加组员函数种类3.下面关于友元函数描述中,正确说法是(A)。A.友元函数是独立于当前类外部函数B.一个友元函数不能同时定义为多个类友元函数C.友元函数必须在类外部定义D.在外部定义友元函数时,必须加关键字friend4.关于静态数据组员,下面叙述错误是(A)。A.静态数据组员在对象调用析构函数后,从内存中撤消B.即使没有实例化类,静态数据组员也能够经过类名进行访问C.类静态数据组员为该类全部对象所共享D.类静态数据组员需要初始化5.关于静态组员,下面叙述错误是(B)。A.类外部能够直接调用类静态数据组员和组员函数B.与通常组员一样,只有经过对象才能访问类静态组员C.类静态数据组员不能在结构函数中初始化D.类通常组员函数能够调用类静态组员6.静态组员为该类全部(B)共享。A.组员B.对象C.this指针D.友元7.下面定义中,(B)是非法。A.intI;B.constintI;C.constint*p;D.int*constp=&I四、改错题,请指出下面程序中错误代码,并说犯错误原因和改错方法。1.classBasic{inta;staticb;public:staticvoidOutput(){cout<<a<<endl;cout<<b<<endl;}};staticb;错误,原因是没有指定b数据类型。应改为staticintb;2.#include"stdafx.h"#include<iostream>usingnamespacestd;classP{public:P(inta,intb) {x=a;y=b;}staticvoidf(Pm);private:intx;staticinty;};voidP::f(Pm){cout<<"x="<<m.x<<endl;cout<<"y="<<y<<endl;}intP::y=0;intp::x=1;intp::x=1;错误。原因是x不是静态数据组员,不能在类外初始化。改错方法:去掉intp::x=1;3.#include"stdafx.h"#include"iostream"usingnamespacestd;classRectangle{intw,h;public:intgetValue1()const;intgetValue();Rectangle(){}Rectangle(intx,inty);};voidmain(){Rectangleconsta(3,4); cout<<a.getValue()<<endl; cout<<a.getValue1()<<endl;}intRectangle::getValue1()const{returnw*h;}intRectangle::getValue(){returnw+h;}Rectangle::Rectangle(intx,inty){w=x;h=y;}cout<<a.getValue()<<endl;语句错。原因是常量对象不能调用非常量组员函数。改错方法:去掉cout<<a.getValue()<<endl;五、写出下面程序运行结果1.#include"stdafx.h"#include"iostream"usingnamespacestd;classCount{staticintcount;public: Count() { count++; } staticintGet() { returncount; } ~Count() { count--; }};intCount::count=1000;intmain(){Countd1,d2,d3,d4; cout<<Count::Get()<<endl; return0;}10042.#include"stdafx.h"#include"iostream"usingnamespacestd;classSet{ intelems[100]; intPc;public: Set() { Pc=0; } Set(Set&b); voidEmpty() { Pc=0; } intIsEmpty() { returnPc==0; } intIsMemberOf(intn); intAdd(intn); voidPrint(); friendvoidreverse(Set*m);};intSet::IsMemberOf(intn){ for(inti=0;i<Pc;i++) if(elems[i]==n) return1; return0;}intSet::Add(intn){ if(IsMemberOf(n)) return1; else if(Pc>=100) return0; else { elems[Pc++]=n; return1; }}Set::Set(Set&b){ Pc=b.Pc; for(inti=0;i<Pc;i++) elems[i]=b.elems[i];}voidSet::Print(){cout<<"("; for(inti=0;i<Pc-1;i++) cout<<elems[i]<<","; if(Pc>0) cout<<elems[Pc-1]; cout<<")"<<endl;}voidreverse(Set*m){ intn=m->Pc/2; for(inti=0;i<n;i++) { inttemp; temp=m->elems[i]; m->elems[i]=m->elems[m->Pc-i-1]; m->elems[m->Pc-i-1]=temp; }}intmain(){ SetA; cout<<A.IsEmpty()<<endl; A.Print(); SetB; for(inti=1;i<=8;i++) B.Add(i); B.Print(); cout<<B.IsMemberOf(5)<<endl; B.Empty();for(intj=11;j<20;j++) B.Add(j); SetC(B); C.Print(); reverse(&C); C.Print(); return0;}1()(1,2,3,4,5,6,7,8)1(11,12,13,14,15,16,17,18,19)(19,18,17,16,15,14,13,12,11)六、编程题1.(1)建立一个类,该类具备const和非const组员函数。(2)创建这个类const和非const对象,并用不一样类型对象调用不一样类型组员函数。#include"stdafx.h"#include<iostream>usingnamespacestd;classA{public: voidpoint(); voidoutput()const;};int_tmain(intargc,_TCHAR*argv[]){ Aconsta1; Aa2; a1.output(); a2.output(); a2.point(); return0;}voidA::point(){ cout<<"point"<<endl;}voidA::output()const{ cout<<"output"<<endl;}2.编写一个类,统计现在存在多少个该类对象。#include"stdafx.h"#include<iostream>usingnamespacestd;classA{ staticinttotal;public: A() { total++; cout<<"当前类对象总数为:"<<total<<endl; }~A(){ total--; cout<<"当前类对象总数为"<<total<<endl;}};voidf(){ Aaa,bb,cc;}intA::total=0;int_tmain(intargc,_TCHAR*argv[]){ Aa1,a2,a3; f(); Ab1,b2,b3; return0;}3.编写一个学生类,学生信息包含姓名、学号、年纪、性别和成绩;统计学生总人数及总成绩,并输出。#include"stdafx.h"#include<iostream>usingnamespacestd;classStudent{ intno; charname[10]; charsex[3]; intage; doublescore; staticinttotalNumber; staticdoubletotalScore;public: Student(intno_,char*name_,char*sex_,intage_,doublescore_); staticvoidOutput(); voidStudentInformation();};intStudent::totalNumber=0;doubleStudent::totalScore=0;int_tmain(intargc,_TCHAR*argv[]){ Studentstu1(1001,"张三","男",18,97.5); stu1.StudentInformation(); Studentstu2(1002,"李四","女",19,83.); stu2.StudentInformation(); Studentstu3(1003,"王五","男",17,93.); stu3.StudentInformation(); Studentstu4(1004,"郭六","女",20,62.5); stu4.StudentInformation(); Studentstu5(1005,"任七","男",18,77.); stu5.StudentInformation(); Student::Output(); return0;}Student::Student(intno_,char*name_,char*sex_,intage_,doublescore_){ no=no_; strcpy(name,name_); strcpy(sex,sex_); age=age_; score=score_; totalNumber++; totalScore+=score;}voidStudent::StudentInformation(){ cout<<"学号:"<<no<<""<<"姓名:"<<name<<""<<"性别:"<<sex<<""<<"年纪:"<<age<<""<<"成绩:"<<score<<endl;}voidStudent::Output(){ cout<<"学生总数:"<<totalNumber<<""<<"总成绩:"<<totalScore<<""<<"平均成绩:"<<totalScore/totalNumber<<endl;}4.编写一个学生类,(1)输出每个学生姓名、学号、成绩;(2)统计并输出学生总人数、总成绩、平均成绩、最高成绩、最低成绩。#include"stdafx.h"#include<iostream>usingnamespacestd;classStudent{ intno; charname[10]; doublescore; staticinttotalNumber; staticdoubletotalScore; staticdoublelowestScore; staticdoublehighestScore

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论