欢迎访问桃李自考网,本站可为自考生提供学习指导服务,今天是

您所在的位置: 首页> 备考指导 > 历年真题 > 工学类 > 面向对象程序设计 > 全国2006年10月高等教育自学考试面向对象程序设计试题

全国2006年10月高等教育自学考试面向对象程序设计试题

发表时间:2022-07-04 12:34:39 来源:桃李自考网

全国2006年10月高等教育自学考试 

 面向对象程序设计试题
 课程代码:02328
 

一、单项选择题(本大题共12小题,每小题2分,共24分)
 在每小题列出的四个备选项中只有一个是符合题目要求的,请将其代码填写在题后的括号内。错选、多选或未选均无分。
 1.有关C++编译指令,以下叙述正确的是(        )
 A.C++每行可以写多条编译指令
 B. #include指令中的文件名可含有路径信息
 C.C++的编译指令可以以#或//开始
 D.C++中不管#if后的常量表达式是否为真,该部分都需要编译
 2.在C++中把不返回任何类型的函数应该说明为    (        )
 A. int B. char
 C. void D. double
 3.以下有关析构函数的叙述不正确的是(        )
 A.析构函数没有任何函数类型
 B.析构函数的作用是在对象被撤销时收回先前分配的内存空间
 C.析构函数可以有形参
 D.一个类只有一个析构函数
 4.若Sample类中的一个成员函数说明如下:
 voidset(Sample&a),则Sample&a的含义是(        )
 A.指向类Sample的名为a的指针
 B.a是类Sample的对象引用,用来作函数Set()的形参
 C.将a的地址赋给变量Set
 D.变量Sample与a按位与的结果作为函数Set的参数
 5.以下叙述错误的是(        )
 A.基类的保护成员在公有派生类中仍然是保护成员
 B.基类的保护成员在派生类中仍然是保护成员
 C.基类的保护成员在私有派生类中是私有成员
 D.基类的保护成员不能被派生类的对象访问
 6.假设ClassY:publicX,即类Y是类X的派生类,则说明一个Y类的对象时和删除Y类对象时,调用构造函数和析构函数的次序分别为(        )
 A.X,Y;Y,X B.X,Y;X,Y
 C.Y,X;X,Y D.Y,X;Y,X
 7.下列虚基类的说明中,正确的是(        )
 A.class virtual B:public A B.class B:virtual public A
 C.virtual class B:public A D.class B:public A virtual
 8.要实现动态联编必须(        )
 A.通过成员名限定来调用虚函数 B.通过对象名来调用虚函数
 C.通过派生类对象来调用虚函数 D.通过对象指针或引用来调用虚函数
 9.在派生类中定义虚函数时,可以与基类中相应的虚函数不同的是(        )
 A.参数类型 B.参数个数
 C.函数名称 D.函数体
 10.下列关于静态数据成员的描述中正确的是(        )
 A.静态数据成员是类的所有对象所共有的
 B.静态数据成员要在构造函数内初始化
 C.类的每个对象有自己的静态数据成员
 D.静态数据成员不能通过类的对象调用
 11.与C语言printf('Hello,World\n');语句功能相同的C++语句是(        )
 A.cout>>'Hello,World\n'; B.cout<<'Hello,World\n';
 C.cin>>'Hello,World\n'; D.cin<<'Hello,World\n';
 12.实现两个相同类型数加法的函数模板的声明是(        )
 A.add(T x,T y) B.T add(x,y)
 C.T add(T x,y) D.T add(T x,T y)
 二、填空题(本大题共8小题,每小题2分,共16分)
 请在每小题的空格中填上正确答案。错填、不填均无分。
 13.在面向对象程序设计中,将一组数据和这组数据有关的操作集合组装在一起形成对象,这个过程叫________;不同的对象可以调用相同名称的函数并导致完全不同的行为的现象称为________。
 14.假如一个类的名称为MyClass,则这个类缺省的构造函数名称为________;使用这个类的一个对象初始化该类的另一个对象时,可以调用________构造函数来完成此功能。
 15.局部对象和全局对象中,在同一程序中________生存期最长;this指针始终指向当前正在发出成员函数调用命令的________。
 16.所谓赋值兼容规则是指在公有派生情况下,一个________类的对象可以作为________类的对象来使用的地方。
 17.带有________的类称为抽象类,它只能作为________来使用。
 18.控制格式输入输出的操作中,函数________是设置域宽的,函数________是设置填充字符。(要求给出函数名和参数类型)
 19.类模板用来表达具有相同________的数据________集。
 20.对已有的运算符赋予多重含义,使同一运算符作用于不同类型的数据,称为________,它的实质就是________。
 三、改错题(本大题共5小题,每小题2分,共10分)
 21.下面类的定义中有一处错误,请用下横线标出错误所在行并说明出错原因。
 class MyClass{
 int x=20,y;
 public:
 MyClass(int aa,int bb);
 int GetX();
 int GetY();
 };
 22.以下程序实现交换a,b变量的值,请用下横线标出错误所在行并给出修改意见。
 void swap(int m,int n)
 {   int temp=m;   m=n;   n=temp;}
 void main()
 {   int a=5,b=10;
 swap(a,b);
 cout<<'a='<  }
 23.下面程序中有一处错误,请用下横线标出错误所在行并说明出错原因。
 class One{
 protected:
 int a;
 public:
 void setOne(int x){a=x;}
 void showOne(){cout<<'a='<  };
 class Two:private One{
 public:
 void setTwo(int x){a=x;}
 };
 void main()
 {  Two obj;
 obj.setTwo(10);
 cout<<'obj.a='<  }
 24.下面程序实现输出半径为2.5的圆的面积,但输出结果是0,找出原因并提出修改意见。
 class point{
 private: float x,y;
 public: float  area( ){return 0.0;}
 };
 const float pi=3.14159f;
 class circle:public point{
 private:  float radius;
 public:   void setRadius(float r){radius=r;}
 float area(){return pi*radius*radius;}
 };
 void main()
 {  point *p;
 circle c;
 c.setRadius(2.5);
 p=&c;
 cout<<'The area of circle is'<area()<  }
 25.下面程序中有一处错误,请用下横线标出错误所在行并说明出错原因。
 class A{
 int x;
 friend class B;
 };
 class B{};
 class C: public B{
 void func(A  *p);
 };
 void C::func(A *p)
 {  p->x--; }
 四、完成程序题(本大题共5小题,每小题4分,共20分)
 26.为使下列程序输出结果为:
 Y=1,Y=3,Z=5
 请在横线处填上适当的字句,以使程序完整。
 #include
 class B{
 private:
 int Y;
 public:
 B(int y=0) { Y=y; }
 void print() { cout<<'Y='<  } ;
 class D: public B{
 private:
 B b;
 int Z;
 public:
 D (int x,int y, int z):B(x),b(y)  { Z=z; }
 void print() {
 ①________;   //打印基类B中的成员Y
 ②________;   //打印类成员b中的Y值
 cout <<'Z='<  }
 };
 void main()
 {   D d(1,3,5);
 d.print();
 }
 27. 在下面横线处填上适当字句,完成求最大值函数模板的定义。
 #include
 template
 T Max(T x, T y)
 {
 return (  x>y  ?  x : y  );
 }
 ①________
 T Max(T x, T y, T z)
 {
 T t = Max(x,y);
 return ( ②________ );
 }
 void main()
 {
 int x;           double y;
 x = Max(5,6);    y = Max(12.3, 3.4, 7.8);
 cout << 'x=' << x <<  'y=' << y << endl;
 }
 28.在下面横线处填上适当字句,完成Distance函数的定义。
 #include
 #include
 class Point
 {
 private:
 double X,Y;
 public:
 Point(double x=0, double y=0) {X=x;Y=y;}
 void   Move(double x, double y) { X=x; Y=y; }
 friend double Distance(Point &p1, Point &p2); //计算两点间距
 };
 double Distance(Point &p1, Point &p2)
 {   double dx = ①________;
 double dy = ②________;
 return sqrt(dx*dx+dy*dy);
 }
 void main()
 {
 Point a(1,1);
 Point b(a);
 b.Move(4,5);
 cout << Distance(a,b) << endl;
 }
 29.为使下列程序输出结果为:
 A∷f()
 B∷f()
 C∷f()
 请在横线处填上适当的字句,以使程序完整。
 #include
 class A{
 public:
 ①________ { cout<<'A::f()\n'; }
 };
 class B:public A{
 public:
 void f() {cout<<'B::f()\n'; }
 };
 class C:public A{
 public:
 void f() {cout<<'C::f()\n'; }
 } ;
 void main()
 {
 A a,②________;
 B b;C c;
 p=&a;  p->f();
 p=&b;  p->f();
 p=&c;  p->f();
 }
 30.在下面横线处填上适当字句,完成类成员函数的定义。
 #include
 class Complex {
 private:  
 float real, imag;
 public:
 Complex(float r=0, float i=0 ) { real=r; imag=i;}
 void Display(){  
 cout << real;
 if (imag>0) cout<<'+'<  else if (imag<0) cout<  cout << endl;
 }
 Complex operator+ (Complex &b );
 friend Complex operator- ( Complex &a, Complex &b );  
 };
 Complex Complex::operator+ (Complex &b)
 {
 Complex *t = new Complex ( ①________ );  
 return *t;  
 }
 Complex operator- ( Complex &a, Complex &b )
 {
 Complex *t = new Complex ( ②________ );  
 return *t;  
 }
 void main()
 {
 Complex c1(4.0,5.0),c2(2.0,-5.0),c3;
 c3=c1+c2;
 c3.Display();
 c3=c1-c2;
 c3.Display();
 }
 五、程序分析题(本大题共6小题,每小题5分,共30分)
 31.写出下面程序的输出结果。
 #include
 #include
 int i=1;
 void other(void)
 {
 static int a=2,  b;
 int c=10;  
 a=a+1; i=i+3; c=c+5;
 cout<  b=a;
 }

void main(void)   
 {  
 static int a;
 int b=-5, c=0;
 void other(void);
 cout<<'i a b c\n';
 cout<  c=c+8;  other();
 cout<  i=i+10; other();  
 }
 32.写出下面程序的输出结果。
 #include
 class A
 {
 private:
 int  X,Y;
 public:
 A()  {
 X=Y=0;
 cout<<'Default Constructor called.'<  }
 A(int xx,int yy)  {   
 X=xx;Y=yy;     
 cout<< 'Constructor called.'<  }
 ~A() {   
 cout<<'Destructor called.'<  }
 };
 void main()
 {
 A *p1=new A;
 delete  p1;   
 p1=new A(1,2);
 delete p1;
 }
 33.写出下面程序的输出结果。
 #include
 class A {
 private: int a;
 public:
 void set( int x) { a = x; }
 void show() { cout<<'a='<  };
 class B: public A {
 private: int b;
 public:
 void set(int x=0) { A::set(x);b=x; }
 void set(int x, int y) { A::set(x); b=y; }
 void show() { A::show(); cout<<'b='<  };
 void main() {
 B b;
 b.set(12);     b.show();
 b.set(34,56);  b.show();
 }
 34.写出下面程序的输出结果。
 #include
 class A
 {
 private:const int a;
 static int b;
 public:
 A(int i):a(i),r(a) { b++; }
 void print() { cout<  const int& r;
 };
 int A::b=0;   
 void main()
 {  A a1(33);      a1.print();
 A a2(44);     a2.print();
 }
 35.写出下面程序的输出结果。
 #include
 void main(void)
 {  int n=6, k;
 cout <<  n << ' Factors ';
 for (k=2; k < n; k++)
 if (n % k == 0)
 cout << k << ' ';
 cout << endl;
 }
 36.写出下面程序的输出结果。
 #include
 class B {
 public:
 virtual int f() { return 0; }
 };
 class D: public B {
 public:
 int f() { return 100; }
 };
 void main() {
 D d;
 B& b = d;
 cout << b.f() << endl;
 cout << b.B::f() << endl;
 }

类继承基类的()
 A.部分特性,并允许增加新的特性或重定义基类的特性
 B.部分特性,但不允许增加新的特性或重定义基类的特性
 C.所有特性,并允许增加新的特性或重定义基类的特性
 D.所有特性,但不允许增加新的特性或重定义基类的特性
 3.在C++中,封装是借助什么达到的?()
 A.结构 B.类
 C.数组 D.函数
 4.建立包含有类对象成员的派生类对象时,自动调用构造函数的执行顺序依次为()
 A.自己所属类、对象成员所属类、基类的构造函数
 B.对象成员所属类、基类、自己所属类的构造函数
 C.基类、对象成员所属类、自己所属类的构造函数
 D.基类、自己所属类、对象成员所属类的构造函数
 5.类的析构函数是对一个对象进行以下哪种操作时自动调用的?()
 A.建立 B.撤消
 C.赋值 D.引用
 6.下列不是描述类的成员函数的是()
 A.构造函数 B.析构函数
 C.友元函数 D.拷贝构造函数
 7.所有在函数中定义的变量,连同形式参数,都属于()
 A.全局变量 B.局部变量
 C.静态变量 D.寄存器变量
 8.假定AB为一个类,则执行ABx;语句时将自动调用该类的()
 A.有参构造函数 B.无参构造函数
 C.拷贝构造函数 D.赋值构造函数
 9.假定AA为一个类,a()为该类公有的函数成员,x为该类的一个对象,则访问x对象中函数成员a()的格式为()
 A.x.a B.x.a()
 C.x->a D.x->a()
 10.对于任一个类,用户所能定义的构造函数的个数至多为()
 A.0 B.1
 C.2 D.任意个
 二、填空题(本大题共10小题,每小题2分,共20分)
 请在每小题的空格中填上正确答案。错填、不填均无分。
 11.对象的四大基本特性是多态性、继承性、______和封装性。
 12.为了使类中的成员不能被类外的函数通过成员操作符访问,则应把该成员的访问权限定义为______。
 13.C++程序的源文件扩展名为______。
 14.所有模版都是以______关键字和一个形参表开头的。
 15.在#include命令中所包含的头文件,可以是系统定义的头文件,也可以是______定义的头文件。
 16.一个const对象只能访问______成员函数。
 17.C++是通过引用运算符______来定义一个引用的。
 18.若y是x的引用,则对y的操作就是对______的操作。
 19.执行______操作将释放由p所指向的动态分配的数据空间。
 20.C++的流库预定义了4个流,它们是cin、cout、______和clog。
 三、改错题(本大题共2小题,每小题6分,共12分)
 21.假定下面程序将分数a和b相加,其和赋值给c并输出,要求输出结果为“13/18”,其主函数5到8行之间存在着三行语句错误,请指出错误行的行号并改正。
 #include
 classFranction{ //定义分数类
 intnume; //定义分子
 intdeno; //定义分母
 public:
 //把*this化简为最简分数,具体定义在另外文件中实现
 voidFranSimp();
 //返回两个分数*this和x之和,具体定义在另外文件中实现
 FranctionFranAdd(constFranction&x);
 //置分数的分子和分母分别0和1
 voidInitFranction(){nume=0;deno=1;}
 //置分数的分子和分母分别n和d
 voidInitFranction(intn,intd){nume=n;deno=d;}
 //输出一个分数
 voidFranOutput(){cout<  };

voidmain() //1行
{ //2行
Franctiona,b,c; //3行
a.InitFranction(7,18); //4行
b.InitFranction(1); //5行
c.InitFranction(); //6行
c=FranAdd(a,b); //7行
cout<} //9行
错误行的行号为______、______和______。
分别改正为______、______和______。
22.下面是一个类的定义,在5到12行之间有3行存在语法错误,请指出错误行的行号并改正。
classCE{ //1行
private: //2行
inta,b; //3行
intgetmin(){return(apublic //5行
intc; //6行
voidSetValue(intx1,intx2,intx3){ //7行
a=x1;b=x2;c=x3; //8行
}; //9行
intGetMin(); //10行
}; //11行
intGetMin(){ //12行
intd=getmin(); //13行
return(d} //15行

错误行的行号为______、______和______。
分别改正为______、______和______。
四、程序填空题(本大题共3小题,每小题6分,共18分)
请按提示要求完成以下程序段的填空。
23.classA{
inta,b;
public:
____(1)____//定义构造函数,使参数aa和bb的默认值为0,
//在函数体中用aa初始化a,用bb初始化b
};
main(){
A*p1,*p2;
____(2)____;//调用无参构造函数生成由p1指向的动态对象
____(3)____;//调用带参构造函数生成由p2指向的动态对象,
//使a和b成员分别被初始化为4和5
}
(1)(2)(3)
24.一种类定义如下:
#include
#include
classBooks
{
private:
charbk_name[20]; //书的名称
intprice; //书的价格
staticinttotalprice; //同类书总价格
public:
Books(char*str,intp){ //构造函数
strcpy(bk_name,str); //strcpy函数将str字符串的内容拷贝到bk_name
price=p;
totalprice+=price;
}
~Books(){totalprice-=price;}
char*GetN(){____(4)____;}//返回书名称
intGetP(){returnprice;}
____(5)____GetTotal_Price(){ //定义静态成员函数
____(6)____; //返回总价格
}
};

(4)(5)(6)
25.已知一个类的定义如下:
#include
classAA{
inta[10];
intn;
public:
voidSetA(intaa[],intnn); //用数组aa初始化数据成员a,
//用nn初始化数据成员n
intMaxA();//从数组a中前n个元素中查找最大值
voidSortA();//采用选择排序的方法对数组a中前n个元素
//进行从小到大排序
voidInsertA();//采用插入排序的方法对数组a中前n个元素进行从小到大排序
voidPrintA();//依次输出数组a中的前n个元素
};

voidAA::SortA()
{
inti,j;
for(i=0;____(7)____;i++){
intx=a[i],k=i;
for(j=i+1;jif(a[j]x=a[j];
k=____(8)____;

}
a[k]=a[i];
a[i]=____(9)____;
}
}
(7)(8)(9)
五、程序分析题(本大题共6小题,每小题5分,共30分)
阅读以下程序,写出其运行结果。
26.#include
constintN=6;
voidfun();
voidmain()
{
for(inti=1;ifun();
}
voidfun()
{
staticinta=2;
cout<<(a+=3)<<′′;
}


27.#include
#include
classfun{
friendostream&operator<<(ostream&,fun);
}ff;
ostream&operator<<(ostream&os,funf){
os.setf(ios::left);
returnos;
}
voidmain()
{
cout<cout<}
28.#include
classa
{
public:
virtualvoidfunc(){cout<<'funcinclassa'<};
classb
{
public:
virtualvoidfunc(){cout<<'funcinclassb'<};
classc:publica,publicb
{
public:
voidfunc(){cout<<'funcinclassc'<};
voidmain()
{
cc;
a&pa=c;
b&pb=c;
pa.func();
pb.func();
}

29.#include
classtesta{
public:
testa(){a1=0;}
testa(inti){a1=i;}
voidprintout(){cout<private:
inta1;
};
classtestb:publictesta{
public:
testb(){b1=0;};
testb(inti,intj,intk);
voidprintout();
private:
intb1;
testaaa;
};
testb::testb(inti,intj,intk):testa(i),aa(j){b1=k;}
voidtestb::printout(){
testa::printout();
cout<}
voidmain(){
testbtt[2];
tt[0]=testb(9,3,5);
tt[1]=testb(8,4,7);
for(inti=0;i<2;i++)
tt[i].printout();
}
30.#include
voidmain()
{
for(inti=-1;i<4;i++)
cout<<(i?′0′:′*′);
}
31.#include
classDate
{
intYear,Month,Day;
public:
voidSetDate(inty,intm,intd){Year=y;Month=m;Day=d;}
voidPrintDate(){cout<Date(){SetDate(2000,1,1);}
Date(inty,intm,intd){SetDate(y,m,d);}
};
classTime
{
intHoure,Minutes,Seconds;
public:
voidSetTime(inth,intm,ints){Houre=h;Minutes=m;Seconds=s;}
voidPrintTime(){cout<Time(){SetTime(0,0,0);}
Time(inth,intm,ints){SetTime(h,m,s);}
};
classDate_Time:publicDate,publicTime
{
public:
Date_Time():Date(),Time(){};
Date_Time(inty,intmo,intd,inth,intmi,ints):
Date(y,mo,d),Time(h,mi,s){}
voidPrintDate_Time(){PrintDate();PrintTime();}
};

voidmain()
{
Date_Timedt_a,dt_b(2002,10,1,6,0,0);
dt_a.PrintDate_Time();
dt_b.SetTime(23,59,59);
dt_b.PrintDate_Time();
dt_a.SetDate(2002,12,31);
dt_a.PrintDate_Time();
}