面向对象程序设计习题

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

11.面向对象程序设计中的数据隐藏指的是参考答案为:DA.输入数据必须输入保密口令B.数据经过加密处理C.对象内部数据结构上建有防火墙D.对象内部数据结构的不可访问性[解析]输入数据必须输入保密口令和数据经过加密处理都不是面向对象程序设计的特征;对象内部数据结构上也不可能建有防火墙,所以它们都不是面向对象程序设计中所指的数据隐藏。面向对象程序设计系统中的封装单位是对象,对象之间只能通过接口进行信息交流,外部不能对对象中的数据随意地进行访问,这就造成了对象内部数据结构的不可访问性,也使得数据被隐藏在对象中。这就是面向对象程序设计中的数据隐藏所指。2.下列各项中符合函数重载必须满足的条件的是参考答案为:DA.必须有不同的参数个数B.对应的参数类型必须不相同C.A和B必须同时满足D.A和B只要满足一个即可[解析]我们知道,在同一个作用域中,要实现函数重载必须满足的条件的是:①有不同的参数个数;或者②对应的参数有不相同的数据类型,即①和②中只要有一个满足就可以了。当然两者都满足更好,但这不是必须的。3.下列带缺省值参数的函数说明中,正确的说明是参考答案为:AA.intFun(intx,inty=2,intz=3);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{参考答案为:AA.inta=23;B.CSample();public:C.CSample(intval);D.~CSample();}[解析]在上面对类“CSample”说明中,“CSample()”和“CSample(intval)”是该类重载的构造函数、“~CSample()”是该类的析构函数,这三个语句都是正确的。错误的语句是“inta=23”,因为它违反了在类的声明(不管是引用性声明,还是定义性声明)中都不能以赋值表达式的形式给它的数据成员进行初始化。5.已知类A中的一个成员函数的说明如下:voidSet(A&a);则该函数的参数“A&a”的含义是参考答案为:CA.指向A的指针为aB.将变量a的地址赋给类AC.类A对象引用a用作函数的形参D.变量A与a按位与后作函数参数[解析]因为A是一个类,所以“A&a”表示a是类A的对象,但因为对象a的前缀了符号“&”,则“&a”表示是类A的对象引用。所以“A&a”的含义是类A对象引用a用作函数的形参。6.若类A和类B的定义如下:classA{2public:inti,j;voidget();};classB:A{inti,j;protected:intk;public:voidmake();};voidB::make(){k=i*j;}则其中()是非法的表达式。参考答案为:DA.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;public:virtualvoidfun()=0;A(inta){i=a;}};classB{intj;public:voidfun(){cout”B::fun()\n”;}B(intb,intc):A(b){j=c;}};voidmain()参考答案为:AA.{Aa(5);B.A*pa;C.Bb(7);D.B*pb;}[解析]在类A中,函数“virtualvoidfun()=0”为纯虚函数,因此,类A为抽象类。作为抽象类,它是不能被用来定义具体对象的,而语句“Aa(5);”恰恰是定义抽象类的对象的,所以它是错误的38.拷贝(复制)构造函数的作用是参考答案为:CA.进行数据类型的转换B.用对象调用成员函数C.用对象初始化对象D.用一般类型的数据初始化对象[解析]进行数据类型的转换和用一般类型的数据初始化对象都是一般构造函数的功能。用对象调用成员函数不用构造函数,只要用“对象名.成员函数名”即可。所以拷贝(复制)构造函数的作用,只能是用对象来初始化对象。9.下列说法中,正确的说法是参考答案为:BA.所有的运算符都能被重载B.运算符被重载时,它们的优先级与结合性不会改变C.当需要时,我们可以自定义一个运算符来进行重载D.每个运算符都可以被重载成成员函数和友元函数[解析]当重载运算符时,不是所有的运算符都能被重载,有几个运算符是不能被重载的,如三元运算符“?:”、‘.’、‘*’、‘::’、‘#’等;也不是每个运算符都可以被重载成成员函数和友元函数,如运算符‘=’、‘()’、‘[]’、和‘→’都只能被重载成成员函数;无论何时,都不能自定义运算符来进行重载,也即重载只能对已有运算符进行;但是运算符被重载时,它们的优先级与结合性不会改变。10.下面对结构或类中成员的访问中,不正确的访问是参考答案为:AA.*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&rA=A1;intx=rA.GetX();”表示以对象A1初始化对象引用rA,然后由对象引用rA调用成员函数GetX()给变量x赋值,这样的访问成员函数的形式也是正确的;“*pointer.salary;”中,因为运算符‘.’的优先级高于运算符‘*’的优先级,所以相当于“*(pointer.salary);”,那正确的形式应该是“*(pointer→salary);”。故“*pointer.salary”是不正确的访问。11.C++对C语言作了很多改进,即从面向过程变成为面向对象的主要原因是()DA.增加了一些新的运算符B.允许函数重载,并允许设置缺省参数C.规定函数说明符必须用原型D.引进了类和对象的概念12.下列符号不能组成标识符的是(A)A.连接符B.下划线C.大小写字母D.数字字符13.类型修饰符unsigned不能修饰(D)A.charB.intC.longintD.float14.在inta=3,int*p=&a;中,*p的值是(D)A.变量a的地址值B.无意义C.变量p的地址值D.315.下列关于指针的操作中,错误的是(D)A.两个同类型的指针可以进行比较运算B.可以用一个空指针赋给某个指针C.一个指针可以加上两个整数之差D.两个同类型的指针可以相加二,填空题不写解答过程,将正确的答案写在每小题的空格内。错填或不填均无分。1.面向对象程序设计中的多态性包括静态多态性和动态多态性,前者由____________机制支持,而后者则由____________机制支持。4答:函数重载、虚函数[解析]静态多态性又称编译时多态性,调用何函数应该在编译之前就知道了,所以必须由函数重载机制来支持。动态多态性又称运行时多态性,调用何函数只有在运行时才知道,所以由虚函数(与指针或引用)机制来支持。2.由charconst*str=”stucture”;所以定义的指针称为____________,关键字const所修饰的是____________。答:指向常量的指针、指针所指的字符串[解析]根据由‘*’在修饰符“const”中位置的不同,它所修饰的对象也不同,“const”表示所修饰的是指针所指的常量,该指针称为指向常量的指针;“*const”表示所修饰的是指针本身,该指针称为常指针;“*const*”则表示所修饰的是指针本身和指针所指常量,该指针称为指向常量的常指针。3.引入虚基类的目的是为了解决多重继承中的____________和____________问题。答:二义性、多占用空间[解析]在允许多重继承时可能出现两个问题,第一个是公有派生类中的成员通过不同基类调用它们上一级公共基类的同一成员,这就产生了调用的二义性;每一个基类都为它们的上一级公共基类存有备份,这就引起了公共基类的重复存储,也就多占了存储空间。引入虚基类的目的是为了解决多重继承中的这两个问题。4.构造函数与析构函数所调用的虚函数是____________的函数,因此调用时实现的是____________联编。答:所在类、静态[解析]在生成派生类的对象时,先调用基类的构造函数生成基类对象,再调用派生类的构造函数来生成派生类对象。所以当在构造函数中调用虚函数时,当调用基类的构造函数时,此时派生类还未生成,所以它只能调用自己的虚函数;调用派生类构造函数时,它也只能调用自己的虚函数,因为虚函数的调用是不能由派生类调用基类的。在析构派生类对象是时,先调用派生类的析构函数析构掉派生类对象,再调用基类的析构函数来析够掉基类的对象。所以当在析够构函数中调用虚函数时,派生类的析构函数调用的是它自己的虚函数(原因同构造函数),基类的析构函数调用的也是它自己的虚函数,因为此时派生类对象以已被析构掉了。由上可见,当构造函数与析够函数调用虚函数时,它们调用的都是自己类的函数,因此调用时实现的是静态联编。7.说明一个const成员函数(又称常量成员函数)的方法是,将const写在__________之间,而且它修饰的是__________。答:函数头与函数体、this指针[解析]为了说明一个常量成员函数的方法是,将const写在函数头的右圆括号‘)’与函数体的左花括号‘{’之间,而且它修饰的是对象所属的this指针。表示该函数不能修改它所在对象中的数据成员的值。20.对某个运算符的重载,实际上是用关键字____________与该运算符组成一个运算符函数,而且该运算符函数的返回类型不能是____________的。答:operater、void[解析]对某个运算符的重载,实际上是用关键字operater与该运算符组成一个运算符函数,而且该运算符函数的返回类型不能是无类型的,即不能是void的。三改错题1.分析下列程序中的错误,并说明出错原因。#includeclassbase{5constintn;public:base(){cout”Initializingdefault\n”;}base(intm){cout”Initializing\n”;n=m;}~base(){cout”Destroying\n”;}};voidmain(){basex(1);basey=x;}答:(1)n=m;const数据成员不以该形式赋值(2)错误处basey=x;,以对象初始化对象[解析](1)作为const数据成员n不能用赋值表达式的形式为其赋初值,必须在定义构造函数时在函数头中以“base(intm):n(m)”形式来初始化。(2)basey=x;语句中‘=’不是赋值的意思,而是初始化的意思。即在定义类base的对象y时,以对象x给它初始化,相当于basey(x);。但是以对象初始化对象时,必须

1 / 22
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功