2015春电大《面向对象程序设计》综合习题(4)

时间:2024-04-30 10:27:50 5A范文网 浏览: 平时作业 我要投稿
面向对象程序设计综合练习(4)及答案

一、填空题:
1. 设px是指向一个类对象的指针变量,则执行 “delete px;”语句时,将自动调用该类的()。
A. 无参构造函数B. 带参构造函数C. 析构函数D. 拷贝构造函数
2. 假定AB为一个类,则执行 “AB a[10];”语句时调用该类无参构造函数的次数为()。
A. 0  B. 1  C. 9  D. 10
3. 假定AB为一个类,则执行 “AB a(2), b[3], *p[4];”语句时共调用该类构造函数的次数为()。
A. 3  B. 4  C. 5  D. 9
4. 假定AB为一个类,px为指向该类的一个含有n个对象的动态数组的指针,则执行“delete []px;”语句时共调用该类析构函数的次数为()。
A. 0  B. 1  C. n  D. n+1
5. 对类中引用成员的初始化是通过构造函数中给出的()实现的。
A. 函数体  B. 参数表C. 初始化表  D. 初始化表或函数体
6. 一个类的静态数据成员所表示属性 (   )。
A. 是类的或对象的属性  B. 只是对象的属性
C. 只是类的属性D. 类和友元的属性
7. 被非静态成员函数访问的类的数据成员(  )。
A. 可以是非静态数据成员或静态数据成员B. 不可能是类的静态数据成员
C. 只能是类的非静态数据成员  D. 只能是类的静态数据成员
8. 引入友元的主要目的是为了()。
A. 增强数据安全性 B. 提高程序的可靠性
C. 提高程序的效率和灵活性 D. 保证类的封装性
9. 在重载一个运算符时,其参数表中没有任何参数,这表明该运算符是()。
A. 作为友元函数重载的1元运算符 B. 作为成员函数重载的1元运算符
C. 作为友元函数重载的2元运算符 D. 作为成员函数重载的2元运算符
10. 如果表达式a+b中的“+”是作为成员函数重载的运算符,若采用运算符函数调用格式,则可表示为()。
A. a.operator+(b) B. b.operator+(a)
C. operator+(a,b) D. operator(a+b)
11. 如果表达式++a中的“++”是作为成员函数重载的运算符,若采用运算符函数调用格式,则可表示为()。
A. a.operator++(1) B. operator++(a)
C. operator++(a,1) D. a.operator++()
12. 一个程序中数组a和变量k定义为“int a[5][10],k;”,且程序中包含有语句“a(2,5)=++k*3;”,则此语句中肯定属于重载操作符的是(  )。
A. ( ) B. =  C. ++  D. *
13. 下面是重载双目运算符+的普通函数原形,其中最符合+原来含义的是(   )。
A. Value operator+(Value, Value);   B. Value operator+(Value,int);
C. Value &operator+(Value, Value);  D. Value &operator+(Value&, Value&);
14. 关于插入运算符<<的重载,下列说法不正确的是(   )。
A. 运算符函数的返回值类型是ostream & 。
B. 重载的运算符必须定义为类的成员函数。
C. 运算符函数的第一个参数的类型是ostream & 。
D. 运算符函数有两个参数。
15. C++的继承性允许派生类继承基类的(   )。
   A. 部分特性,并允许增加新的特性或重定义基类的特性
   B. 部分特性,但不允许增加新的特性或重定义基类的特性
   C. 所有特性,并允许增加新的特性或重定义基类的特性
   D. 所有特性,但不允许增加新的特性或重定义基类的特性
16. 对于公有继承,基类中的私有成员在派生类中将 (   )。
   A. 能够直接使用成员名访问B. 能够通过成员运算符访问
   C. 仍然是基类的私有成员  D. 变为派生类的私有成员
17. 建立包含有类对象成员的派生类对象时,自动调用构造函数的执行顺序依次为()的构造函数。
   A. 自己所属类、对象成员所属类、基类
   B. 对象成员所属类、基类、自己所属类
   C. 基类、对象成员所属类、自己所属类
   D. 基类、自己所属类、对象成员所属类
18. 下列对派生类的描述中错误的说法是:()。
   A. 派生类至少有一个基类
   B. 派生类可作为另一个派生类的基类
   C. 派生类除了包含它直接定义的成员外,还包含其基类的成员
   D. 派生类所继承的基类成员的访问权限保持不变
二、填空题
1. 当一个队列为满时,不能对其做________元素的操作。
2.在一个用链表实现的队列类中,假定每个结点包含的值域用elem表示,包含的指针域用next表示,链队的队首指针用elemHead表示,队尾指针用elemTail表示,当链队非空时,_____________指向队首结点的后继(即下一个)结点。
3. 在一个用链表实现的队列类中,若链队为空或只含有一个结点,则队首指针的值与队尾指针的值________。
4.一个类的__________函数通常用于实现释放该类对象中指针成员所指向的动态存储空间的任务。
5.定义类动态对象数组时,其元素只能靠自动调用该类的____________来进行初始化。
6. 假定 AB为一个类,则执行“AB a[10];”语句时,系统自动调用该类构造函数的次数为________。
7.对类中引用成员的初始化只能通过在构造函数中给出的______________来实现。
8. 假定要把aa定义为AB类中的一个引用整数型数据成员,则定义语句为____________。
9.假定用户为类AB定义了一个构造函数“AB(int aa) {a=aa;}”,则系统(会/不会)_________为该类自动定义一个无参构造函数"AB() {}"。
10.假定用户为类AB定义了一个构造函数“AB(int aa=0):a(aa){}”,则定义该类的对象时,可以有________种不同的定义格式。
11.假定用户为类AB定义了一个构造函数“AB(int aa=0, int bb=0) {a=aa; b=bb;}”,则定义该类的对象时,可以有________种不同的定义格式。
12.假定用户只为类AB定义了一个构造函数“AB():a(0),b(0){}”,则定义该类对象x的定义语句“AB x(5);”是_________(正确/错误)的。
13. 静态成员函数____访问类的静态数据成员, ____   访问类的非静态数据成员。
14. 重载运算符时,该运算符的__________、结合性以及操作符的个数不允许改变。
15. 作为类的成员函数重载一个运算符时,参数表中只有一个参数,说明该运算符有________个操作数。
16. 重载抽取运算符>>时,其运算符函数的返回值类型应当是____________。
17. 类型转换函数没有____________类型,而且参数表为____________。
18. 当保护继承时,基类的  成员在派生类中成为保护成员,派生类对象不能直接访问基类的 ____成员。
19. 引进虚基类的根本目的是为了消除____________。
三、程序填空:
   1. 已知一个利用数组实现栈的类定义如下:
const int ARRAY_SIZE=10;
class Stack {
public:
void Init() {top=-1;} //初始化栈为空
void Push(int newElem);   //向栈中压入一个元素
int Pop();//从栈顶弹出一个元素
bool Empty() {  //判栈空
if(top==-1) return true;else return false;}
int Depth() {return top+1;}  //返回栈的深度
void Print(); 
//按照后进先出原则依次输出栈中每个元素,直到栈空为止
private:
int elem[ARRAY_SIZE];  //用于保存堆栈元素的数组
int top;   //指明栈顶元素位置的指针
};

该类的Pop和Print函数的实现分别如下:
___(1)___ {
if(top==-1) {
  cout<<"栈空!"<<endl;
  exit(1);  //中止运行
}
return ___(2)___;
}

void Stack::Print() {
while(!Empty())
  cout<<___(3)___ <<' ';
}

(1) (2) (3)
2. #include<iostream.h>
#include<stdlib.h>
class A {
  int *a; int n; int MaxLen;
public:
  A(): a(0), n(0), MaxLen(0) {}
  A(int *aa, int nn, int MM) {
n=nn;
MaxLen=MM;
if(n>MaxLen) exit(1);
___(1)___;  //由a指向长度为MaxLen的动态数组
for(int i=0; i<n; i++) a[i]=aa[i];
  } 
  ~A() {delete []a;}
  int GetValue(int i) ___(2)___ //函数体返回a[i]的值
};
void main()
{
int b[10]={1,2,3,4,5,6,7,8,9,10};
A r(b,10,10);
int i,s=0;
for(i=0; i<10; i++); ___(3)___ //把r对象的a数据成员中的每个
   //元素值依次累加到s中
cout<<"s="<<s<<endl;
}

(1)(2)  (3)
3. 在下面一段类定义中, Derived类公有继承了基类Base。需要填充的函数由注释内容给出了功能。
class Base
{
  private:
int mem1,mem2;//基类的数据成员
  public:
   Base(int m1,int m2) {
  mem1=m1; mem2=m2;
   }
   void output(){cout<<mem1<<' '<<mem2<<' ';}
//...
};

class Derived: public Base
{
  private:
int mem3; //派生类本身的数据成员
  public:
  //构造函数,由m1和m2分别初始化mem1和mem2,由m3初始化mem3
Derived(int m1,int m2, int m3);
  //输出mem1,mem2和mem3数据成员的值
void output(){
  ___(1)___; cout<<mem3<<endl;
}
//...
};

Derived::Derived(int m1,int m2, int m3): ___(2)___ {___(3)___;}

(1)  (2)(3)
四、写出程序运行结果:
1. #include<iostream.h>
class Franction {  //定义分数类
int nume;  //定义分子
int deno;  //定义分母
  public:
  //把*this化简为最简分数,具体定义在另外文件中实现
   void FranSimp(); 
  //返回两个分数*this和x之和,具体定义在另外文件中实现
   Franction FranAdd(const Franction& x);
  //置分数的分子和分母分别0和1
void InitFranction() {nume=0; deno=1;}
  //置分数的分子和分母分别n和d
void InitFranction(int n, int d) {nume=n; deno=d;}
   //输出一个分数
   void FranOutput() {cout<<nume<<'/'<<deno<<endl;}
};

  void main()
{
Franction a,b,c,d; 
a.InitFranction(6,15);
b.InitFranction(3,10);
c.InitFranction();
c=a.FranAdd(b);
d=c.FranAdd(a);
   cout<<"a: "; a.FranOutput();
cout<<"b: "; b.FranOutput();
cout<<"c: "; c.FranOutput();
cout<<"d: "; d.FranOutput();
}
2. #include<iostream.h>
class A {
int a,b;
public:
A() {a=b=0;}
A(int aa, int bb) {a=aa; b=bb;}
int Sum() {return a+b;}
int* Mult() {
  int *p=new int(a*b);
  return p;
}
};
void main() {
int *k;
A x(2,3), *p;
p=new A(4,5);
cout<<x.Sum()<<' '<<*(x.Mult())<<endl;
cout<<p->Sum()<<' '<<*(k=p->Mult())<<endl;
delete k;
}
五、指出程序或函数的功能
1. int Count(IntNode *f)
{
if(!f) return 0;
int c=0;
while(f) {
  c++;
  f=f->next;
}
  return c;
}
假定IntNode的类型定义为:
struct IntNode {
int data;   //结点值域
IntNode* next;  //结点指针域
};
2. int f(const char *s)
{
int i=0;
while(*s++)i++;
return i;
};
六、程序改错,请根据程序段或函数模块的功能改写个别地方的错误。
1. 下面是分数类fract的定义及测试主程序,在类定义及其友元函数定义中有两处错误,更正错误后程序应显示41/28,请指出错误所在行的行号并给出改正意见。
class fract{
int den;   //分子
int num;   //分母
public:
fract(int d=0,int n=1):den(d),num(n){}   //1行
friend fract &operator+=(fract,fract&);  //2行
void show(){ cout<<den<<'/'<<num;}   //3行
};   //4行
friend fract &operator+=(fract f1,fract f2)  //5行
{//7行
f1.den=f1.den*f2.num+f1.num*f2.den;  //8行
f1.num*=f2.num;  //9行
return f1;   //10行
}
void main(){
fract fr(3,4);
fr+=fract(5,7);
fr.show();
}

错误行的行号为______和________。
分别改正为______________________________
和______________________________。
七、编程:
1. 根据下面类中构造函数的原型和注释写出它的类外定义。
class Strings {
char *s;  //指向动态分配的字符串数组空间
int n;//记录字符串长度
public:
Strings(char*str);  //构造函数,利用str字符串长度初始化n,
//利用str字符串初始化s所指的字符串空间
Strings(Strings& str);//拷贝构造函数
Strings& Give(Strings& str);  //实现str赋值给*this的功能
Strings Uion(Strings& str);   //实现*this和str中的字符串合并的
  //功能,把合并结果存入临时对象并返回
int Lenth() {return n;}   //返回字符串长度
void Print() {cout<<s<<endl;} //输出字符串
};
2. 下列程序段中,A_class的成员函数Variance()可求出两数的平方差,请改写该程序段,把Variance()函数从A_class类中分离出来,用友元函数来实现该函数的功能。
class A_class {
  private:
int x,y,t;
  public:
A_class(int i,int j):x(i),y(j) {
  if(y>x){t=x;x=y;y=t;}
}
  int Variance(){return x*x-y*y;}
  //其它函数从略
};
void main() {
  A_class A_obj(3,5);
  cout<<"Result:"<<A_obj.Variance()<<endl;
}

来源:网络整理 免责声明:本文仅限学习分享,如产生版权问题,请联系我们及时删除。

相关文章:

2015春黑龙江电大《行政领导学A》单元练习二04-30

五字加一笔能写出多少字04-30

come的反义词04-30

跟牛谐音的词语,成语04-30

“庖丁解牛”这个成语的起源?04-30

2015春黑龙江电大《行政领导学A》单元练习四04-30

2015春黑龙江电大《行政领导学A》单元练习三04-30

敢作敢当和敢做敢当的区别04-30

引狼入室是指谁04-30

at table的同义词04-30

热搜文章
最新文章