一、选择题 3. 有如下程序:
# include <ioslreclm>
Using namespace std;
class Base{
public:
Base(int x=0):valB(x){cout<<valB;}
~Base(){cout<<valB;}
Private:
int valB;
};
class, Derived: public Base{
public:
Dcrived(int x=0,int y=0):Base(x),valD(y)
{cout<<valD;}
~Derived(){cout<<valD;}
private:
int valD;
};
int main(){
Derived obj12(2,3);
return 0;
}
运行时的输出结果是
,
A B C D
4. 已知函数模板定义如下:
template<class T>
T min(T x, T y)
{
return x<y? x:y;
}
下列叙述中,错误的是______。
A.该函数模板有一个模板参数 B.T类型所允许的类型范围应提供有意义的<运算符操作 C.该函数模板生成的模板函数中,参数和返回值的类型可以不同 D.该函数模板可以生成模板函数double min(double, double)
A B C D
C
[解析] 该函数模板有一个模板参数T,选项A正确;由于在函数体中需要比较函数两个参数x、y的大小,所以T类型必须能够提供有意义的<运算符操作,选项B正确;double具有有意义的<运算符操作,所以可以生成模板函数double min(double,double),选项D正确;在该函数模板中,函数的参数和返回值类型都是T,所以参数和返回值的类型必须是一样的,选项C错误。答案为C选项。
5. 有如下程序:
#include<iostream>
using namespace std;
class Instrument{
public:
virtual void Display()=0;
};
class Piano:public Instrument{
public:
vold Display(){/*函数体程序略*/}
};
int main(){
Instrument s;
Instrument*p=0;
//...;
return 0;
}
下列叙述中正确的是______。
A.语句“Insturment*p=0;”编译时出错 B.语句“Instrument s;”编译时出错 C.类Piano中的Display函数不是虚函数 D.类Instrumen是一个虚基类
A B C D
B
[解析] 抽象类只能作为别的类的基类,不能生成对象。
9. 下面关于数组的初始化正确的是______。
A.char str[]={'a', 'b', 'c'} B.char str[2]={'a', 'b', 'c'} C.char str[2][3]={{'a', 'b'}, {'c', 'd'}, {'e', 'f'}} D.char str()={'a', 'b', 'c'}
A B C D
A
[解析] 本题考查的是字符数组的初始化。选项B中用3个元素初始化大小为2的数组,越界了;选项C中应该是2行3列的数组,题中使用3行2列初始化;选项D中数组合后应用方括号。
11. 在下面的定义语句中,画线处应填入的内容是
class Fred{
public:
void print( ){cout<<data<<endl;}
void setData(double D) {data=d;}
static int count;
private:
double data;
};
______count=0;//静态数据成员的定义
A.int B.static int C.int Fred:: D.static int Fred::
A B C D
C
[解析] 静态数据成员在类中声明,对它的访问可通过类名进行。
12. 有如下程序:
#include<iostream>
using namespace std;
int main()
{
void function(double val);
double val;
function(val);
cout<<val;
return 0;
}
void function(double val)
{
val=3;
}
编译运行这个程序将出现的情况是______。
A.编译出错,无法运行 B.输出:3 C.输出:3.0 D.输出一个不确定的数
A B C D
D
[解析] 本题考查函数调用及传值方式传递参数,执行函数function时,并没有将3的值传回来,而val又没有初始化,所以会输出一个不确定的值,D选项正确。
13. 有如下类定义:
class Box{
public:
Box(int h, int w, int r):wid(w), len(r), hei(h){}
private:
int len, wid, hei;
};
Box类中3个数据成员的初始化顺序为______。
A.len,hei,wid B.len,wid,hei C.hei,wid,len D.wid,len,hei
A B C D
B
[解析] 类构造函数中的成员初始化顺序是按照成员在类体中的声明次序来确定的,而不是按照初始化列表中的次序,所以本题中成员的初始化顺序为len,wid,hei,答案为B选项。
16. 下面程序的输出结果是
。
#include<iostream.h>
Class example
{int a;
public:
example(int B.{a=b++;}
void print(){a=a+1 cout<<a<<““;}
void print()const{cout<<a<<““;}
};
void main()
{example x(3);
Const example y(2);
x.print();
y.print();
}
A B C D
C
[解析] “++”是右结合的,所以先赋值为3,最后输出3+1;常成员函数只有常对象才能调用,所以输出2。
21. 已知递归函数fun的定义如下:
int fun(int n)
{ if(n<=1)return 1;//递归结束情况
else return n*fun(n-2);//递归
}
则函数调用语句fun(5)的返回值是______。
A B C D
C
[解析] 递归函数fun被定义为含有参数int n,返回整型。其中fun函数递归调用本身,当n=1时,fun返回1,如果大于1那么执行n*fun(n-2)。所以,当n等于5时,执行5*fun(3);当3时继续调用fun, 3*fun(1),即fun(5)=5*(3*fun(1)),答案为15。
22. 有如下程序:
#include<iostream>
using namespace std;
class TestClass
{int a;
public:
TestClass(int x){a=x;}
void show(){cout<<a;}};
class TestClass1:public TcstClass
{int b;
public:
TestClass1(int i):TestClass(i+1),b(i){)
void show(){cout<<b;}};
int main()
{TestClass b(5),*p;
TestClass1 d(1);
p=&d;
p->show();
return 0;}
该程序运行后的打印结果是______。
A B C D
D
[解析] TestClass为TestClass1的基类,在主函数main中定义TestClass对象b,*p。TestClass1对象d,p指向d,调用其show函数。“TestClass(int i):TestClass(i+1),b(i){}”语句中的TestClass基类参数为2,所以show输出2。
25. 下列枚举类型的定义中,包含枚举值3的是______。
A.enum test{RED,YELLOW,BLUE,BLACK}; B.enum test{RED,YELLOW=4,BLUE,BLACK}; C.enum test{RED=-1,YELLOW,BLUE,BLACK}; D.enum test{RED,YELLOW=6,BLUE,BLACK};
A B C D
A
[解析] 枚举类型是由用户定义的若干枚举常量的集合。枚举元素作为常量,它们是有值的,C++编译系统按定义时的顺序对它们赋值为0,1,2,3,…。也可以在声明枚举类型时另行指定枚举元素的值。 选项A中,4个元素值分别为0,1,2,3,其中,BLACK的值即为3,故A为正确答案; 选项B中,4个元素值分别为0,4,5,6;选项C中,4个元素值分别为-1,0,1,2; 选项D中,4个元素值分别为0,6,7,8。
30. 下面是类MyClass的定义,对定义中各语句描述正确的是______。
class MyClass
{
public:
void MyClass(int a) {X=a;} //①
int f(int a,int b) //②
{
X=a;
Y=b;
}
int f(int a,int b, int c=0) //③
{
X=a;
Y=b;
Z=c;
}
static void g() {X=10;} //④
private:
int X, Y, Z;
};
A.语句①是类MyClass的构造函数定义 B.语句②和语句③实现类成员函数的重载 C.语句④实现对类成员变量X的更新操作 D.语句①、②、③和④都不正确
A B C D
32. 有如下程序:
#include<iostream>
using namespace std;
void fun(char c) {cout<<"char c/";}
void fun(double d) {cout<<"double d/";}
void fun(char*p) {cout<<"char*p/";}
int main(){
fun(0);
return 0;
}
进行编译、链接、运行的结果是______。
A.编译出错,无法运行 B.输出:char c/ C.输出:double d/ D.输出:char*p/
A B C D
35. 下面是类Shape的定义:
class Shape{
public:
virtual void Draw()=0;
};
下列关于Shape类的描述中,正确的是______。
A.类Shape是虚基类 B.类Shape是抽象类 C.类Shape中的Draw函数声明有误 D.语句“Shape s;”能够建立Shape的一个对象s
A B C D
B
[解析] 把含有纯虚函数的类称作为抽象类或抽象基类。抽象类只能作为别的类的基类,不能生成对象。
37. 有如下程序:
#include<iostream>
using namespace std;
class Base
{
pubfic:
Base(){cout<<"BB";f();}
void f(){cout<<"Bf":}
};
class Derived:public Base
{
public:
Derived(){cout<<"DD";)
voidf(){cout<<"Df":}
};
intmain(){Derived d;retum 0;}
执行上面的程序将输出
A.BBBfDD B.BBDfDDDf C.DD D.DDBBBf
A B C D
二、基本操作题 1. 请使用VC6或使用[答题]菜单打开
考生文件夹 proj1下的工程proj1,其中有枚举DOGCOLOR、狗类Dog和主函数main的定义。程序中位于每个“//ERROR ****found****”下的语句行有错误,请加以改正。改正后程序的输出结果应该是:
There is a white dog named Hoho.
There is a black dog named Haha.
There is a motley dog named Hihi.
注意:只修改每个//ERROR ****found****下的那一行,不要改动程序中的其他内容。
#include<iostream>
using namespace std;
//狗的颜色:黑、白、黄、褐、花、其他
enum DOGCOLOR {BLACK, WHITE, YELLOW, BROWN, PIEBALD, OTHER};
class Dog {//狗类
DOGCOLOR color;
char name[20];
static int count;
public:
Dog(char name[], DOGCOLOR color) {
strcpy(this->name, name);
//ERROR **********found**********
strcpy(this->color, color);
}
DOGCOLOR getColor()const {return color;}
//ERROR **********found**********
const char*getName()const {return*name;}
const char*getColorString()const {
switch(color) {
case BLACK: return "black":
case WHITE: return "white":
case YELLOW: return "yellow":
case BROWN: return "brown":
case PIEBALD: return "piebald":
}
return "motley";
}
void show()const {
cout<<"There is a"<<getColorString()<<"dog named"<<name<<'.'<<endl:
}
};
int main() {
//ERROR **********found**********
Dog dog1("Hoho", WHITE), dog2("Haha", BLACK); dog3("Hihi", OTHER);
dog1. show();
dog2. show();
dog3. show();
return 0;
}
(1)this->color=color;
(2)const char getName()const {return*name;}
(3)Dog dog1(="Hoho", WHITE), dog2("Haha", BLACK), dog3("Hihi", OTHER);
答案考生文件夹 [考点] 主要考查的是Dog类,其中涉及enum、静态私有成员、const函数和构造函数。strcpy函数用来复制字符串,而对double、int等类型直接用“=”赋值即可。定义同一类型的变量时,几个变量之间用“,”分开。 (1)主要考查考生对strcpy函数的掌握,如果看到上一条语句strcpy(this->name, name);,就以为本条语句也要用strcpy函数来赋值,这是错误的。Strcpy函数只能复制字符串,根据类的私有成员声明可知,color是DOGCOLOR型的,这里直接使用赋值语句“=”即可。 (2)主要考查考生对函数返回值的掌握,先解读语句const char * getName()const {return*name;},要返回的是一个const的字符指针,同时函数内的值不能改变,name在类的私有成员声明中是个字符数组,*name代表字符数组而不是字符指针,问题就出来了,需要修改返回类型:const char getName()const {return*name;}。 (3)语法错误,定义变量时,变量之间应使用“,”分开。
三、简单应用题 1.
考生文件夹 请打开考生文件夹下的解决方案文件proj2,此工程中含有一个源程序文件proj2.cpp。函数char *GetNum(char *src,char *buf)从src开始扫描下一个数字字符序列,并将其作为一个字符串取出放入字符串空间bur中。函数返回扫描的终止位置,如果返回NULL表示没有扫描到数字字符序列。
运行程序时,如果输入的一行字符序列是
ABC012XYZ378MN274WS
则输出为:
Digit string 1 is 012
Digit string 2 is 378
Digit string 3 is 274
注意:只在横线处编写适当代码,不要删除或移动“//****found****”。
//proj2.cpp
#include<iostream>
using namespace std;
char *GetNum(char *src,char *buf)
{
while($src!='\0')
{
if(isdigit(*src))break;
src++;
}
if(*src=='\0')
//********found********
______;
while(*src!='\0'&& isdigit(*src))
{
//********found********
______;
buf++;
src++;
}
*buf='\0';
return src;
}
int main()
{
char str[100],digits[20];
cin.getline(str,100);
char *p=str;
int i=1;
while((p=GetNum(p,digits))!=NULL)
{
cout<<"Digit string"<<i<<"is"<<digits<<endl;
//********found********
______;
}
return 0;
}
(1)return NULL
(2)*buf=*src
(3)i++
答案考生文件夹 [考点] 主要考查的是GetNmn函数、while循环语句、if语句和字符数组。从该函数的声明中,可以得到如下信息:该函数的返回值为字符指针,形参为两个字符指针src和buf。该函数的功能是,函数从src开始扫描下一个数字字符序列,并将其作为一个字符串取出放入字符串空间buf中。 [解析] (1)主要考查考生对if语句的掌握,由判断条件if(*src=='\0'),说明字符串src为空,则返回NULL即可。 (2)主要考查考生对while循环语句的掌握,while语句的循环条件为*src!='\0'&&isdigit(*src),该条件是指,若字符串src不为空并且*src指向的字符为数字字符,则进行循环。题目要求把数字字符放入字符串buf中,因此为*buf=*src。 (3)主要考查考生对while循环语句的掌握,从上一行语句cout<<"Digit string"<<i<<"is"<<digits<<endl;中可以得出,题目要求输出的i是递增的,因此这里需添加语句i++。
四、综合应用题 1.
考生文件夹 使用VC++2010打开考生文件夹下“proj3”文件夹中的工程proj3.sln。阅读下列函数说明和代码,补充空出的代码。函数sum(int n)计算在n范围内,能被7和11整除的所有整数的和(包括n在内)。
注意:不能修改程序的其他部分,只能补充sum()函数。
#include <iostream.h>
double sum(int n)
{
}
void main()
{
cout<<sum (80) <<endl;
cout<<sum(200) <<endl;
cout<<sum(300)<<endl;
return;
}
int result=0; for (int i=11; i<=n;i++) { if((i%7==0) && (i%11==0)) { result+= i; } } return result;
[解析] 函数sum(int n)的功能是实现计算在n范围内,能被7和11整除的所有整数的和(包括n在内),可采用循环的方式从11开始到n逐个寻找能被7和11整除的数,如果能同时被7和11整除则加到累加变量中。 (1)利用循环查找能所有小于等于n的能被7和11整除的数,循环变量i从最小值11开始,到n结束,即11<=i<=n。 (2)在函数中定义累加变量result用来保存求和结果,在循环体内,逐个判断每个i是否能被7和11整除,即(i%7==0)和(i%11==0)都满足的话,说明i能同时被7和11整除,将该值加到result上,循环结束返回result。