面向对象程序设计习题Word格式文档下载.docx

上传人:b****0 文档编号:13354166 上传时间:2022-10-10 格式:DOCX 页数:32 大小:27.51KB
下载 相关 举报
面向对象程序设计习题Word格式文档下载.docx_第1页
第1页 / 共32页
面向对象程序设计习题Word格式文档下载.docx_第2页
第2页 / 共32页
面向对象程序设计习题Word格式文档下载.docx_第3页
第3页 / 共32页
面向对象程序设计习题Word格式文档下载.docx_第4页
第4页 / 共32页
面向对象程序设计习题Word格式文档下载.docx_第5页
第5页 / 共32页
点击查看更多>>
下载资源
资源描述

面向对象程序设计习题Word格式文档下载.docx

《面向对象程序设计习题Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《面向对象程序设计习题Word格式文档下载.docx(32页珍藏版)》请在冰豆网上搜索。

面向对象程序设计习题Word格式文档下载.docx

B.intFun(intx=1,inty,intz=3);

C.intFun(intx,inty=2,intz);

D.intFun(intx=1,inty,intz=3);

[解析]在带缺省值参数的函数说明中,正确的说明应该是无缺省值的参数依次排列在参数表的左边,排完无缺省值的参数后,再依次排列带缺省值的参数。

从所给出的四个选项来看,只有“intFun(intx,inty=2,intz=3)〞符合这条规定,其它的都不符合。

4.有如下的对类“CSample〞的说明,其中〔〕是错误的。

 classCSample{   参考答案为:

A

  A.inta=23;

  B.CSample();

    public:

  C.CSample(intval);

  D.~CSample();

 }

[解析]在上面对类“CSample〞说明中,“CSample()〞和“CSample(intval)〞是该类重载的构造函数、“~CSample()〞是该类的析构函数,这三个语句都是正确的。

错误的语句是“inta=23”,因为它违反了在类的声明〔不管是引用性声明,还是定义性声明〕中都不能以赋值表达式的形式给它的数据成员进展初始化。

5.类A中的一个成员函数的说明如下:

  voidSet(A&

a);

  那么该函数的参数“A&

a〞的含义是   参考答案为:

C

  A.指向A的指针为a

  B.将变量a的地址赋给类A

  C.类A对象引用a用作函数的形参

  D.变量A与a按位与后作函数参数

[解析]因为A是一个类,所以“A&

a〞表示a是类A的对象,但因为对象a的前缀了符号“&

〞,那么“&

a〞表示是类A的对象引用。

所以“A&

a〞的含义是类A对象引用a用作函数的形参。

6.假设类A和类B的定义如下:

  classA{

   public:

    inti,j;

    voidget();

  };

  classB:

A{

     inti,j;

    protected:

      intk;

    voidmake();

  voidB:

:

make(){k=i*j;

}

  那么其中〔〕是非法的表达式。

     参考答案为:

D

  A.voidget();

  B.intk;

  C.voidmake();

  D.k=i*j;

  [解析]对于给定的四项中,前三项都是正确的,只有第四项是错误的。

因为,类B是类A的私有派生类〔缺省访问类型〕,所以A中的公类型的数据成员在类B中成为了私有数据成员,但函数“voidB:

make()〞既然是类B的成员函数,那么既可访问类A中的公有数据成员,也能访问类B中的私有数据成员,那么表达式“k=i*j;

〞造成了访问的二义性,即其中的i和j,到底是取自类A呢?

还是取自类B呢?

7.下面的主程序中,语句〔〕是错误的。

    classA{

    inti;

    virtualvoidfun()=0;

    A(inta){i=a;

    };

    classB{

    intj;

    voidfun(){cout<

<

〞B:

fun()\n〞;

    B(intb,intc):

A(b){j=c;

    voidmain()   参考答案为:

  A.{Aa(5);

  B.A*pa;

  C.Bb(7);

  D.B*pb;

    }

  [解析]在类A中,函数“virtualvoidfun()=0”为纯虚函数,因此,类A为抽象类。

作为抽象类,它是不能被用来定义具体对象的,而语句“Aa(5);

〞恰恰是定义抽象类的对象的,所以它是错误的

8.拷贝〔复制〕构造函数的作用是   参考答案为:

  A.进展数据类型的转换

  B.用对象调用成员函数

  C.用对象初始化对象

  D.用一般类型的数据初始化对象

  [解析]进展数据类型的转换和用一般类型的数据初始化对象都是一般构造函数的功能。

用对象调用成员函数不用构造函数,只要用“对象名.成员函数名〞即可。

所以拷贝〔复制〕构造函数的作用,只能是用对象来初始化对象。

9.以下说法中,正确的说法是   参考答案为:

B

  A.所有的运算符都能被重载

  B.运算符被重载时,它们的优先级与结合性不会改变

  C.当需要时,我们可以自定义一个运算符来进展重载

  D.每个运算符都可以被重载成成员函数和友元函数

  [解析]当重载运算符时,不是所有的运算符都能被重载,有几个运算符是不能被重载的,如三元运算符“?

〞、‘.’、‘*’、‘:

’、‘#’等;

也不是每个运算符都可以被重载成成员函数和友元函数,如运算符‘=’、‘〔〕’、‘[]’、和‘→’都只能被重载成成员函数;

无论何时,都不能自定义运算符来进展重载,也即重载只能对已有运算符进展;

但是运算符被重载时,它们的优先级与结合性不会改变。

10.下面对构造或类中成员的访问中,不正确的访问是   参考答案为:

  A.*pointer.salary;

〔其中pointer为指向类对象的指针〕

  B.pointer->

salary;

  C.x=worker.salary;

〔其中worker为具有类类型的对象〕

  D.Location&

rA=A1;

intx=rA.GetX();

〔Location为已定义的类,A1为对象〕

[解析]因pointer为指向类对象的指针,所以“pointer->

salary〞是正确的访问数据成员的形式;

因worker为具有类类型的对象,所以“worker.salary〞也是正确的访问数据成员的形式;

因Location为已定义的类,A1为对象,所以“Location&

〞表示以对象A1初始化对象引用rA,然后由对象引用rA调用成员函数GetX()给变量x赋值,这样的访问成员函数的形式也是正确的;

“*pointer.salary;

〞中,因为运算符‘.’的优先级高于运算符‘*’的优先级,所以相当于“*〔pointer.salary〕;

〞,那正确的形式应该是“*〔pointer→salary〕;

〞。

故“*pointer.salary〞是不正确的访问。

11.C++对C语言作了很多改良,即从面向过程变成为面向对象的主要原因是()D

A.增加了一些新的运算符B.允许函数重载,并允许设置缺省参数C.规定函数说明符必须用原型D.引进了类和对象的概念

12.以下符号不能组成标识符的是(A)A.连接符B.下划线C.大小写字母D.数字字符

13.类型修饰符unsigned不能修饰(D)A.charB.intC.longintD.float

14.在inta=3,int*p=&

a;

中,*p的值是(D)A.变量a的地址值B.无意义C.变量p的地址值D.3

15.以下关于指针的操作中,错误的选项是(D)A.两个同类型的指针可以进展比拟运算B.可以用一个空指针赋给某个指针C.一个指针可以加上两个整数之差D.两个同类型的指针可以相加

二,填空题  不写解答过程,将正确的答案写在每题的空格内。

错填或不填均无分。

1.面向对象程序设计中的多态性包括静态多态性和动态多态性,前者由____________机制支持,而后者那么由____________机制支持。

答:

函数重载、虚函数

[解析]静态多态性又称编译时多态性,调用何函数应该在编译之前就知道了,所以必须由函数重载机制来支持。

动态多态性又称运行时多态性,调用何函数只有在运行时才知道,所以由虚函数〔与指针或引用〕机制来支持。

2.由charconst*str=〞stucture〞;

所以定义的指针称为____________,关键字const所修饰的是____________。

指向常量的指针、指针所指的字符串

[解析]根据由‘*’在修饰符“const〞中位置的不同,它所修饰的对象也不同,“const〞表示所修饰的是指针所指的常量,该指针称为指向常量的指针;

“*const〞表示所修饰的是指针本身,该指针称为常指针;

“*const*〞那么表示所修饰的是指针本身和指针所指常量,该指针称为指向常量的常指针。

3.引入虚基类的目的是为了解决多重继承中的____________和____________问题。

二义性、多占用空间

[解析]在允许多重继承时可能出现两个问题,第一个是公有派生类中的成员通过不同基类调用它们上一级公共基类的同一成员,这就产生了调用的二义性;

每一个基类都为它们的上一级公共基类存有备份,这就引起了公共基类的重复存储,也就多占了存储空间。

引入虚基类的目的是为了解决多重继承中的这两个问题。

4.构造函数与析构函数所调用的虚函数是____________的函数,因此调用时实现的是____________联编。

所在类、静态

[解析]在生成派生类的对象时,先调用基类的构造函数生成基类对象,再调用派生类的构造函数来生成派生类对象。

所以当在构造函数中调用虚函数时,当调用基类的构造函数时,此时派生类还未生成,所以它只能调用自己的虚函数;

调用派生类构造函数时,它也只能调用自己的虚函数,因为虚函数的调用是不能由派生类调用基类的。

在析构派生类对象是时,先调用派生类的析构函数析构掉派生类对象,再调用基类的析构函数来析够掉基类的对象。

所以当在析够构函数中调用虚函数时,派生类的析构函数调用的是它自己的虚函数〔原因同构造函数〕,基类的析构函数调用的也是它自己的虚函数,因为此时派生类对象以已被析构掉了。

由上可见,当构造函数与析够函数调用虚函数时,它们调用的都是自己类的函数,因此调用时实现的是静态联编。

7.说明一个const成员函数〔又称常量成员函数〕的方法是,将const写在__________之间,而且它修饰的是__________。

函数头与函数体、this指针

[解析]为了说明一个常量成员函数的方法是,将const写在函数头的右圆括号‘〕’与函数体的左花括号‘{’之间,而

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1