c课后习题解答.docx
《c课后习题解答.docx》由会员分享,可在线阅读,更多相关《c课后习题解答.docx(74页珍藏版)》请在冰豆网上搜索。
c课后习题解答课后习题解答第6章;类和对象
(一)练习题6判断题1使用class定义的类,其默认的访问权限是公有的,使用struct定义的类,其默认的访问权限是私有的。
2类中的成员函数都是公有的,数据成员都是私有的。
3定义在类体内的成员函数是内联函数,定义在类体外的成员函数不能是内联函数。
4类定义后,它的成员个数及名称就不会再被改变了。
5定义或说明对象时,系统会自动调用构造函数为创建的对象初始化。
如果类中没有定义任何构造函数时,就无法给定义的对象初始化。
6定义一个对象时,系统只为该对象的数据成员开辟内存空间,而成员函数是同类对象共享的。
7对象成员的表示方法与结构变量成员的表示方法相同。
8创建对象时系统自动调用相应的构造函数为对象初始化,没有相应的构造函数时,系统会自动生成。
9构造函数是一个其名与类名相同的特殊的成员函数。
10析构函数是一个函数体为空的成员函数。
11构造函数和析构函数都是系统自动调用的成员函数。
12构造函数和析构函数都可以重载。
13成员函数与一般函数一样可以重载、内联和设置参数的默认值。
14静态成员是指静态对象的成员。
15静态数据成员必须在构造函数的成员初始化列表中进行初始化。
16静态成员都可以使用类名加作用域运算符的方法来引用。
17静态成员函数中引用静态数据成员和非静态数据成员的方式是相同的。
18常成员指的是类体内使用const关键字说明的常数据成员和常成员函数。
19常数据成员在常成员函数中的值是不允许改变的,而在非常成员函数中是允许改变的。
20常对象需要引用常成员函数,而不能引用非常成员函数。
21常对象的数据成员都是常数据成员。
22友元函数是说明在类体内的非成员函数,它可以访问类中的所有成员。
23可以把一个一般函数说明为某类的友元函数,也可以将某类的成员函数说明为另类的友元函数。
24友元类中的所有成员函数都是友元函数。
25类型转换函数是一种特殊的成员函数,定义时不加类型说明,无函数参数。
26单参数的构造函数具有类型转换的作用。
单选题1下列关于类的定义格式的描述中,错误的是(C)。
A类中成员有3种访问权限B类的定义可分说明部分和实现部分C类中成员函数都是公有的,数据成员都是私有的D定义类的关键字通常用class,也可用struct2下列关键字中,不属于定义类时使用的关键字是(D)。
AclassBstructCpublicDdefault3下列关于成员函数的描述中,错误的是(A)。
A成员函数的定义必须在类体外B成员函数可以是公有的,也可以是私有的C成员函数在类体外定义时,前加inline可为内联函数D成员函数可以设置参数的默认值4下列关于对象的描述中,错误的是(D)。
A定义对象时系统会自动进行初始化B对象成员的表示与C语言中结构变量的成员表示相同C属于同一个类的对象占有内存字节数相同D一个类所能创建对象的个数是有限制的5下列关于构造函数的描述中,错误的是(C)。
A构造函数可以重载B构造函数名同类名C带参数的构造函数具有类型转换作用D构造函数是系统自动调用的6下列关于析构函数的描述中,错误的是(A)。
A析构函数的函数体都为空B析构函数是用来释放对象的C析构函数是系统自动调用的D析构函数是不能重载的7下列关于静态成员的描述中,错误的是(C)。
A静态成员都是使用static来说明的B静态成员是属于类的,不是属于某个对象的C静态成员只可以用类名加作用域运算符来引用,不可用对象引用D静态数据成员的初始化是在类体外进行的8下列关于常成员的描述中,错误的是(C)。
A常成员是用关键字const说明的B常成员有常数据成员和常成员函数两种C常数据成员的初始化是在类体内定义它时进行的D常数据成员的值是不可以改变的9下列关于友元函数的描述中,错误的是(B)。
A友元函数不是成员函数B友元函数只可访问类的私有成员C友元函数的调用方法同一般函数D友元函数可以是另一类中的成员函数10下列关于类型转换函数的描述中,错误的是(C)。
A类型转换函数是一种成员函数B类型转换函数定义时不指出类型,也没有参数C类型转换函数的功能是将其函数名所指定的类型转换为该类类型D类型转换函数在一个类中可定义多个填空题1类体内成员有3个访问权限,说明它们的关键字分别是公有、私有和保护。
2使用class定义的表中,成员的默认访问权限是私有的;由struct定义的类中,成员的默认的访问权限是公有的。
3如果一个类中没有定义任何构造函数时,系统会自动提供一个默认构造函数;同样,类中没有定义析构函数时,系统会自动提供一个默认析构函数。
4静态成员是属于类的,它除了可以通过对象名来引用外,还可以使用类名限定来引用。
5友元函数是被说明在类体内的非成员函数。
友元函数可访问该类中的成员。
6完成下列类的定义。
classApublic:
A()a=0;intintGeta(A&m);private:
inta;intGeta(A&m)returnm.a;6.4分析下列程序的输出结果1#includeclassApublic:
A()a1=a2=0;coutDefaultconstructorcalled.n;A(inti,intj);A()coutDestructorcalled.n;voidPrint()couta1=a1,a2=a2endl;private:
inta1,a2;A:
A(inti,intj)a1=i;a2=j;coutConstructorcalled.n;voidmain()Aa,b(5,8);a.Print();b.Print();答:
Defaultconstructorcalled.Constructorcalled.a1=0,a2=0a1=5,a2=8Destructorcalled.Destructorcalled.2#includeclassBpublic:
B()cout+bendl;B()coutb-endl;staticintGetb()returnb;private:
staticintb;intB:
b=10;voidmain()Bb1,b2,b3;coutB:
Getb()endl;答:
111213131312113#includeclassDatepublic:
Date(inty,intm,intd)year=y;month=m;day=d;friendvoidPrint(Date&);private:
intyear,month,day;voidPrint(Date&d)coutd.year/d.month/d.dayendl;voidmain()Dated1(2005,10,1),d2(2005,12,9);Print(d1);Print(d2);答:
2005/10/12005/12/94#includeclassCpublic:
C(inti,intj)c1=i;c2=j;voidSum(Ca,Cb)c1=a.c1+b.c1;c2=a.c2+b.c2;voidPrint()coutc1=c1,c2=c2endl;private:
intc1,c2;voidmain()Ca(6,9);Cb(a);Cc(b);c.Sum(a,b);c.Print();答:
c1=12,c2=185#includeclassSpublic:
S()PC=0;S(S&s)PC=s.PC;for(inti=0;iPC;i+)elemsi=s.elemsi;voidEmpty()PC=0;intIsEmpty()returnPC=0;intIsMemberOf(intn);intAdd(intn);voidPrint();private:
intelems100,PC;intS:
IsMemberOf(intn)for(inti=0;iPC;i+)if(elemsi=n)return1;return0;intS:
Add(intn)if(IsMemberOf(n)return1;elseif(PC=100)return0;elseelemsPC+=n;return1;voidS:
Print()cout;for(inti=0;iPC-1;i+)coutelemsi0)coutelemsPC-1;coutendl;voidmain()Sa;couta.IsEmpty()endl;a.Print();Sb;for(inti=1;i=5;i+)b.Add(i);b.Print();coutb.IsMemberOf(3)endl;coutb.IsEmpty()endl;for(i=6;i=10;i+)b.Add(i);Sc(b);c.Print();答:
11,2,3,4,5101,2,3,4,5,6,7,8,9,10编程题1按下列要求编程:
(1)定义一个描述矩形的类Rectangle,包括的数据成员有宽(width)和长(length);
(2)计算矩形周长;(3)计算矩形面积;(4)改变矩形大小。
通过实例验证其正确性。
答:
编程如下:
#includeclassRectanglepublic:
Rectangle(inta,intb)width=a;length=b;intArea()returnwidth*length;intPeriment()return2*(width+length);voidChangesize(inta,intb)width=a;length=b;voidPrint();private:
intwidth,length;voidRectangle:
Print()coutAREA=Area()endl;coutPERIMENT=Periment()endl;voidmain()Rectangler(5,8);r.Print();r.Changesize(3,9);r.Print();2编程实现一个简单的计算器。
要求从键盘上输入两个浮点数,计算出它们的加、减、乘、除运算的结果。
答:
编程如下:
#includeclassASMDpublic:
ASMD(doublea,doubleb)x=a;y=b;voidAddition()coutx+yendl;voidSubtration()coutx-yendl;voidMultiply()coutx*yendl;voidDivison()coutx/yendl;voidPrint();private:
doublex,y;voidASMD:
Print()Addition();Subtration();Multiply();Divison();voidmain()ASMDa(40,8);a.Print();3编一个关于求多个某门功课总分和平均分的程序。
具体要求如下:
(1)每个学生信息包括姓名和某门功课成绩。
(2)假设5个学生。
(3)使用静态成员计算5个学生的总成绩和平均分。
答:
编程如下:
#include#includeclassStudentpublic:
Student(chars,intgr)strcpy(name,s);grade=gr;totalize+=gr;staticvoidPrint();private:
charname10;intgrade;staticinttotalize;intStudent:
totalize=0;voidStudent:
Print()cout总成绩为totalize,平均成绩为totalize/5p=5Ca.*p=5D*a.p=53VoidSet(A&a);是类A中一个成员函数的说明,其中A&a的含义是(A)。
A类A的对象引用a作该函数的参数B类A的对象a的地址值作函数的参数C表达式变量A与变量a按位与作函数参数D指向类A对象指针a作函数参数4已知:
constAa;其中A是一个类名,指向常对象指针的表示为(D)。
Aconst*Apa;BconstA*pa;CA*constpa;Dconst*paA;5下列关于子对象的描述中,错误的是(D)。
A子对象不可以是自身类的对象B子对象是另一个类的对象C子对象的初始化要包含在构造函数中D一个类中只能有一个子对象6执行下列说明语句,其调用构造函数的次数为(A)。
Aa5,*p2;其中,A是一个类名A5B6C7D107下列关于运算符new的描述中,错误的是(D)。
A它可以创建对象或变量B它可以创建对象数组或一般类型数组C用它创建对象或对象数组时要调用相应的构造函数D用它创建的对象可以不用delete运算符释放8下列关于运算符delete的描述中,错误的是(B)。
A使用该运算符可以释放用new运算符创建的对象或对象数组B使用该运算符可以释放所有对象C使用delete运算符时会自动调用析构函数D用它释放对象数组时,它作用的指针名前要加下标运算符9定义不同存储类对象时,必须要加的存储类说明符是(C)。
AautoBexternCstatieDregister10下列关于this的描述中,错误的是(D)。
Athis是一个由系统自动生成的指针Bthis指针是指向对象的Cthis指针在用对象引用成员函数时系统创建的Dthis指针只能隐含使用,不能显式使用填空题已知:
classApublic:
A(inti)a=i;voidprint()contaendl;private:
inta;要求:
1定义一个指向对象的常指针p,应该是A*constp;。
2定义一个指向常对象指针p,应该是Aconst*p;。
3定义类A的含有5个元素的一维对象数组a,应该是Aa5;。
4定义一个对象指针数组pa,它有5个元素,每个元素是类A对象指针,应该是A*pa5;。
5使用new创建一个堆对象,一个实参值为5,应该是A*p;p=newA(5);。
6使用new创建一个对象数组,该数组用指针pa指向,并使数组的3个元素都是类A的对象a1的值。
应该是Aa1,*pa;pa=newA3;pa0=pa1=pa2=a1;。
7在某个函数体内定义一个静态类的对象sa,应该是staticAsa;。
8定义一个类A的对象a1,并给它赋值,其实参值为8,应该是Aa1(8);。
分析下列程序的输出结果1#includeclassApublic:
A(inti)a=i;A()a=0;coutDefaultconstructorcalled.aendl;A()coutDestructorcalled.aendl;voidPrint()coutaendl;private:
inta;voidmain()Aa4,*p;intn=1;p=a;for(inti=0;i4;i+)ai=A(+n);for(i=0;iPrint();答:
Defaultconstructorcalled.0Defaultconstructorcalled.0Defaultconstructorcalled.0Defaultconstructorcalled.0Destructorcalled.2Destructorcalled.3Destructorcalled.4Destructorcalled.52345Destructorcalled.5Destructorcalled.4Destructorcalled.3Destructorcalled.22#includeclassBpublic:
B(inti)b=i;B()b=0;coutDefaultconstructorcalled.bendl;B()coutDestructorcalled.bendl;voidPrint()coutbendl;private:
intb;voidmain()B*pb4;intn=1;for(inti=0;i4;i+)pbi=newB(n+);for(i=0;iPrint();for(i=0;i4;i+)delete*(pb+i);答:
1234Destructorcalled.1Destructorcalled.2Destructorcalled.3Destructorcalled.43#includeclassCpublic:
C(inti)c=i;C()c=0;coutDefaultconstructorcalled.cendl;C()coutDestructorcalled.cendl;voidPrint()coutcendl;private:
intc;voidmain()C*p;p=newC4;intn=1;for(inti=0;i4;i+)pi=C(n+);for(i=0;i4;i+)pi.Print();deletep;答:
Defaultconstructorcalled.0Defaultconstructorcalled.0Defaultconstructorcalled.0Defaultconstructorcalled.0Destructorcalled.2Destructorcalled.3Destructorcalled.4Destructorcalled.52345Destructorcalled.5Destructorcalled.4Destructorcalled.3Destructorcalled.24#includeclassDpublic:
D()d1=d2=0;coutDefaultconstructorcallrd.n;D(inti,intj)d1=i;d2=j;coutConstructorcalled.d1=d1,d2=d2endl;D()coutDestructorcalled.d1=d1,d2=d2endl;voidSet(inti,intj)d1=i;d2=j;private:
intd1,d2;voidmain()intn(10),m(20);Dd4=D(5,7),D(3,6),D(7,9),D(1,4);for(inti=0;i4;i+)di.Set(n+,m+);答:
Constructorcalled.d1=5,d2=7Constructorcalled.d1=3,d2=6Constructorcalled.d1=7,d2=9Constructorcalled.d1=1,d2=4Destructorcalled.d1=13,d2=23Destructorcalled.d1=12,d2=22Destructorcalled.d1=11,d2=21Destructorcalled.d1=10,d2=205#includeclassEpublic:
E(inti,intj)e1=i;e2=j;coutConstructorcalled.e1=e1,e2=e2e1;e2=e-e2;coutConstructorcalled.e1=e1,e2=e2endl;voidFunE(E&e)e1=e.e1;e2=e.e2;coutInFunE(E&e).e1=e1,e2=e2endl;private:
inte1,e2;voidmain()Ea(5,6),b(3,4);a.FunE(&b);b.FunE(a);答:
Constructorcalled.e1=5,d2=6Constructorcalled.e1=3,e2=4InFunE(E&e).e1=3,e2=4InFunE(E&e).e1=3,e2=46#includeclassFpublic:
classGpublic:
G()G(inti)g=i;intGetValue()returng;voidPrint(F*p);private:
intg;myg;friendclassG;F(inti,intj):
myg(i)f=j;private:
intf;voidF:
G:
Print(F*p)coutfendl;voidmain()F:
Gg;Ff(5,10);f.myg.Print(&f);g=f.myg;coutg.GetValue()endl;答:
105编程题1按下列要求实现一个栈类的操作。
该类名为Stack,包括如下操作:
(1)压栈操作:
Push();
(2)弹栈操作:
Pop();(3)获取栈顶元素:
Peer();(4)判栈空操作:
IsEmpty();(5)判栈满操作:
IsPull()。
设栈最多可存放50个整数。
栈中成员用数组表示。
编写一个程序,定义一个栈类的对象数组来验证该类操作。
答:
栈的正常操作程序如下:
#include#includeclassStackpublic:
Stack(inti);Stack()deletesta;voidPush(inti);intPop();voidIsUpll()if(tos=length)coutStackisfill.n;return;intIsEmpty()if(tos=0)coutStackunderflow.n;return0;private:
int*sta;inttos,length;Stack:
Stack(inti)sta=newinti;if(!
sta)coutCantallocatestack.n;abort();tos=0;length=i;voidStack:
Push(inti)statos=i;tos+;intStack:
Pop()tos-;returnstatos;voidmain()Stacka(50);a.Push
(1);a.Push
(2);a.Push(3);a.Push(4);a.Push(5);a.Push(6);a.Push(7);a.Push(8);a.Push(9);a.Push(10);couta.Pop(),;couta.Pop(),;couta.Pop(),;couta.Pop(),;couta.Pop(),;couta.Pop(),;couta.Pop(),;couta.Pop(),;couta.Pop(),;couta.Pop(),endl;判断栈的空、满操作,请读者修改上述程序。
2按下列要求实现一个有关学生成绩的操作。
该类名为Student。
(1)每个学生的信息包含有姓名(字符数组)和成绩(int型)。
(2)共有5个学生,用对象数组表示。
(3)计算出5个学生中的最高分,并输出姓名及分数。
答:
编程如下:
#include#includeclassStudentpublic:
Student(chars,intgr)strcpy(name,s);grade=gr;friendvoidfun();private:
charname10;intgrade;Studentss5=Student(马力,85),Student(王欣,96),Student(李明,82),Student(赵亮,78),Student(张京,80);voidfun()intk=0;for(inti=0;iss0.grade)k=i;cout最高分的学生姓名和成绩如下:
nssk.name,ssk.gradeendl;