一、 分析
1、写出下面程序的输出结果:
# include
class FunArray{
int *pa; //指向一个数组空间
int size; //数组元素个数
public:
FunArray(int a[ ],int thesize):pa(a),size(thesize){ }
int Size( ){return size;}
int& operator[ ](int index){return pa[index-1];}
};
void main( ){
int s[ ]={3,7,2,1,5,4};
FunArray ma(s,sizeof(s)/sizeof(int));
ma[3]=9;
for(int i=1;i<=ma.Size( );i++) cout<<><>< p="">
}
答案:3,7,9,1,5,4,
2、写出下面程序的输出结果:
# include
template
class Tclass{
T x,y;
public:
Tclass(T a,T b):x(a){y=b;}
Tclass(T a){y=(T)0,x=a;}
void pr( ){
char c;
c=(y>=(T)0?′+′:′-′);
cout<<><><(y>(T)0? y:-y)<<″i″<<>< p="">
}
};
void main( ){
Tclassa(10.5,-5.8);
a.pr( );
Tclassb(10);
b.pr( );
}
答案:10.5-5.8i 10+0i
二、 完成
3、在下面程序横线处填上适当内容,以使该程序执行结果为:
12
88
# include
template
class Tany{
public:
;
void pr(){
if(sizeof(int)==sizeof x)
count<<(x>y? x:y)<<>< p="">
else
cout<<(x>y? y:x)<<>< p="">
}
};
void main( ){
Tanydobj={12.0,88.0};
dobj.pr( );
Tany iobj={12,88};
iobj.pr( );
}
答案:T x,y
4、在下面的横线处填上适当内容,使程序完整。
# include<iostream.h>
# include<math.h>
class loc{
private:
float x,y;
public;
loc()
{float x1,float y1;
x=x1;
y=y1;
}
float getx( ){return x;}
float gety( ){return y;}
② float dis(loc&,loc&);
};
float loc::dis(loc&a,loc&b)
{
flost dx=a.x-b.x;
flost dy=a.y-b.y;
return sqrt(dx*dx+dy*dy);
}
void main( )
{
loc pl(3.5,4.5),p2(5.5,6.5);
float d=loc::dis(p1,p2);
cout<<“The distance is”<<d;
}
答案:static
5、在下面程序中的横线处填上适当内容,使程序完整。
# include
class vehicle
{
protected:
int size;
int speed;
public;
void setSpeed(int s){speed=s;}
virtual int getSpeedLevel( ){return speed/10;}
};
class car:public vehicle
{
public:
int getSpeedLeve( ){return speed/5;}
};
class truck:public vehicle
{
public:
int getspeedLevel( ){return speed/15;}
};
int maxSpeedLevel(vehicle &v1 ,vehicle )
{
if(v1.getSpeedLevel( )>v2.getSpeedLevel( ))
return 1;
else
reutrn 2;
}
void main()
{
turck t;
car c;
t.setSpeed(130);
c.setSpeed(60);
cout<<><>
}
答案:&v2
6、在下面横线处填上合适内容,完成类B的定义。
# include
class A{
public:A( ){a=0;}
A(int i){a=i;}
void print( ){cout<<><>< p="">
private:int a;
};
class B:public A{
public:B( ){b1=b2=0}
B(int i){b1=i;b2=0;}
B(int i,int j,int k): {b1=j;b2=k;}//使a的值为i
void print( ){A::print( );cout<<><><><>< p="">
private:int b1,b2;
}
答案:A(i)
7、根据注释在空白处填写适当内容。
class Location{
private:
int X,Y;
public:
void init(int initX,int initY);
int GetX( );
int GetY( );
};
void Location::init(int initX,int initY)
{
X=initX;
Y=initY;
}
int Location::GetX( )
{
reutrn X;
}
int Location::GetY( )
{
reutrn Y;
}
# include
void main( )
{
Location A1;A1.init(20,90);
Location &rA1 =A1;//定义一个指向A1的引用rA1
//用rA1在屏幕上输出对象A1的数据成员X和Y的值
}
答案:cout<
三、 改错
8、下面的类定义有一处错误,请用下横线标出错误所在行并改正错误。
class A{
int a;
public;
A(int aa):a=aa{ }
};
答案:第4行有错“:a=aa”有错,应改为“:a(aa)”或等价的写法
9、下面的程序先把字符串“Look out!”输出到一个文件中,然后再从该文件输入,并显示在屏幕上,显示效果为Look out!。程序中有一处错误,请用下横线标出错误所在行,并给出更改意见。
# include
void main(){
ofstream outf(“D:\\tem.dat”,ios::trunc);
outf<<“Look out!”;
outf.close( );
ifsteam inf(“D:\\tem.dat”);
char k[20]; inf>>k; count<<>< p="">
inf.close( );
}
答案:第7行错,应改为:char k;while(inf.get(k)) cout<
10、下面的程序有一处错误,请用下横线标出错误所在行并改正错误。
# include
class Test{
public;
static int x;
};
int x=20;//对类成员初始化
void main ( )
{
cout<<>< p="">
}
<>
答案:程序中第6行错误,该行应为: int Test::x=20
11、下面的程序类B的定义中有一处错误,请用下横线标出错误所在行并说明错误原因。
# include
# include
class A{
public:A(const char *nm){strcpy(name,nm);}
private:char name[80];
};
class B:public A{
public:B(const char *nm):A(nm){ }
void PrintName( )const;
};
void B:: PrintName( )const{
cout<<“name:”<<><>< p="">
}
void main( ){
B b1(“wang li”);
b1.PrintName( );
}
答案:第12行有错,因为在类B中,name是由类A私有成员继承来的,不能被派生类访问。
12、用下横线标出下面程序main函数中的错误所在行,并说明错误原因。
# include
class Location{
private:
int X,Y;
public;
void init(int initX,int initY);
int sumXY( );
};
void Location::init(int initX,int initY)
{
X=initX;
Y=initY;
}
int Location::sumXY( )
{
return X+Y;
}
void main( )
{
Location A1;
int x,y;
A1.init(5,3);
x=A1.X;y=A1.Y;
cout<<><” p=""><><>
}
答案:第24行语句x=A1.X;y=A1.Y;有错,因为main函数不能访问对象A1的私有成员。
四、 填空
13、 重载“<<”操作符时,应声明为 ____ 函数。
答案:友元
14、 在C++中,编译指令都是以____________(符号)开始。
答案:#
15、假定要把aa定义为AB类中的一个引用整数型数据成员,则定义语句为____________。
答案:int &aa
16、C++支持两种多态性,编译时的多态性和____________时的多态性。
答案:运行
17、假定用户为类AB定义了一个构造函数“AB(int aa=0):a(aa){}”,则定义该类的对象时,可以有____________种不同的定义格式。
答案:2
18、若p指向x,则____________与x的表示是等价的。
答案:*p
19、C++的流库预定义了4个流,它们是cin、cout、cerr和____________。
答案:clog
20、当函数参数表用____________保留字表示时,则表示该参数表为空。
答案:void
21、每个对象都是所属类的一个____________。
答案:实例
22、作为类的成员函数重载一个运算符时,参数表中只有一个参数,说明该运算符有____________个操作数。
答案:2
23、设函数max是由函数模板实现的,并且max(3.5,5)和max(10,5)都是正确的函数调用,则该模板具有______个类型参数。
答案:2
24、在单继承和多继承方式中,面向对象的程序设计应尽量使用______继承。
答案:单一(或单)
25、语句序列
ifstream datafile;
datafile.open(“data.dat”);
的功能可用一个语句实现,这个语句是______。
答案:ifstream datafile(“data.dat”)
26、将关键字const写在函数头之后,函数体之前,说明该函数是一个const成员函数。此时const不是指定函数的返回值,而是修饰______指针。
答案:this
27、一个抽象类的派生类可以实例化的必要条件是实现了所有的______。
答案:纯虚函数
28、在C++中,虚函数帮助实现了类的______性。
答案:多态
29、通过C++语言中类的______,可以扩充和完善已有类以适应新的需求。
答案:继承机制
30、为了在对象生存期结束时释放其指针成员所指向的动态存储空间,通常需要为该类定义______。
答案:析构函数
31、在联合中,所有数据成员具有______的地址,任一时刻只有一个数据成员有效。
答案:相同
32、在已经定义了整型指针ip后,为了得到一个包括10个整数的数组并由ip所指向,应使用语句______。
答案:ip = new int[10];
一、 分析
1、当从键盘上输入1.510时,写出下面程序的执行结果。
#include<iostream.h>
void mian()
{
int a,b,c;
char ch;
cin>>a>>ch>>b>>c;//从键盘上输入1.510
cout<<a<<endl<<ch<<endl<<b<<endl<<c;
}
输出为:
答案:1 . 5 10
2、写出下面程序的输出结果。
#include
class FUN{
friend ostream& operator <<(ostream&,FUN);
}fun;
ostream& operator<<(ostream& os,FUN f){
os.setf(ios::left);
return os;
}
void main()
{
cout<<><><><>< p="">
cout<<><><><>< p="">
}
输出为:
答案:* * * * * 12345 54321 * * * * *
二、 完成
3、在下面程序段横线处填上适当的内容。
class A{
________
int n;
public:
A(int nn=0):n(nn){
if(n==0)a=0;
else a=new int[n];
}
~A(){delete[]a;} //定义析构函数,释放动态数组空间
};
答案:int *a;
4、在下面程序横线处填上适当内容,使程序执行结果为:
200_ _ 100
程序如下:
#include
template <class T>
Tf(Tx,Ty){
if(sizeof(T)==__________)
return x+y;
else
return x*y;
}
void main(){
cout <<><><><>< p="">
}
答案:sizeof(double)
5、下面程序三次调用同一函数sum,在横线处填上适当内容,使输出结果为:
S=2
S=5
S=9
程序如下:
#include
void sum(int i)
{
static int s;
s+=2+i;
cout<<″S=″<<><>< p="">
}
void main (void)
{
int i;
for (i=0;________)
sum(i);
}
答案:i<3;i++
6、请在下面横线处填上适当的内容,使程序的输出为:
7.00000
7
程序如下:
#include
viod main(){
double x=7;
cout<<><>
cout<<><><>< p="">
}
答案:resetiosflags(ios::showpoint)
7、在下面程序横线处填上适当的内容,使该程序输出结果为:
Creating B
end of B
end of A
程序如下:
#include
class A
{
public:
A(){}
virtual ~A() {cout<<″end of A″<<>< p="">
};
calss B:public A
{
public:
B(){________}
~B(){cout<<″end of B″<<>< p="">
};
void main()
{
A*pa=new B;
delete pa
}
答案:cout<<”creating B”<
三、 改错
8、此类定义有一处错误,请指出错误并改正。
class ABC{
int a;
public:
ABC(int aa)a(aa){}
};
答案:ABC(int aa)与a(aa){}之间少一个冒号,应改为ABC(tnt lla):a(aa){}
9、下面程序通过调用函数模板实现计算两个正整数的最大公约数,把main函数中错误找出并改正过来。
#include
template
T gcd(Tx,Ty){
while(x! =y)
if(x>y)x-=y;
else y-=x;
return x;
}
void main()
{
int a;
double d;
cin>>a>>d;
cout<<><>< p="">
}
答案:main函数中的gcd(a,d)改为gcd(a,(int)d) (或把double d;改为int ; 或把gcd(a,d)改为gcd<int>(a,d)或把gcd(a,b)改为gcd(a,int (a))=
10、指出下面程序中的错误,并说明出错原因。
#include
class ConstFun{
public:
void ConstFun(){}
const int f5()const{return 5;}
int Obj() {return 45;}
int val;
int f8();
};
int ConstFun::f8(){return val;}
void main()
{
const ConstFun s;
int i=s.f5();
cout<<″Value=″<<><>< p="">
}
答案:程序中第4行“void ConstFun(){}”错误,因为声明构造函数时不能指定返回类型。
11、指出下面程序中的错误,并说明错误原因。
#include
class A{
public:void fun(){cout<<″a.fun″<<>< p="">
};
class B{
public:void fun(){cout<<″b.fun″<<>< p="">
void gun(){cout<<″b.gun″<<>< p="">
};
class C:public A,public B{
private:int b;
public:void gun(){cout <<″c.gun<<″endl;}
};
void main(){
c obj;
obj.fun();
obj.gun();
}
答案:第15行 obj.fun();语句错误,因为用C类的对象obj对函数fun()的访问是两义的,应使用成员名限定来消除两义性。
12、指出下面程序段中的错误,并说明出错原因。
class Location {
int X,Y;
protected:
int zeroX,zeroY;
int SetZero(int zeroX,int zeroY){X=zeroX;Y=zeroY;}
private:
int length,height;
public:
float radius;
void init(int initX,int initY){length=initX;height=initY;}
int GetX(){return X;}
int GetY(){return Y;}
};
int main(){
Location retangleA={25,20,3,5,6,7,3};
return 0;
}
答案:location retangleA={25,20,3,5,6,7,3};语句错误,因为数据成员不都是公有成员,不能用初始化列表初始化
四、 填空
13、 在用C++进行程序设计时,最好用___________________代替malloc。
答案:new
14、 函数模板中紧随template之后尖括号内的类型参数都要冠以保留字________________。
答案:class
15、 在ios类中定义的用于控制输入输出格式的枚举常量中,用于代表十进制、八进制和十六进制的3个枚举常量是dec、oct和___________________。
答案:hex
16、 如果重载了运算符+,则相应的运算符函数名是___________________。
答案:operator+
17、 由static修饰的数据成员为该类的所有对象___________________。
答案:共享
18、 为了实现多态性,派生类需重新定义基类中的___________________。
答案:虚函数
19、 编译时的多态性通过___________________函数实现。
答案:重载
20、 在派生类中实现基类成员的初始化,需要由派生类的构造函数调用_________________来完成。
答案:基类的构造函数
21、 在C++中,访问指针所指向的对象的成员使用运算符___________________。
答案:->
22、 重载函数在参数类型或参数个数上不同,但___________________相同。
答案:函数名
23、 模板定义中标识类型的参数必须用关键字_________修饰。
答案:class(或typcname)
24、 假定用户没有给一个名为AB的类定义析构函数,则系统自动给出的缺省析构函数定义为__________。
答案:~AB(){}
25、 表达式count<<hex还可表示为_________。
答案:cout,sctf(ios::hex,ios::basefield)
26、 通过C++语言中的_________机制,可以从现存类中构建其子类。
答案:继承(或派生)
27、 要在调用虚函数的时候强制进行静态联编,可以通过在调用中对虚函数加_________实现。
答案:域名限制(或其它含义等价的描述)
28、 封装要求一个对象应具备明确的功能,并具有_________以便和其它对象相互作用。
答案:接口〈或界面.或公有成员〉
29、 在删除一个动态对象时,将自动调用该动态对象所属类的_________函数。
答案:析构
30、 静态成员函数、友元函数、构造函数和析构函数中,不属于成员函数的是_________。
答案:友元函数
31、在下面的类定义中,私有成员有_________。
class Location {
int X,Y;
protected:
int zeroX,zerxY;
int SetZero(intzeroX, intzeroY);
private:
int length,height;
public:
void init(int initX,int initY);
int GetX();
int GetY();
};
答案:X,Y,length,height
32、类的私有成员只能被它的成员函数和_________访问。
答案:友元类(或友元函数,或友元)
一、 分析
1、#include <iostream.h>
void main( )
{
int *a;
int *&p=a;
int b=10;
p=&b;
cout<<*a;
}
输出为:
答案:10
2、#include
template
Tf(T*a,T*b,int n){
Ts=(T)0;
for(int i=0;i<>< p="">
s+=a*b;
return s;
}
void main()
{
double c [5]={1.1,2.2,3.3,4.4,5.5},d[5]={10.0,100.0,1000.0};
cout<<><>< p="">
}
输出为:
答案:3531
二、 完成
3、在下面横线处填上适当字句,完成类中成员函数的定义。
class A{
int * a;
public:
A(int aa=0) {
a=new int(aa);//用aa初始化a所指向的动态对象
}
~A(){_________;}//释放动态存储空间
};
答案:delete a
4、下面是一个函数模板,用于计算两个向量的和。在下面横线处填上适当字句,完成函数模板定义。
#include
template
T* f(T* a,T* b,int n)
{
T* c=_________;
for(int i=0;i<>< p="">
c=a+b;
return c;
}
void main()
{
int a[5]={1,2,3,4,5},b[5]={10,20,30,40},*p;
p=f(a,b,5);
for(int i=0;i<5;i++)
cout<<><>< p="">
}
答案:new int[n]
5、下面是一个用户口令检查程序,在横线处填上适当语句完成程序功能。
#include
#include
const char *PASS=″wolleh″;//定义由PASS指针所指向的口令wolleh。
void main()
{
char user[10];//用于存放输入的口令
cout<<″please input your password:″<<>< p="">
_________//输入口令
if((strcmp(user,PASS))==0)
cout<<″your password is correct″<<>< p="">
else
cout<<″your password is error″<<>< p="">
}
答案:cin>>user;
6、下面是类fraction(分数)的定义,其中重载的运算符<<以分数形式输出结果,例如将三分之二输出为2/3。在横线处填上适当字句。
class fraction{
int den; //分子
int num; //分母
friend ostream& operator<<(ostream&,fraction);
…
};
ostream& operator <<(ostream& os,fraction fr){
os<<fr.den<<′/′<<fr.num;
return _________;
}
答案:os
7、在下面程序横线处填上适当的字句,使其输出结果为0,56,56。
#include <iostream.h>
class base{
public:
在下面程序横线处填上适当的字句,使其输出结果为0,56,56。
#include <iostream.h>
class base{
public:
_________func( ){return 0;}
};
class derived:public base{
public:
int a,b,c;
_________ setValue(int x,int y,int z){a=x;b=y;c=z;}
int func( ){return(a+b)*c;}
};
void main()
{
base b;
derived d;
cout<<b.func( )<<′,′;
d.setValue(3,5,7);
cout<<d.func( )<<′,′;
base& pb=d;
cout<<pb.func( )<<end1;
}
func( ){return 0;}
};
class derived:public base{
public:
int a,b,c;
_________ setValue(int x,int y,int z){a=x;b=y;c=z;}
int func( ){return(a+b)*c;}
};
void main()
{
base b;
derived d;
cout<<b.func( )<<′,′;
d.setValue(3,5,7);
cout<<d.func( )<<′,′;
base& pb=d;
cout<<pb.func( )<<end1;
}
答案:void
三、 改错
8、指出下面程序段中的错误,并说明出错原因。
class A{
int a,b;
public:
A(int aa,int bb) {a=aa;b=bb;}
};
Ax(2,3),y(4);
答案:Ax(2,3),y(4);语句出错,因为没有单参数的构造函数(或者y(4)少写了一个参数)。
9、指出并改正下面利用类模板的对象定义中的错误。
template
class Tany{
T x,y;
public:
Tany(T a,T b){x=a,y=b;}
T sum( ){return x+y;}
};
Tany (int) obj(10,100);
答案:Tany(int) obj(10,100);出错,应为Tany obj(10,100);语句。
10、指出下面程序段中的错误,并说明出错原因。
class one{
private:
int a;
public:
void func(two&);
};
class two{
private:
int b;
friend void one::func(two&);
};
void one::func(two& r)
{
a=r.b;
}
答案:void func(two&);出错,two尚未声明(或应在class one前加声明语句class two;)。
11、指出下面程序段中的错误,并说明出错原因。
#include
class A{
public:void fun( ){cout<<″a.fun″<<>< p="">
};
class B{
public:void fun( ){cout<<″b.fun″<<>< p="">
void gun( ){cout<<″b.gun″<<>< p="">
};
class C:public A,public B{
private:int b;
public:void gun( ){cout<<″c.gun″<<>< p="">
void hun( ){fun( );}
};
答案:void hun(){fun();}出错,C::fun()有二义性。
12、指出下面程序段中的错误,并说明出错原因。
class Location {
int X,Y=20;
protected:
int zeroX,zeroY;
int SetZero(int ZeroX,int ZeroY);
private:
int length,height;
public:
float radius;
void init(int initX,int initY);
int GetX( );
int GetY( );
};
答案:int X,Y=20;出错,不能采用这种方式初始化。
四、 填空
13、 对象的四大基本特性是多态性、继承性、______和封装性。
答案:抽象性
14、 为了使类中的成员不能被类外的函数通过成员操作符访问,则应把该成员的访问权限定义为______。
答案:private
15、 C++程序的源文件扩展名为______。
答案:cpp
16、 所有模版都是以______关键字和一个形参表开头的。
答案:template
17、 定义类的动态对象数组时,系统只能够自动调用该类的_________构造函数对其进行初始化。
答案:无参
18、 在C++程序设计中,建立继承关系倒挂的树应使用_________继承。
答案:单
19、 表达式cout<<end1还可表示为_________。
答案:cout<<′\n′
20、 基类的公有成员在派生类中的访问权限由_________决定。
答案:访问控制
21、 C++支持的两种多态性分别是编译时的多态性和_________多态性。
答案:运行时的(或动态,或虚函数)
22、 C++中语句const char * const p=″hello″;所定义的指针p和它所指的内容都不能被_________。
答案:改变(或重新赋值)
23、 假定AB为一个类,则语句AB(AB&x);为该类_________构造函数的原型说明。
答案:复制初始化(或拷贝)
24、 将关键字const写在成员函数的函数头和_________之间时,所修饰的是this指针。
答案:函数体
25、 在C++中,访问一个对象的成员所用的运算符是成员选择运算符,访问一个指针所指向的对象的成员所用的运算符是_________。
答案:成员访问运算符(或“->”)
26、 派生类从一个或多个以前定义的该类的_________继承数据和函数。
答案:基类
27、 在#include命令中所包含的头文件,可以是系统定义的头文件,也可以是______定义的头文件。
答案:用户
28、 一个const对象只能访问______成员函数。
答案:const
29、 C++是通过引用运算符______来定义一个引用的。
答案:&
30、 若y是x的引用,则对y的操作就是对______的操作。
答案:x
31、执行______操作将释放由p所指向的动态分配的数据空间。
答案:delete p
32、C++的流库预定义了4个流,它们是cin、cout、______和clog。
答案:cerr