一、选择题(每小题1分,共40小题,共40分)
1.下列叙述正确的是( )。
A.算法的执行效率与数据的存储结构无关
B.算法的空间复杂度是指算法程序中指令(或语句)的条数
C.算法的有穷性是指算法必须能在执行有限个步骤之后终止
D.以上三种描述都不对
2.下列叙述中正确的是( )。
A.软件测试应该由程序开发者来完成
B.程序经调试后一般不需要再测试
C.软件维护只包括对程序代码的维护
D.以上三种说法都不对
3.源程序的文档化不包括( )。
A.符号名的命名要有实际意义
B.正确的文档形式
C.良好的视觉组织
D.正确的程序注释
4.下列叙述中错误的是( )。
A.一种数据的逻辑结构可以有多种存储结构
B.数据的存储结构与数据的处理效率无关
C.数据的存储结构与数据的处理效率密切相关
D.数据的存储结构在计算机中所占的空间不一定是连续的
5.下列叙述中正确的是( )。
A.在模块化程序设计中,一个模块应该尽量多地包括与其他模块联系的信息
B.在自顶向下、逐步细化的设计过程中,首先应设计解决问题的第一个细节
C.在模块化程序设计中,一个模块内部的控制结构也要符合结构化原则
D.在程序设计过程中,不能同时采用结构化程序设计方法与模块化程序设计方法
6.设有如下三个关系表:
下列操作中正确的是( )。
A.T=R∩S
B.T=R∪S
C.T=R×S
D.T=R/S
7.将E-R图转换到关系模式时,实体与联系都可以表示成( )。
A.属性
B.关系
C.键
D.域
8.设有两个字符串p和q,求q在p中首次出现位置的运算称为( )。
A.连接
B.模式匹配
C.求子串
D.求串长
9,在对象方法中,一个对象请求另一个对象为其服务的方式是通过发送( )来实现。
A.调用语句
B.命令
C.中令
D.消息
10.设计数据库的存储结构属于( )。
A.需求分析
B.概念设计
C.逻辑设计
D.物理设计
11.下列关于运行符重载的描述中,正确的是( )。
A.运算符重载可以改变操作数的个数
B.运算符重载可以改变操作数的优先级
C.运算符重载可以改变运算符的结合性
D.运算符重载可以使运算符实现特殊功能
12.当需要将一个函数boolisnunlber(charc)声明为内联函数时,此内联函数的函数原型为( )。
A.enumboolisnumber(charc);
B.defineboolisnumber(charc);
C.inlineboolisnumber(charc);
D.extemboolisnumber(charc);
13.有如下数组声明:intnum[10】;,下标值引用错误的是( )。
A.num[10]
B.num[5]
C.num[3]
D.num[0]
14.对于复制构造函数和赋值操作的关系,正确的是( )。
A.复制构造函数和赋值操作是完全一样的操作
B.进行赋值操作时,会调用类的构造函数
C.当调用复制构造函数时,类的对象正在被建立并被初始化
D.复制构造函数和赋值操作不能在同一个类中被同时定义
15.有如下函数模板声明:
template
TMax(Ta,Tb){return(a>b)?a:b;}
下列对函数模板Max( )的调用中错误的是( )。
A.Max(3.5,4.5)
B.Max(3.5,4)
C.Max(35,4.5)
D.Max(3.5,4)
16.关于continue语句叙述不正确的是( )。
A.continue语句用于循环体中,结束循环
B.continue语句用于循环体中,它使执行流跳出循环体中尚未执行的语句,并进行下一循环判断
C.continue可以用于if语句中
D.continue语句不能代替break语句
17.若有说明:inta[3][4];则对a数组元素的非法引用是( )。
A.a[0][2*1]
B.a[1][3]
C.a[4-2][0]
D.a[0][4]
18.下列关于虚函数与函数重载区别的叙述中不正确的是( )。
A.函数说明形式上不同
B.函数允许非成员函数重载,虚函数只能是成员函数
C.函数重载的调用依据参数和类型的差别,虚函数则依据对象
D.函数重载的本体可以在类外定义,虚函数不可以
19.控制格式输入/输出的操作中,设置域宽的函数是( )。
A.WS
B.oct
C.setfill(int)
D.setw(int)
20.继承机制的作用是( )。
A.信息隐藏
B.数据封装
C.定义新类
D.数据抽象
21.下列关于this指针的叙述中,正确的是( )。
A.任何与类相关的函数都有this指针
B.类的成员函数都有this指针
C.类的友元函数都有this指针
D.类的非静态成员函数才有this指针
22.下面关于C++流的叙述中,正确的是( )。
A.cin是一个输入流对象
B.可以用ifstream定义一个输出流对象
C.执行语句序列char*y="PQMN";cout< D.执行语句序列charx[80];cin.getline(x,80);时,若输入Happynewyear,则X中的字符串是“Happy”
23.有如下程序:
#included
usingnamespacestd;
classTestClass{
protected:
TestClass( ){cout<<’X’;}
TestClass(charc){cout< classTestClassl:publicTestClass{
public:
TestClassl(charc){cout< intmain( ){
TestClassld1(’y’);
return0;}
执行这个程序,屏幕上将显示输出( )。
A.y
B.yx
C.xy
D.yy
24.下列虚基类的声明中正确的是( )。
A.clasSvirtualB:publicA
B.virtualclassB:publicA
C.classB:publieAvirtual
D.classB:virtualpublicA
25.下列程序的执行结果是( )。
#include
classSample
{
intx,y;
public:
Sample(){x=y=0;}
Sample(inta,intb){x=a;y=b;}
~Sample()
{
if(x==y)
cout<<"x=y"< else
cout<<"x!=y"< }
voiddisp()
{
cout<<"x="< case’2’:cout<<"2";break;
default:cout<<"1";
}
}
A.3
B.321
C.31
D.32
27.有如下程序:
#inelude
usingnamespacestd;
classTest
{
public:
Test(){n+=2;}
~Test(){n-=3;}
staticintgetNum(){returnn;}
private:
staticintn;
};
intTest::n=1;
intmain()
Test*P=newTest:
deleteP;
cout<<"n="< return0;
}
执行后的输出结果是( )。
A.n=0
B.n=1
C.n=2
D.n=3
28.若有以下程序:
#include
usingnamespacestd;
classBase
{public:
Base()
{x=0;}
intx;};
classDerivedl:virtualpublicBase
{public:
Derivedl()
{x=10;}};
classDerived2:virtua11publicBase
{public:
Derived2()
{x=20;}};
classDerived:publicDerivedl,protectedDerived2{};intmain()
{Derivedobj;
cout< return0;}
该程序运行后的输出结果是( )。
A.20
B.30
C.10
D.0
29.下列程序的输出结果是( )。
#included
usingnamespacestd;
intmain()
{
chara[]="Hell0,Test";
char*p=a;
while(*p)
{
if(*p>=’a’&&*p<=’z’)
cout< elsecout<<*P;
p++;
}
return0;
}
A.hell0,testB.Hell0,Test
C.HELL0,TESTD.hELL0,tEST
30:有如下程序:
#included
usingnamespacestd;
classTestClass
{
private:
intx,Y;
public:
TestClass(inti,intj)
{
x=i:
y=j;
}
voidprint()
{
cout<<"printl"< }
voidprint()const
{
cout<<"print2"< }
};
intmain()
{
constTestClassa(1,2);
a.print();
return0;
}
该程序运行后的输出结果是( )。
A.printl
B.print2
C.printlprint2
D.程序编译时出错
31.下面程序的运行结果是( )。
#include
classbase{
protected:
inta;
public:
base(){cout<<"0";}
};
classbasel:virtualbase{
public:
basel(){cout<<"1";}
};
classbase2:virtualbase{
public:
base2(){cout<<"2";}
};
classderived:publicbasel,publicbase2{
public:
derived(){cout<<"3";}
};
voidmain()
{
derivedobj;
cout< }
A.0123
B.3120
C.0312
D.3012
32.下列程序的运行结果为( )。
#include
template
classFF
{TTa1,a2,a3;
public:
FF(TTb1,TTb2,TTb3){a1=b1;a2=b2;a3=b3;}
TTSum(){returna1+a2+a3;}};
voidmain()
{FFx(int(1.1),2,3),y(int(4.2),5,6);
cout< A.6.115.2
B.615
C.615.2
D.6.115
33.下面程序的运行结果为( )。#include
voidswap(int&a,intb)
{
inttemp;
temp=a++;
a=b:
b=temp:
}
voidmain()
{
inta=2,b=3;
swap(a,b);
cout< }
A.2,3
B.3,2
C.2,2
D.3,3
34.以下程序的输出结果是( )。min( )
{
inti=0,a=0;
while(i<20)
{
for(;;)
{
if((i)==0)break;
elsei--:
}
i+=11;a+=i;
}
cout< }
A.21B.32
C.33D.11
35.有如下类声明:
classXA(
intX;
public:
XA(intn){x=n;}
};
classXB:publicXA{
inty;
public:
XB(inta,intb);
];
在构造函数XB的下列定义中,正确的是( )。
A.XB::XB(inta,intb):x(a),y(b){)
B.XB::XB(inta,intb):XA(a),y(b){)
C.XB::XB(inta,intb):x(a),XB(b)(}
D.XB::XB(inta,intb):XA(a),XB(b){)
36.有下列程序:
#include
voidmain()
{char*a[]={"abcd","ef","gh","ijk");inti;
for(i=0;i<4;i++)printf("%C",*a[i]);
}
程序运行后的输出结果是( )。
A.aegi
B.dfhk
C.abcd
D.abcdefghijk
37.若已定义
inta[]={1,2,3,4,5,6,7,8,9,10},p=a,i=5;
则对数组元素不正确的引用是( )。
A.a[p-a]
B.*(&a[i])
C.p[i]
D.*(*(a+i))
38.对于语句“cout< A.*********1*2
B.********12
C.*******1*2
D.12********
39.有以下程序:
#include
usingnamespacestd;
classA{
public:
A(){cout<<"A";}
};
classB{public:B(){cout<<"B";}};
classC:publicA{
Bb;
public:
C(){cout<<"C";}
};
intmain(){Cobj;return0;}
执行后的输出结果是( )。
A.CBA
B.BAC
C.ACB
D.ABC
40.下列程序的运行结果是( )。
#include
intx=5;
intfun(inta)
{
intc:
c=X*a:
returnC;
}
voidmain()
{
intx=3,a=4;
x=x+fun(a);
cout<<"x="< }
A.x=15
B.x=17
C.x=23
D.x=25
二、程序改错题(18分)
使用VC++6.0打开考生文件夹下的源程序文件1.cpp,该程序运行时有错,请改正程序中的错误,使程序输出的结果为
Number=7
Number=12
注意:错误的语句在//******error******的下面,修改该语句即可。
试题程序:
#include
classTC
{
public:
//******error******
TC(inti):Number=i
{
//******error******
returnNumber;
}
voidset(inti)
{
Number=i;
}
voiddisplay()
{
cout<<"Number="< }
private:
intNumber;
};
voidmain()
{
//******error******
TC*p=newTC;
p->display();
p->set(12);
p->display();
return;
}
三、简单应用题(24分)
使用VC++6.0打开考生文件夹下的源程序文件2.cpp。阅读下列函数说明和代码,补充空出的代码。函数sum(intn)用于计算在n范围内,能被7和11整除的所有整数的和(包括n在内)。
注意:不能修改程序的其他部分,只能补充sum函数。
试题程序:
#include
doublesum(intn)
{
}
voidmain()
{
cout< cout< cout< return;
}
四、综合应用题(18分)
使用VC++6.0打开考生文件夹下的源程序文件3.cpp,要求编写一个CMyShape类,含有求面积、周长等的纯虚函数,然后编写一个CRectangle类和CCircle类继承CMyShape,并实现求面积、周长的两个函数。在main函数中测试得到下面的结果:
在CMyShape类构造函数内
在CCircle类构造函数内
在CMyShape类构造函数内
在CReetangle类构造函数内
myCircle:Area=314.159Girth=62.8319
myRectangle:Area=900Girth=120
具体要求如下:
(1)定义求面积的纯虚函数,请在注释1后添加适当的语句。
(2)定义求周长的纯虚函数,请在注释2后添加适当的语句。
(3)请在注释3和注释4后添加适当的语句。
注意:除在指定位置添加语句之外,不要改动程序中的其他内容。
试题程序:
#include
#inelude
#definePI3.1415926
classCMyPoint
{
public:
intX,y;
CMyPoint(inttx,intty):x(tx),y(ty){}
};
classCMyShape
{
public:
CMyShape(){cout{{"在CMyShape类构造函数内"
< //********1********
//********2********
protected:
};
classCCircle:publicCMyShape
{
public:
CCircle(CMyPointi,doublej):CMyShape(),arc-
Center(i),radius(j)
{
cout<<"在CCircle类构造函数内"< }
doubleGetArea()
{
returnPI*radius*radius:
}
doubleGetGirth()
{
return2*PI*radius:
}
private:
CMyPointarcCenter;
doubleradius;
};
classCRectangle:publicCMyShape
{
public:
CRectangle(CMyPointIt,CMyPomtrb):leftTop(it),
rightBottom(rb),CMyShape()
{
cout<<"在CRectangle类构造函数内"< }
doubleGetArea()
{
intwidth=abs(rightBottom.X-leftTop.x);
intheight=abs(rightBottom.y-leftTop.y);
returnwidth*height:
}
doubleGetGirth()
{
intwidth=abs(rightBottom.x-leftTop.x);
intheight=abs(rightBottom.y-leftTop.y);
return2*(width+height):
}
private:
CMyPointleftTop,rightBottom;
};
voidmain()
{
CMyShape*myShape=NULL;
CCircle*myCircle=newCCircle(CMyPoint(5,5),10);
CRectangle*myRectangle=newCRectangle(CMy—Point(0,O),CMyPoint(30,30));
//********3********
cout<<"myCircle:"<<"Area="<
一、选择题
1.C。【解析】算法的执行效率与数据的存储结构密切相关。算法的空间复杂度是指算法执行过程中所需的存储空间。
2.D。【解析】程序调试就是诊断和改正程序中的错误,由程序开发者完成。软件测试是为了发现错误而执行程序的过程,它由专门的测试人员完成。软件维护是指软件系统交付使用以后,为了改正错误或满足新的需要而修改软件的过程,是软件生存周期中非常重要的一个阶段。
3.B。【解析】源程序的文档化主要包括三点:①符号名应具有一定实际的含义,便于理解程序功能;②正确的程序注释;③良好的视觉组织,利用空格、空行、缩进等技巧使程序层次清晰。
4.B。【解析】数据的存储结构分为顺序结构和链式结构,一个数据的逻辑结构可以有多种存储结构。顺序结构中数据元素所占的存储空间是连续的,而链式存储结构中,数据元素所占的存储空间不一定是连续的。数据的存储结构与数据的处理效率密切相关。
5.C。【解析】在模块化程序设计中.模块之间的联系可以通过程序的控制结构来实现。在自顶向下、逐步细化的设计过程中,首先要考虑全局目标,而不是细节。在程序设计中,模块化和结构化可以同时使用,一个模块的内部结构也要符合结构化设计原则。
6.C。【解析】关系代数中的集合运算有并、差、交和笛卡儿积四种。根据本题关系T中的元组可知,它是由关系R和关系S进行笛卡儿积运算得到的。
7.B。【解析】关系数据库逻辑设计的主要工作是将E-R图转换成指定RDBMS中的关系模式。从E-R图到关系模式的转换是比较直接的,实体与联系都可以表示成关系,E-R图中属性也可以转换成关系的属性。实体集也可以转换成关系。
8.B。【解析】字串的定位操作通常称为串的模式匹配,是各种串处理系统中最重要的操作之一。
9.D。【解析】在面向对象方法中,对象之间通过消息进行通信。消息中只包含传递者的要求,它告诉接受者需要做哪些处理,但并不指示接受者应该怎么完成这些处理,接受者独立决定采用什么方式完成所需的处理。
10.D。【解析】物理设计阶段主要解决选择文件存储结构和确定文件存取方法的问题。物理设计阶段包括:选择存储结构、确定存取方法、选择存取路径、确定数据的存放位置。
11.D。【解析】C++把重载的运算符视为特殊的函数,称为运算符函数,函数名就是在运算符前加上保留字opera-tor。C++中通过重新定义运算符,使它能够用于特定类的对象执行特定的功能。但是用户重新定义运算符,不改变原运算符的操作符个数、优先级和结合性。同时运算符重载后,也不改变运算符的语法结构,即单目运算符只能重载为单目运算符,双目运算符只能重载为双目运算符。
12.C。【解析】本题考查内联函数的相关知识点。函数原型应指出函数名、返回值类型以及在调用函数时提供的参数的个数和类型,因为要声明为内联函数,故应加inline关键字。
13.A。【解析】数组定义中的数字指的是数组的大小,而下标是从0开始的,所以数组的最后一个元素是num[9]。
14.C。【解析】在赋值操作中,将发生对象的复制操作,但并不说明两者是完全一样的。一般情况下,如果给类定义了赋值操作符,则应该同时定义合适的复制构造函数,除非系统默认生成的复制构造函数满足赋值操作。实际上,系统默认的复制构造函数仅仅将数据成员进行简单的对应赋值,而在多数特殊应用中,需要程序员重新定义复制构造函数。
15.B。【解析】本题考查函数模板的引用。引用模板函数和引用一般函数在语法形式上基本相同。需要注意的是,说明一个函数模板后,当编译系统发现有一个对应的函数调用时,将根据实参中的类型来确认是否调用函数模板中的对应形参。本题选项B中,编译系统从第一个参数“3.5”获得信息“double型数据”和从第二个参数获得信息“int型数据”,两者矛盾。
16.A。【解析】本题考查continue语句的运用。contin-ue是指跳出本次循环中尚未执行的语句,重新执行循环,但没有终止循环。
17.D。【解析】数组的下标从0开始,至n-1为止,因此选项D是正确答案。
18.D。【解析】A项、B项、C项均为虚函数与函数重载的不同之处。但有一点它们是相同的:在类内外定义均可。故D项错误。
19.D。【解析】本题需要考生记忆一些输入/输出控制操作字,oct为八进制,setfill为设置填充符,setw为设置域宽。
20.C。【解析】数据封装就是数据抽象,即信息隐藏,而继承是实现程序复用的基础。
21.D。【解析】本题考鸯this指针的使用。类的每一个成员函数都有一个隐含的常量指针,印this指针。类的静态成员函数不能含有this指针.因为this指针是一个指向本对象的指针。
22.A。【解析】本题考查C++流的溉念和I/0的格式化。tin是istream类的对象,即输入流对象。ifstream是输入文件流,类不能定义个输出流对象。getline函数的功能是允许从输入流中读取多个字符,并且允许指定输入终止,在读取完成后,从读取的内容中删除该终止字符,所以D选项中的语句序列后x中字符串应该是Happynewyear。
23.C。【解析】本题中类TestClass为基类,TestClassl为TestClass的派生类。由main主函数入手,定义TestClassl类型的对象dl,参数值为y。TestClassl类继承TestClass,所以主函数中“TestClassldl(’y’);”语句首先调用“TestClassl(charc){colll< 24.D。【解析】虚基类说明格式为:Virtual<继承方式><基类名>其中,virtual是虚基类的关键词。虚基类的说明是用在定义派生类时,写在派生类名的后面。即class<派生类名>:Virtual<继承方式><基类名>。
25.C。【解析】本题考查类的构造函数和析构函数。首先,Samplesl(2,3);会调用含有两个参数的构造函数Sam-ple(inta,intb){x=a;y=b;),disp()函数输出成员变量x和y的值x=2,y=3;然后结束时调用析构函数。因为x和y值不等,故输出X!=Y。
26.D。【解析】本题主要考查switch语句的使用,在第一个case处,因为满足条件,所以输出字符3。但这个分支没有break语句终止,所以会继续执行下面的分支语句,即输出字符2,这时出现break语句,结束整个语句,即输出32。
27.A。【解析】静态数据成员是类中所有对象共享的成员,而不是某个对象的成员。题中变量n是静态数据成员,对象对其操作的结果具有叠加作用,main函数中先定义了Test的对象*P,然后又delereP,所以对静态数据n进行了两次操作,分别是"n+=2"和"n-=3",n的初始值是1,那么n最后的值变为0。main函数最后通过调用静态函数getNum得到n的值,并输出。
28.A。【解析】本题考查虚基类的应用。虽然Derivedl和Derived2都是由共同的基类x派生而来的,但由于引入了虚基类,使得它们分别对应基类的不同副本。这时数据成员x只存在一份副本,不论在类Derivedl中修改,还是在Derived2中修改,都是直接对这唯一副本进行操作。本题程序执行语句“Derivedobj;”时.就会先调虚基类Base的构造函数,使得X=0,然后执行类Derivedl的构造函数使得x=10,再执行类Derived2的构造函数,使得x=20。最后输出x的值为20。
29.C。【解析】用一个指针变量p指向字符数组A,在while循环中,当不指向数组尾时,将小写字母转换为大写字母,然后将其输出。
30.B。【解析】本题定义TestClass型常对象a,然后调用对象a中的成员函数print()。因为在C++中.如果一个对象被声明为常对象,则不能调用该对象中的非const型成员函数。所以,这里调用的是对象中的const型成员函数voidprint()const,输出为print2。
31.A。【解析】本题考查含有虚基类的继承中构造函数的调用顺序,应该先调用基类的构造函数,接着按照派生类继承列表的顺序依次调用虚基类的构造函数,最后调用派生类自己的构造函数。
32.B。【解析】本题考查模板函数的应用,表达式int(1.1)和int(4.2)用于将1.1和4.2强制转换为整型。
33.D。【解析】本题考查引用调用,因为函数swap引用调用参数a,所以在swap函数中a的变化会改变主函数中a的值,即a自加1。但b的值并未改变。
34.B。【解析】本题是两个循环语句和一个判断语句的嵌套。For循环的作用是在i等于10的时候跳出循环,故本题的答案为B。
35.B。【解析】本题考查派生类中构造函数的定义。派生类的构造首先要调用基类的构造函数,对基类成员初始化,然后对派生类中的新增成员初始化。格式为,派生类名(构造函数形参表)基类构造函数(形参表)。
36.A。【解析】*a[]表示一个字符串数组,for循环的作用是输出字符串数组中每一个字符串的第一个字符。所以正确答案为选项A。
37.D。【解析】数组和指针的关系非常密切,因为数组名称单独使用是表示数组的首地址。故可用的表示可能是a[i],p[i],*(P{i),同样&(a[i])表示地址,因此*(&a[i])等同于a[i]。本题答案为D。
38.A。【解析】C++语言中,setfill的意思是在空格的地方填上setfill函数中的参数字符,setw的意思是设置整个输出字符串的字符个数,本题中用*来代替空格。
39.D。【解析】本题考查的是类的继承和派生。系统首先要通过派生类的构造函数调用基类的构造函数,对基类成员初始化,然后对派生类中的新增成员初始化。
40.C。【解析】由主函数main入手,首先x被赋值为3,a被赋值为4,然后调用fun函数,参数为4,所以在fun函数中的a=4。而主程序中的x作用域是由它定义开始到cout输出,在fun函数中无效。而在fun函数定义前的变量X作用域是整个程序,所以fun函数中的x值为5,这样C的值就为20。在主函数中的x+fun(a)中的x为靠近这条语句的x定义,即3,所以最后x的值为20+3=23。
二、程序改错题
(1)应改为“TC(inti):Number(i)”。
(2)应删除“returnNumber;”。
(3)应改为“TC*p=newTC(7);”
【解析】本题第1处是声明构造函数,并使用初始化列表完成成员变量的初始化,可知第1处的初始化列表错误,正确的应该是“TC(inti):Number(i)”。构造函数不能有返回值,不能用return来返回值,故第2处应将“returnNumber;”删除。类实例在不指定构造函数的情况下,调用的是默认无参数的构造函数,此时成员变量Number是不确定的,在定义对象时,应使用已定义的构造函数,根据输出结果可知,P指向的对象的Number初始化值为7,故第3处应改为“TC*p=newTC(7);”。
三、简单应用题
intresult=0;
for(inti=11;i<=n;i++)
{
if((i%7==O)&&(i==0))
{
result+=i:
}
}
returnresult;
【解析】本题利用循环查找所有小于等于n的能被7和11整除的数,循环变量i从最小值11开始,到n结束,即11<=i<=n。在函数中定义累加变量result用来保存求和结果,在循环体内,逐个判断每个i是否能被7和11整除,即(i%7==0)和(i==0)都满足的话,说明i能同时被7和11整除,将该值加到resuh上,循环结束返回result。
四、综合应用题
(1)应添加“virtualdoubleGetArea()=0;”。
(2)应添加“virtualdoubleGetGirth()=0;”。
(3)应添加“myShape=myCircle;”。
(4)应添加“myShape=myRectangle;”。
【解析】本题在第1处声明纯虚函数,纯虚函数的定义格式为“virtual<函数类型><函数名>(<参数表>)=0”,由程序后面的函数体实现可知求面积纯虚函数的函数名称为GetAr-ea,因此第1处应添加“virtualdoubleGetArea()=0;”。声明格式和1处相同,由求周长的函数具体实现可知该函数的名称为GetGirth,因此第2处应添加“virtualdoubleGetGirth()=0;”。主函数中定义了CMyShape类对象指针myShape,CCir-cle类对象指针myCirele,CRectangle类对象指针myRectan-gle。由类继承关系知,在调用子类的构造函数时,编译器会自动调用父类的默认构造函数来初始化父类,因此在实例化类CRectangle和类CCircle的实例时,抽象父类CMyShape的默认构造函数会先被调用,因此在屏幕上先输出“在CMy-Shape类构造函数内”.然后输出“在CCircle类构造函数内”,实例化CRectangle对象的过程也是如此。同时由纯虚函数的性质知,抽象基类不需要实现纯虚函数,它的实现是在子类中完成的,但通过用子类实例隐式转换成基类实例,可以使得基类实例具有子类实例的特性,因此可以访问子类的成员函数,myShape是基类指针,其虚函数GetArea和GetGirth没有实现,要求程序输出的面积值和周长值,只可能是myShape指向子类对象,调用子类的函数GetArea和GetGirth打印输出,显然在第3处是myShape指向子类CCircle对象,即“myShape=myCirele;”。同理第4处myShape指向子类CRectangle对象,即第4处应添加“myShape=myRectangle;”。
全国计算机等级考试计算机基础及Photoshop应用试题答案汇总(6套)
[Photoshop应用]2017年2月3日全国计算机等级考试四级数据库系统工程师试题及答案汇总(22套)
[数据库工程师]2017年2月2日全国计算机一级考试模拟试题及答案300题
[WPS Office应用]2017年1月22日2017年3月全国计算机等级考试报名时间及报名入口汇总
[考试动态]2017年1月3日2017全国计算机等级考试考试大纲专题
[政策大纲]2017年1月3日