【试题解析】
本题主要考查对继承和派生的掌握程度,涉及派生类构造函数的定义、基类成员函数的访问等内容。
派生类的构造函数的格式请牢记,
另外派生类构造函数及析构函数的执行顺序也是需要掌握的。
第三套:
一、改错题
使用VC6打开考生文件夹下的工程kt14_1,此工程包含一个源程序文件kt14_1.cpp,但该程序运行有问题,请改正程序中的错误,使该程序的输出结果为:
A:
noparameters
B:
intparameter
A:
noparameters
B:
intparameter
C:
intparameter
源程序文件kt14_1.cpp清单如下:
#include
classA
{/*****************found*****************/
private:
A(){cout<<"A:
noparameters\n";}
A(inta){cout<<"A:
intparameter\n";}};
classB:
publicA
{public:
B(inta){cout<<"B:
intparameter\n";}};
/*****************found*****************/
classC:
publicB,publicA
{public:
/*****************found*****************/
C(inta):
:
B(a){cout<<"C:
intparameter\n";}};
voidmain()
{Bb
(1);
Cc
(2);}
【参考答案】
(1)将private:
改为:
public:
(2)将classC:
publicB,publicA改为:
classC:
publicB
(3)将C(inta):
:
B(a){cout<<"C:
intparameter\n";}
改为:
C(inta):
B(a){cout<<"C:
intparameter\n";}
【试题解析】
(1)一个类的构造函数和析构函数可以由系统自动生成,也可以由用户提供,但构造函数和析构函数都必须是该类的公有成员函数,否则编译时将出现错误,不能被调用;
(2)A已经是B的基类,C公有继承B,A也就成为了C的基类,根据程序的运行结果可知,C是要公有继承B;
(3)派生类的构造函数,初始化基类的参数,调用基类的构造函数时,使用符号“:
”,而不是“:
:
”;
二、简单应用题
编写函数fun(),它的功能是求n以内(不包括n)同时能被3与7整除的所有自然数之和的平方根s,并做为函数值返回。
例如:
n为1000时,函数值应为s=153.909064。
注意:
部分源程序给出如下。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
试题程序:
#include
#include
#include
doublefun(intn)
{main()
{clrscr();
printf("s=%f\n",fun(1000));}
【参考答案】
doublefun(intn)
{doubles=0.0;
inti;
for(i=0;i /*从0~n中找到既能被3整除同时又能被7整除的数,并将这些数求和*/
if(i%3==0&&i%7==0)
s=s+i;
s=sqrt(s);/*对s求平方根*/
returns;}
【试题解析】
本题的解题思路是:
逐个取得从0~n之间的所有数,对每次取得的数进行条件判断,条件是既能被3整除同时又能被7整除,注意:
这两个条件要求同时成立,因此用到了“&&”运算符。
满足条件,该数就被累加到s中去,所有符合条件的数找完后,用sqrt()函数对s求平方根。
三、综合应用题
使用VC6打开考生文件夹下的工程kt14_3。
此工程包含一个kt14_3.cpp,其中定义了二维坐标类Coordinate和三维坐标类ThreeDCoord,其中ThreeDCoord类由Coordinate类public派生,但
两个类的定义并不完整。
请按要求完成下列操作,将程序补充完整。
(1)定义类Coordinate的保护数据成员x和y,它们都是int型的数据,代表二维坐标的横纵坐标值。
请在注释“//**1**”之后添加适当的语句。
(2)根据类Coordinate定义后的成员函数Display的实现,补充该函数在类Coordinate定义体内的声明,Display为二维坐标类的虚函数。
请在注释“//**2**”之后添加适当的语句。
(3)完成二维坐标类Coordinate的构造函数,将参数a和b分别赋值给数据成员x和y。
请在注释“//**3**”之后添加适当的语句。
(4)根据ThreeDCoord类构造函数的声明,补充ThreeDCoord构造函数的实现,参数a和b通过调用基类的构造函数来初始化基类的数据成员x和y,c赋值给数据成员z。
请在注释“//**4**”之后添加适当的语句。
输出结果如下:
[1,2]
[3,4,5]
注意:
除在指定位置添加语句之外,请不要改动程序中的其他内容。
源程序文件kt14_3.cpp清单如下:
#include
classCoordinate
{protected:
//**1**
public:
Coordinate(inta=0,intb=0);
//**2**};
Coordinate:
:
Coordinate(inta,intb)
{//**3**}
voidCoordinate:
:
Display()const
{cout<<'['<
classThreeDCoord:
publicCoordinate
{intz;
public:
ThreeDCoord(inta=0,intb=0,intc=0);
virtualvoidDisplay()const;};
//**4**
voidThreeDCoord:
:
Display()const
{cout<<'['<
voidmain()
{Coordinatec(1,2);
ThreeDCoordt(3,4,5);
c.Display();
t.Display();}
【参考答案】
(1)protected:
intx;
inty;
(2)virtualvoidDisplay()const;
(3)x=a;y=b;
(4)ThreeDCoord:
:
ThreeDCoord(inta,intb,intc):
Coordinate(a,b)
【试题解析】
本题主要考查对类数据成员的定义、构造函数、派生类及虚函数的理解,是C++类知识的一个综合考核。
对虚函数的定义格式及继承类构造函数的定义格式请多加注意。
第四套:
一、改错题
使用VC6打开考生文件夹下的工程kt13_1,此工程包含一个源程序文件kt13_1.cpp,但该程序运行有问题,请改正程序中的错误,使该程序的输出结果为:
5
5
源程序文件kt13_1.cpp清单如下:
#include
classA{
public:
/*****************found*****************/
staticintn=1;
A(){n++;};
~A(){n--;};};
/*****************found*****************/
intn=0;
intmain(){
Aa;
Ab[3];
A*c=newA;
c=&a;
/*****************found*****************/
cout< cout<:
N<
return0;}
【参考答案】
(1)将staticintn=1;改为:
staticintn;
(2)将intn=0;改为:
intA:
:
n=0;
(3)将cout<COUT 【试题解析】
(1)在类的声明中只能对静态数据成员进行引用性声明,不能进行静态数据成员初始化;
(2)由于静态数据成员是类的成员,所以在初始化时必须限定它所属的类;
(3)c为类的对象指针,访问类成员函数时使用符号“->”,而不能用“.”。
二、简单应用题
请编写一个函数sortnum(intnum),参数num是一个三位的整数,该函数将num的百位、十位和个位的数字进行重排,并返回由上述的三个数字组成的最大的三位数。
注意:
部分源程序已存在文件kt13_2.cpp中。
如输入456后,输出结果如下:
654
请勿修改主函数main和其他函数中的内容,仅在函数sortnum的花括号中填写若干语句。
文件kt13_2.cpp的内容如下:
#include
intsortnum(intnum)
{
}
voidmain()