二、填空题(本大题共20小题,每小题1分,共20分)请在每小题的空格中填上正确答案。错填、不填均无分。
第1题单目运算符作为类成员函数重载时,形参个数为___个。
【正确答案】(P189)0
[解析]单目运算符使用成员函数重载可以不用形参,双目运算符使用一个参数。
第2题假设int a=1,b=2;则表达式(++a/b)*b--的值为___。
【正确答案】2
[解析]前缀++或――表示先使变量值变化,再使用,这和后缀恰恰相反。但是编译cout<<(++a/b)*b--时,先++a/b值为1,后1*b--,先取b=2,结果为2,再让b=1。
第3题每个对象都是所属类的一个___。
【正确答案】(P69)实例
[解析]类是对象的抽象,对象是类的一个实例。
第4题设类A有成员函数void f(void);若要定义一个指向类成员函数的指针变量pf来指向f,该指针变量的声明语句是:___。
【正确答案】(P117)void(A::*pf)(void)=&A::f;
[解析]void(A::*pf)(void)=&A::f;指向成员函数的指针,它相当于两条语句:void(A::*pf)(void);和pf=&A::f;。
第5题在单继承和多继承方式中,面向对象的程序设计应尽量使用___继承。
【正确答案】(P138)单
[解析]多继承是单继承的扩展,且多继承易产生二义性等问题。
第6题在C++中,虚函数帮助实现了类的___。
【正确答案】(P170)多态性
[解析]动态多态性是通过基类指针或引用结合虚函数来实现的。
第7题在删除一个动态对象时,将自动调用该动态对象所属类的___函数。
【正确答案】(P80)析构
[解析]在下列情况下,析构函数会自动被调用:
(1)如果一个对象被定义被一个函数体内,当这个函数结束时,该对象的析构函数被自动调用。
(2)若使用new运算符动态创建一个对象,在使用delete运算符释放时,delete将会自动调用析构函数。
第8题编译时的多态性通过___函数实现。
【正确答案】(P165)重载
[解析]编译多态性,实现的方法主要通过函数的重载或运算符的重载。
第9题在C++中,访问指针所指向的对象的成员使用___运算符。
【正确答案】->或.
[解析]使用指针访问成员有两种方法:成员运算符“.”或指向运算符“.”。
第10题在C++中,访问一个指针所指向的对象的成员所用的指向运算符是___。
【正确答案】->
[解析]指针使用成员有两种方法:“->”指向运算符和“.”成员访问运算符。
第11题静态成员定义的关键字为___。
【正确答案】static
[解析]静态成员是类中所有对象共享特征,使用static关键字来说明。静态数据成员在每个类对象中并不占有存储空间,静态数据成员的值对每个对象都是一样的,但它的值可以被任何一个对象更新,从而实现了同一类的不同对象之间的数据共享。静态数据成员具有静态生存期,必须对它进行初始化。静态数据成员初始化的一般格式如下:<数据类型说明符><类名>::<静态数据成员名>=<初始值>;。
第12题下面程序的输出结果为___
【正确答案】33
第13题带有___的类称为抽象类。
【正确答案】(P173)纯虚函数
[解析]类中至少有一个纯虚函数,该类就称为抽象类,抽象类不能定义对象。
第14题控制格式输入输出的操作中,函数___是用来设置填充字符。要求给出函数名和参数类型。
【正确答案】(P195)setfill(char)
[解析]格式控制方法的使用,如setw,setfill等等。
第15题在定义成员函数时,函数体之前加上___防止覆盖函数改变数据成员的值。
【正确答案】(P114)const
[解析]使用const关键字说明的成员函数称为常成员函数,常成员函数的说明格式如下:<返回类型说明符><成员函数名>(<参数表>)const;
在使用常成员函数时要注意:
(1)const是函数类型的一个组成部分,因此在函数实现部分也要带有const关键字。
(2)常成员函数不更新对象的数据成员,也不能调用该类中没有用const修饰的成员函数。
(3)常对象只能调用它的常成员函数,而不能调用其他成员函数。
第16题C++是通过引用运算符___来定义一个引用的。
【正确答案】(P10)&
[解析]引用是C不具有使用方法,它表示变量的别名,在函数中使用很频繁,因为调用形式同传值调用,但修改形参实参也会相应改变的特征。
第17题执行___操作将释放由指针所指向的动态分配的数据空间。
【正确答案】(P10)delete
[解析]delete用来删除new创建的对象。
第18题有int a=1,b=2;则表达式a+++--b的值为___。
【正确答案】2
[解析]a++是后加,--b是前减。
第19题在面向对象的程序设计中,将一组对象的共同特性抽象出来形成___。
【正确答案】(P38)类
[解析]类是相似特征的对象的抽象,对象是类的一个实例。
第20题将指向对象的引用作为函数的形参,形参是对象的引用,实参是___。
【正确答案】(P53)对象名
[解析]实参与形参类型要一致,形参是对象的引用,实参应该是对象名。
三、改错题(本大题共5小题,每小题4分,共20分)
第1题#include<iostream.h>
class A
{public:
A(int i=8):y(i){}
static int x;
int y;
};
int x=20;//对类成员初始化
void main()
{A a;
cout<<a.x<<","<<a.y<<endl;
}
【正确答案】int x=20;//静态数据成员初始化,需要在外进行,格式错。
[修改]int A::x=20;
第2题#include<iostream.h>
class Aton
{int X,Y;
protected:
int zx,zy;
public:
void init(int i,int j){zx=i;zy=j;}
Aton(int i,int j,int n=0,int m=0)
{X=i,Y=j,zx=m,zy=n;
}
};
void main()
{Aton A(25,20,3,5);
A.init(5,9);
cout<<A.X<<endl;
【正确答案】int X,Y;因为X,Y都是私有的,在类外无法直接访问。
[修改]public:int X,Y;
第3题#include<iostream.h>
void main()
{int i(3),j(8);
int*const p=&i;
cout<<*p<<endl;
p=&j;
cout<<*p<<endl;
}
【正确答案】int*const p=&i;在指针变量前加const表示一个常指针即地址不能变化,它指向的变量不能改变且定义时必须设置指向变量或对象的地址。
[修改]int*p=&i;
第4题#include<iostream.h>
class A
{int i;
public:
virtual void fun()=0;
A(int a)
{i=a;}
};
class B:public A
{int j;
public:
void fun()
{cout<<"B::fun()\n";}
B(int m,int n=0):A(m),j(n){}
};
void main()
{A*pa;
B b(7);
pa=&b;
}
【正确答案】B(int m,int n=0):A(m),j(n){}因为基类是抽象类,不能被实例化,所以在派生类中不能调用初始化基类对象。所以B(int m,int n=0):A(m),j(n){}错误,删去A(m)。
[修改]B(int m,int n=0):j(n){}
第5题#include<iostream.h>
class fract
{private:
int den;
int num;
public:
fract(int d=0,int n=1):den(d),num(n){}
friend fract&operator+=(fract&,fract&);
void show(){cout<<den<<?/?<<num;}
};
friend fract&operator+=(fract&f1,fract&f2)
{f1.den=f1.den*f2.num+f1.num*f2.den;
f1.num*=f2.num;
return f1;
}
void main()
{fract fr(3,4);
fr+=fract(5,7);
fr.show();
cout<<endl;
}
【正确答案】friend fract&operator+=(fract&f1,fract&f2)定义函数时,不能用friend修饰。
[修改]fract&operator+=(fract&f1,fract&f2)
四、完成程序题(本大题共5小题,每小题4分,共20分)
第1题先为数组a输满数据,再为x输入一个数据,在数组a中找出第一个与x相等的元素并将其下标输出,若不存在这样的元素,则输出"Not found!"标志。
#include<iostream.h>
void main()
{int i,x,a[10];
cout<<"输入数组中的10个数据:";
for(i=0;i<10;i++)
cin>>a[i];
cout<<endl<<"输入要查找的一个数据:";
cin>>x;
cout<<x<<endl;
for(i=0;i<10;i++)
if(_____)break;
if(_____)
cout<<x<<"在数组中的位置是:"<<x<<endl;
else
cout<<"Not found!\n"<<endl;
}
【正确答案】a[i]==x,i<10
[解析]在for循环中没有使用{},所以for只有一条语句组成的循环体。只有在找到该数据的情况下,强制退出循环,所以第一个判断是a[i]==x;第二个也是判断它是不成立时输出Not found!,另外成立条件就是i<10,没有超出数组范围。
第2题功能用冒泡法对数组a中的整数由小到大进行排序。
#include<iostream.h>
void sort(int b[],int n)
{int i,j=0,t;
for(i=1;i<n;i++)
{for(j=0;________;j++)
{if(b[j]>b[j+1])
{t=b[j];________;b[j+1]=t;}
}
}
}
void main()
{int a[]={3,2,7,1,19,6,2,8};
int i;
for(i=0;i<8;i++)
cout<<a[i]<"";
cout<<endl;
sort(a,8);
for(i=0;i<8;i++)
cout<<a[i]<<"";
cout<<endl;
}
【正确答案】j<n-i,b[j]=b[j+1]
[解析]由t=b[j];;b[j+1]=t;可知相邻元素交换,所以第二个空为b[j]=b[j+1],两次循环分别控制外层循环的次数,内层循环的次数,由冒泡排序的算法可知第一空应填入j<n-i。
过程:i=1时内层循环应该是7(0~n-i)次,即8个数需要比较7次大数至于a[7]。
i=2时内层循环应该是6次,即余7个数需要比较6次大数至于a[6]。
所以答案为b[j]=b[j+1]和j<n-i。
第3题完成下面类中成员函数的定义。
#include<iostream.h>
template<class T>
class f
{private:
T x,y,s;
public:
f(T a=0,T b=0){x=a;y=b;}
void sum()
{s=x+y;}
T gets();
};
template<class T>
________gets()
{
return s;
}
void main()
{______a(1.5,3.8);
a.sum();
cout<<a.gets()<<endl;
}
【正确答案】T f<T>::gets(),f<double>
[解析]定义模板函数的格式。定义模板类时要指出它的类型。
第4题请在下面程序的横线处填上适当内容,以使程序完整,并使程序的输出为:
11,10
13,12
#include<iostream.h>
class A
{int a;
public:
A(int i=0){a=i;}
int Geta(){return a;}
void show(){cout<<a<<endl;}
};
class B
{A a;
int b;
public:
B(int i,int j)_________
{}
void show(){cout<<a.Geta()<<","<<b<<endl;}
};
void main()
{B b[2]={B(10,11),B(12,13)};
for(int i=0;i<2;i++)
__________
}
【正确答案】:a(j),b(i),b[i].show();
[解析]在构造函数中对数据成员初始化,从结果先输出a,后b,所以对a=j,b=i;在循环中输出成员,调用show成员。
第5题有一字符串,包含n个字符。写一函数,将此字符串中从第m个字符开始的全部字符复制成为另一个字符串。
#include<iostream>
using namespace std;
void copystr(________)
{int n=0;
while(n<m-1)
{n++;
p1++;
}
while(*p1!=?0?)
{*p2=*p1;
p1++;
p2++;
}
*p2=?0?;
}
void main()
{int m;
char str1[20],str2[20];
cout<<"输入字符串1:";
__________
cout<<"输入从m个字符开始复制:";
cin>>m;
if(strlen(str1)<m)
cout<<"输入超过str1的长度"<<endl;
else
{copystr(str1,str2,m);
cout<<"复制的字符串是:"<<str2<<endl;
}
}
【正确答案】char*p1,char*p2,int m,gets(str1);
p,q都是字符指针,从m位置取字符。所以char*p1,char*p2,int m。cin.get(str1,20),不要使用cin,因为cin把空格也作为结束符了,这样导致str1不能有空格。
五、程序分析题(本大题共2小题,每小题5分,共10分)
第1题给出下面程序输出结果。
#include<iostream.h>
class a
{public:
a(int i=10){x=i;cout<<"a:"<<x<<endl;}
int x;
};
class b:public a
{public:
b(int i):A(i){x=i;cout<<"b:"<<x<<","<<a::x<<endl;}
private:
a A;
int x;
};
void main()
{b B(5);
}
【正确答案】a:10
a:5
b:5,10
[解析]定义对象B,先调用基类构造函数,在b构造函数中使用的是A(i),注意大小写,不是a(i),也就是说调用基类的构造函数时没有实参值,所以采用默认值;在初始化类成员A,即A(i),i=5,所以输入为a:5;最后是b类的构造函数,x=5,来自基类x=10,输出b:5,10。
第2题给出下面程序输出结果。
#include<iostream.h>
class Bas
{private:
int a;
public:
void set(int x)
{a=x;}
void show()
{cout<<"a="<<a<<",";}
};
class Der:public Bas
{private:
int b;
public:
void set(int x,int y=0)
{Bas::set(x);b=y;}
void show()
{Bas::show();cout<<"b="<<b<<endl;}
};
void main()
{Der b;
b.set(20);
b.show();
b.set(10,30);
b.show();
}
【正确答案】a=20,b=0
a=10,b=30
[解析]调用基类函数使用形式:类名::成员。
六、程序设计题(本大题共1小题,共10分)
第1题编写一个时间类,实现时间的加、减、读和输出。
#include<time.h>
#include<iostream.h>
#include<string.h>
#include<stdlib.h>
class Time
{public:
Time(char*s=NULL);
void operator+(Time&ti);
void operator-(Time&ti);
void Display();
protected:
int hour;
int minute;
int second;
};
result[0]=?0?+hour%10;
result[1]=?0?+hour/10;
result[3]=?0?+minute%10;
result[4]=?0?+minute/10;
result[6]=?0?+second%10;
result[7]=?0?+second/10;
cout<<result<<endl;
}
void main()
{Time a;
Time b("02:15:30");
a+b;
a.Display();
}
"/>
【正确答案】Time::Time(char*s)
{char str[9]={0};
char t[3]={0};
if(s)
strncpy(str,s,8);
else
_strtime(str);
hour=atoi(strncpy(t,str,2))%24;
minute=atoi(strncpy(t,&str[3],2))%60;
声明:
(一)由于考试政策等各方面情况的不断调整与变化,本网站所提供的考试信息仅供参考,请以权威部门公布的正式信息为准。
(二)本网站在文章内容来源出处标注为其他平台的稿件均为转载稿,免费转载出于非商业性学习目的,版权归原作者所有。如您对内容、版权等问题存在异议请与本站联系,我们会及时进行处理解决。