C面向对象程序设计模拟试题一剖析.docx
《C面向对象程序设计模拟试题一剖析.docx》由会员分享,可在线阅读,更多相关《C面向对象程序设计模拟试题一剖析.docx(17页珍藏版)》请在冰豆网上搜索。
C面向对象程序设计模拟试题一剖析
C++面向对象程序设计模拟试题一
一、单项选择题
1.说明虚函数的关键字是(B)。
A.inlineB.virtualC.defineD.static
2.在每个C++程序中都必须包含有这样一个函数,该函数的函数名为(A)。
A.mainB.MAINC.nameD.function
3.cout是某个类的标准对象的引用,该类是(A)。
A.ostreamB.istreamC.stdoutD.stdin
4.如果在类外有函数调用CPoint:
:
func();则函数func()是类CPoint的(C)。
A.私有静态成员函数B.公有非静态成员函数
C.公有静态成员函数D.友元函数
5.如果class类中的所有成员在定义时都没有使用关键字public、private或protected,则所有成员缺省定义为(C)。
A.publicB.protectedC.privateD.static
6.一个类的所有对象共享的是(D)。
A.私有数据成员B.公有数据成员C.保护数据成员D.静态数据成员
7.动态联编所支持的多态性称为(D)。
A.虚函数B.继承C.编译时多态性D.运行时多态性
8.定义类模板时要使用关键字(D)。
A.constB.newC.deleteD.template
9.对虚基类的定义(A)。
A.不需要使用虚函数B.必须使用虚函数
C.必须使用privateD.必须使用public
10.类型转换函数(A)。
A.不能带有参数B.只能带一个参数
C.只能带2个参数D.只能带3个参数
二、判断正误题
1.虚函数在基类和派生类之间定义,且要求函数原型完全一致。
Y()2.抽象类可以用来直接创建对象。
N()
3.内联函数中可以出现递归语句。
N()
4.模板类与类模板的意义完全相同。
N()
5.常对象只能调用常成员函数。
Y()
6.重载函数要求函数有相同的函数名,但具有不同的参数序列。
Y()
三、填空题(本大题共6小题,每小题2分,共12分)不写解答过程,将正确的答案写在每小题的空格内。
错填或不填均无分。
1.在用C++进行程序设计时,最好用(new)代替malloc。
2.函数模板中紧随template之后尖括号内的类型参数都要寇以保留字(class\\typename)。
3.编译时多态性可以用(重载)函数实现。
4.拷贝构造函数用它所在类的(对象)作为参数。
5.用关键字static修饰的类的成员称为(静态)成员。
6.重载运算符“+”的函数名为(operator+)。
四、程序分析题(本大题共4小题,每小题5分,共20分)给出下面各程序的输出结果。
1.阅读下面程序,写出输出结果。
#include
usingnamespacestd;
classCArray
{
public:
CArray(intiArray[],intiSize):
m_pArray(iArray),m_iSize(iSize)
{
}
intGetSize()
{
returnm_iSize;
}
int&operator[](intiIndex)
{
returnm_pArray[iIndex-1];
}
private:
int*m_pArray;//指向一个数组空间
intm_iSize;//数组元素个数
};
intmain()
{
ints[]={3,7,2,1,5};
CArrayoArray(s,5);
oArray[1]=9;
for(inti=1;i<=5;i++)
{
cout<}
cout<return0;
}
上面程序的输出结果为:
1.参考答案:
97215
2.阅读下面程序,写出输出结果。
#include
usingnamespacestd;
template
voidPrint(Typea[],intn)
{
for(inti=0;i{
cout<}
}
intmain()
{
inta[]={5,6,8};
doubleb[]={6.8,9.6};
Print(a,sizeof(a)/sizeof(int));
Print(b,2);
cout<return0;
}
上面程序的输出结果为:
2.参考答案:
5686.89.6
3.阅读下面程序,写出输出结果。
#include
usingnamespacestd;
classCTest
{
public:
CTest(intiVar):
m_iVar(iVar)
{
m_iCount++;
}
~CTest()
{
}
voidPrint()const;
staticintGetCount()
{
returnm_iCount;
}
private:
intm_iVar;
staticintm_iCount;
};
intCTest:
:
m_iCount=0;
voidCTest:
:
Print()const
{
cout<m_iVar<<""<m_iCount<<"";
}
intmain()
{
CTestoTest1(6);
oTest1.Print();
CTestoTest2(8);
oTest2.Print();
cout<:
GetCount();
cout<return0;
}
上面程序的输出结果为:
3.参考答案:
61822
4.阅读下面程序,写出输出结果。
#include
usingnamespacestd;
classCTest
{
public:
CTest(intiX=0,intiY=0,intiZ=0):
m_iZ(iZ)
{
m_iX=iX;
m_iY=iY;
}
voidPrint()
{
cout<cout<}
voidPrint()const
{
cout<}
private:
intm_iX,m_iY;
constintm_iZ;
};
intmain()
{
CTestoTest1;
oTest1.Print();
CTestoTest2(1,6,8);
oTest2.Print();
constCTestoTest3(6,0,18);
oTest3.Print();
cout<return0;
}
上面程序的输出结果为:
4.参考答案:
0
0
1
6
18
五、程序改错题(本大题共4小题,每小题5分,共20分)指出下面程序中的错误,说明错误原因,并加以改正。
1.下面程序中类的定义中有一处错误,请指出出错的行,说明错误原因,并加以改正。
#include//1
usingnamespacestd;//2
//3
classCTest//4
{//5
public:
//6
CTest(intiVar=0):
m_iArr(iVar)//7
{//8
cout<<"构造函数:
"<}//10
//11
void~CTest()//12
{//13
cout<<"析造函数:
"<}//15
//16
private:
//17
intm_iArr;//18
};//19
//20
//21
intmain()//22
{//23
CTestoTest1,oTest2(8);//24
cout<//26
return0;//27
}//28
1.参考答案:
出错行:
第12行
原因:
析造函数不能有返回值类型
改正:
去掉void
2.下面程序中类的定义中有一处错误,请指出出错的行,说明错误原因,并加以改正。
#include//1
usingnamespacestd;//2
//3
classCTest//4
{//5
public:
//6
CTest(intiA=0,intiB):
m_iA(iA),m_iB(iB)//7
{//8
}//9
//10
voidShow()//11
{//12
cout<}//14
//15
private:
//16
intm_iA,m_iB;//17
};//18
//19
//20
intmain()//21
{//22
CTestoTest(12,16);//23
oTest.Show();//24
cout<//26
return0;//27
}//28
2.参考答案:
出错行:
第7行
原因:
带缺省值的参数应放在参数表的尾部,其后不允许出现不带缺省值的参数
改正:
CTest(intiA=0,intiB=0):
m_iA(iA),m_iB(iB)//7
或
CTest(intiA,intiB=0):
m_iA(iA),m_iB(iB)//7
或
CTest(intiA,intiB):
m_iA(iA),m_iB(iB)//7
3.下面程序中类的定义中有一处错误,请指出出错的行,说明错误原因,并加以改正。
#include//1
usingnamespacestd;//2
//3
classCTest//4
{//5
public:
//6
CTest(intiVar=0)//7
{//8
m_iVar=iVar//9
}//10
//11
voidPrint()const//12
{//13
cout<}//15
//16
private:
//17
constintm_iVar;//18
};//19
//20
//21
intmain()//22
{//23
constCTestoTest(16);//24
oTest.Print();//25
cout<//27
return0;//28
}//29
3.参考答案:
出错行:
第9行
原因:
常数据成员只能通过初始化表方式进行初始化。
改正:
去掉第9行,在第7行后加初始化表,即第9行改为:
CTest(intiVar=0):
m_iVar(iVar)
4.下面程序中有一处错误,请指出出错的行,说明错误原因,并加以改正。
#include//1
usingnamespacestd;//2
//3
classCBase//4
{//5
public:
//6
CBase(intiBase=0):
m_iBase(iBase)//7
{//8
}//10
//11
virtualvoidShow()=0;//12
//13
intGet()const//14
{//15
returnm_iBase;//16
}//17
//18
private:
//19
intm_iBase;//20
};//21
//22
classCDerive:
publicCBase//23
{//24
public:
//25
CDerive(intiBase=0,intiDerive=0):
CBase(iBase)//26
{//27
m_iDerive=iDerive;//28
}//29
//30
voidShow()//31
{//32
cout<:
Get()<<","<}//34
//35
private:
//36
intm_iDerive;//37
};//38
//39
intmain()//40
{//41
CBaseobj(10);//42
obj.Show();//43
return0;//44
}//45
4.参考答案:
出错行:
第42行
原因:
抽象类不能用来直接创建对象。
改正:
将第42行改为:
CDeriveobj(10);//42
六、编程题(本大题共2个小题,每小题8分,共16分)
1.编写一个函数模板,用于求参数的绝对值,并编写测试程序进行测试。
函数模板声明如下:
template
TypeAbs(TypetVar)
参考程序:
#include
usingnamespacestd;
template
TypeAbs(TypetVar)
{
if(tVar>=0)returntVar;
elsereturn-tVar;
}
intmain()
{
cout<cout<cout<cout<return0;
}
2.定义一个复数类CComplex,定义带有2个参数(其中一个为缺省参数)的构造函数,显示复数值的函数Show(),重载“+”运算符(用成员函数实现),并编写测试程序进行测试。
参考程序:
#include
usingnamespacestd;
classCComplex
{
public:
CComplex(doubledReal,doubledImage=0)
{
m_dReal=dReal;
m_dImage=dImage;
}
voidShow()
{
cout<if(m_dImage>0)
{
cout<<"+"<}
elseif(m_dImage<0)
{
cout<<"-"<<-m_dImage<<"i"<}
}
CComplexoperator+(constCComplex&obj)
{
CComplexobjTemp(m_dReal+obj.m_dReal,m_dImage+obj.m_dImage);
returnobjTemp;
}
private:
doublem_dReal,m_dImage;
};
intmain()
{
CComplexobj1(2,6),obj2(3,8),obj3(0);
obj1.Show();
obj2.Show();
obj3.Show();
obj3=obj1+obj2;
obj3.Show();
return0;
}