一、单项选择题 (在每小题列出的四个备选项中只有一个是符合题目要求的。) 15. 对于类定义
class A
{public:virtual void func1(){}
void func2(){}
};
class B:public A
{public:void func1(){cout<<"class B func 1"<<endl;}
virtual void func2(){cout<<"class B func 2"<<endl;}
};
下面正确的叙述是
A.A::func2()和B::func1()都是虚函数 B.A::func2()和B::func1()都不是虚函数 C.B::func1()是虚函数,而A::func2()不是虚函数 D.B::func1()不是虚函数,而A::func2()是虚函数
A B C D
C
[解析] 本题主要考查的知识点为虚函数。 [要点透析] 基类定义了虚函数,在派生类中只要有同样的函数(返回值相同,函数名相同,形参个数相同,类型相同),即使没有virtual修饰,该函数也是虚函数。基类func1是虚函数,与派生类func1相同,所以派生类fune1也是虚函数。func2在基类中是普通函数,在派生类中是虚函数。
二、填空题 1. 使用C++标准类库时,用于指定相应命名空间的语句是______。
2. C++类的______函数名与类名称一样,且没有返回值。
3. 执行代码:
int a=96;
cout<<hex<<a;
程序的输出结果是______。
4. 假定AB为一个类,则语句AB(int i=0);为该类______函数的原型说明。
5. 定义类的动态对象数组时,系统只能够自动调用该类的______构造函数对其进行初始化。
6. 假设类X的对象X是类Y的成员对象,则“Y Obj'’语句执行时,先调用类______的构造函数。
7. C++中语句const char*const p=“hello”;所定义的指针p和它所指的内容都不能被______。
8. 带有纯虚函数的类称为抽象类,它只能作为______来使用。
9. C++函数中传递对象地址值是使用______作为参数。
10. 在C++程序设计中,建立继承关系倒挂的树应使用______继承。
11. 基类的公有成员在派生类中的访问权限由______决定。
12. 采用私有派生方式,基类的public成员在派生类中是______成员。
13. 派生的新类同时可以增加或重新定义数据和操作,这称为类的______性。
14. 声明一个常成员函数Fun,其返回类型为char,第一个参数类型为int,第二个参数类型为double,函数Fun的声明原型是______。
char Fun(int,double)const;
15. 若将一个二元运算符重载为类的成员函数,其形参个数应该是______个。
16. C++中istream的直接基类是______。
17. C++程序是从______函数开始执行的。
18. C++语言中可以实现输出一个换行符并刷新流功能的操控符是______。
19. UML中对象之间的静态关系是通过对象属性之间的连接反映的,称之为______。
20. 设置ios_base::right的含义是______。
三、改错题 1. #include<iostream.h>
template<class T>
class A
{private:
T x,y,s;
public:
A(T a,T b)
{x=a,y=b;s=x+y;}
void show()
{cout<<"x+y="<<s<<endl;
};
void main()
{A add(10,100);
add.show();
}
A add(10,100);类模板的使用,参数实例化后生成模板类。用类模板定义对象时要指定参数类型。应改为A<int>add(10,100);。
2. #include<iostream.h>
class T
{protected:
int p;
public:
T(int m){p=m;}
};
void main()
{T a(10);
cout<<a.P<<endl;
}
protected:保护类型的成员,不能在类外访问。应改为public:。
3. #include<iostream.h>
class Bas
{public:
~Bas(){cout<<"Bas construct"<<endl;}
virtual void f()=0;
};
class Dev:public Bas
{public:
~Dev(){cout<<"Bas construct"<<endl;}
virtual void f(){cout<<"Dev::f"<<endl;}
};
void main()
{ Bas*a=new Bas();
Dev p;
a=&p;
a->f();
}
Bas*a=new Bas();抽象类不能被实例化,但可以声明指针或引用,所以不能用new,因为new产生临时对象。应改为Bas*a;。
4. #include<iostream.h>
class A
{private:
int a;
public:
void func(B &);
A(int i){a=i;}
};
class B
{private:
int b;
friend void A::func(B &);
public:
B(int i){b=i;}
};
void A::func(B&r)
{ a=r.b;
cout<<a<<endl;
}
void main()
{ B bt(3);
A at(10);
at.func(bt);
}
void func(B &);类A中使用类B的对象,故应增加对类B的声明。应在class A前增加class B;。
5. #include<iostream.h>
void f(int*a,int n)
{int i=0,j=0;
int k=0;
for(;i<n/2;i++)
{k=a[i];
a[i]=a[n-i-1];
a[n-i-1]=k;
}
}
void show(int a[],int n)
{for(int i=0;i<n;i++)
cout<<a[i]<<" ";
cout<<endl;
}
void main()
{int p[5];
int i=0,n=5;
for(;i<5;i++)
{p[i]=i;}
f(*p,n);
show(p,n);
}
f(*p,n);f函数第一个参数是指针而调用时使用*p,*p表示p所指向的变量或对象,不是地址即不是指针。应改为f(p,n);。
四、完成程序题 1. 为使下面程序输出结果为:
1*0=0
3*4=12
请在横线处填上适当的语句,以使程序完整。
#include<iostream.h>
class A
{private:
int R1,R2;
public:
A(int r1=5,int r2=0){______}
void show();
};
void A::show()
{______}
void main()
{A a(1);
A b(3,4);
a.show();
b.show();
}
R1=r1:R2=r2: cout<<R1<<"*"<<R2 <<"="<<R1*R2<<endl;
2. 下面程序运行的结果是:5+10=15。
#include<iostream.h>
class Test
{private:
int x,y;
public:
Test(){x=y=0;}
void Setxy(int x,int y){______}
void show(){______}
};
void main()
{Test ptr;
ptr.Setxy(5,10);
ptr.show();
}
(*this).x=x;(*this).y=y; cout<<x<<"+"<<y<<"="<<x+y<<endl;
3. 下面程序用来求直角三角形斜边长度。
#include<iostream.h>
#include<math.h>
class Point
{private:
double x,y;
______
public:
Point(double i=0,double j=0)
{x=i;y=j;}
Point(Point &p)
{x=p.x;y=p.y;}
};
class Line
{private:
Point p1,p2;
public:
Line(Point &xp1,Point &xp2):______{}
double GetLength();
};
double Line::GetLength()
{ double dx=p2.x-p1.x;
double dy=p2.y-p1.y;
return sqrt(dx*dx+dy*dy);
}
void main()
{ Point p1,p2(6,8);
Line L1(p1,p2);
cout<<L1.GetLength()<<endl;
}
friend class Line; p1(xp1),p2(xp2)
4. 完成下面类中成员函数的定义。
#include<iostream.h>
#include<iomanip.h>
class Arr
{protected:
float*p;
int n;//数组大小(元素个数)
public:
Arr(int sz=10)
{n=sz;
p=new float[n];
}
~Arr(void)
{______}
int Getn(void)const
{
return n;
}
float*operator[](int i)
{______}
void Print();
};
void Arr::Print()
{int i;
for(i=0;i<this->Getn();i++)
{if(i%10= =0)
cout<<endl;
cout<<setw(6)<<p[i];
}
cout<<endl:
}
void main()
{Arr a(20);
for(int i=0;i<a.Getn();i++)
a[i]=i*2;
a.Print();
}
5. 在下面程序横线处填上适当的语句,使其输出结果为0,15,15。
#include<iostream.h>
class base
{public:
______f(){return 0;}
};
class derived:public base
{public:
int a,b,c;
______set(int x,int y,int z){a=x;b=y;c=z;}
int f(){return a+b+c;}
};
void main()
{base b;
derived d;
cout<<b.f()<<",";
d.set(3,5,7);
cout<<d.f()<<",";
base &p=d;
cout<<p.f()<<endl;
}
五、程序分析题 1. 给出下面程序输出结果。
#include<iostream.h>
void main()
{int *p1;
int**p2=&p1;
int b=20;
p1=&b;
cout<<**p2<<endl;
}
2. 给出下面程序输出结果。
#include<iostream.h>
class Base
{private:
int Y;
public:
Base(int y=0){y=y;cout<<"Base("<<y<<")\n";}
~Base(){cout<<"~Base()\n";}
void print(){cout<<Y<<" ";}
};
class Derived:public Base
{private:
int Z;
public:
Derived(int y,int z):Base(y)
{Z=z;
cout<<"Derived("<<y<<","<<z<<")\n";
}
~Derived(){cout<<"~Derived()\n";}
void print()
{Base::print();
cout<<Z<<endl;
}
};
void main()
{Derived d(10,20);
d.print();
}
Base(10) Derived(10,20) 10 20 ~Derived() ~Base()
六、程序设计题 1. 下面Shape类是一个表示形状的抽象类,Area()为求图形面积的函数。请从Shape类派生梯形类(Trapezoid)、圆形类(Circle),三角形类(Triangle),并给出具体的求面积函数。其中,所有派生类计算面积需要用到的参数由构造函数给出,梯形面积计算需要上底、下底和高,三角形面积需要底和高,圆形面积需要半径。
形状的抽象类声明如下:
class Shape {
public:
virtual double Area()=0;
};
class Circle:public Shape { public: Cirele(double r){radius=r;} double Area()const{return 3.1416*radius*radius;} private: double radius; }; class Trapezoid:public Shape { public: Trapezoid(double top,double bottom,double high) { T=top; B=bottom; H=high; } double Area()const { return(T+B)*H*0.5; } private: double T,B,H; }; class Triangle:public Shape { public: Triangle(double bottom,double height: { B=bottom; H=height; } double Area()const { return B*H*0.5; } private: double B,H; };