 
             
	二、填空题(本大题共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;
	 
	
				声明:
				(一)由于考试政策等各方面情况的不断调整与变化,本网站所提供的考试信息仅供参考,请以权威部门公布的正式信息为准。
				(二)本网站在文章内容来源出处标注为其他平台的稿件均为转载稿,免费转载出于非商业性学习目的,版权归原作者所有。如您对内容、版权等问题存在异议请与本站联系,我们会及时进行处理解决。