面向对象软件工程1
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
A.所有的运算符都能被重载 B.运算符被重载时,它们的优先级与结合性不会改变 C.当需要时,我们可以自定义一个运算符来进行重载 D.每个运算符都可以被重载成成员函数和友元函数 [解析]当重载运算符时,不是所有的运算符都能被重载,有几个运 算符是不能被重载的,如三元运算 符“?:”、‘.’、‘*’、‘::’、‘#’等;也不是每个运算符 都可以被重载成成员函数和友元函数,如运算 符‘=’、‘()’、‘[]’、和‘→’都只能被重载成成员函数;无 论何时,都不能自定义运算符来进行重载,也即重载只能对已有运算符 进行;但是运算符被重载时,它们的优先级与结合性不会改变。 10.下面对结构或类中成员的访问中,不正确的访问是 参考 答案为:A A.*pointer.salary; (其中pointer为指向类对象的指针) B.pointer->salary; C.x=worker.salary; (其中worker为具有类类型的对象) D.Location &rA=A1;int x=rA.GetX(); (Location为已定义的 类,A为对象) [解析]因pointer为指向类对象的指针,所以“pointer>salary”是正确的访问数据成员的形式;因worker为具有类类型的对 象,所以“worker.salary”也是正确的访问数据成员的形式;因 Location为已定义的类,A1为对象,所以“Location &rA=A1;int x=rA.GetX();”表示以对象A1初始化对象引用rA,然后由对象引用rA 调用成员函数GetX()给变量x赋值,这样的访问成员函数的形式也是正 确的;“*pointer.salary;”中,因为运算符‘.’的优先级高于运算 符‘*’的优先级,所以相当于“*(pointer.salary);”,那正确的 形式应该是“*(pointer→salary);”。故“*pointer.salary”是不 正确的访问。 二,填空题(本大题共10小题,共20分) 不写解答过程,将正确的答案写在每小题的空格内。错填或不 填均无分。 11.面向对象程序设计中的多态性包括静态多态性和动态多态性, 前者由____________机制支持,而后者则由____________机制支持。 答:函数重载、虚函数 [解析]静态多态性又称编译时多态性,调用何函数应该在编译之前 就知道了,所以必须由函数重载机制来支持。动态多态性又称运行时多 态性,调用何函数只有在运行时才知道,所以由虚函数(与指针或引 用)机制来支持。 12.由char const *str=”stucture”;所以定义的指针称为
D.k=i*j; [解析]对于给定的四项中,前三项都是正确的,只有第四项是错误 的。因为,类B是类A的私有派生类(缺省访问类型),所以A中的公类 型的数据成员在类B中成为了私有数据成员,但函数“void B::make()”既然是类B的成员函数,则既可访问类A中的公有数据成 员,也能访问类B中的私有数据成员,则表达式“k=i*j;”造成了访问 的二义性,即其中的i和j,到底是取自类A呢?还是取自类B呢? 7.下面的主程序中,语句( )是错误的。 class A { int i; public: virtual void fun()=0; A(int a) { i=a; } }; class B { int j; public: void fun() { cout<<”B::fun()\n”; } B(int b,int c) :A(b) { j=c; } }; void main() 参考答案为:A A.{ A a(5); B.A *pa; C.B b(7); D.B *pb; } [解析]在类A中,函数“virtual void fun()=0”为纯虚函数,因 此,类A为抽象类。作为抽象类,它是不能被用来定义具体对象的,而 语句“A a(5);”恰恰是定义抽象类的对象的,所以它是错误的 8.拷贝(复制)构造函数的作用是 参考答案为:C A.进行数据类型的转换 B.用对象调用成员函数 C.用对象初始化对象 D.用一般类型的数据初始化对象 [解析]进行数据类型的转换和用一般类型的数据初始化对象都是一 般构造函数的功能。用对象调用成员函数不用构造函数,只要用“对象 名.成员函数名”即可。所以拷贝(复制)构造函数的作用,只能是用 对象来初始化对象。 9.下列说法中,正确的说法是 参考答案为:B
____________操作符。 答:作用域、作用域分辨符 [解析]C++的作用域规则能隐式地保证编译器调用正确的成员函 数。为清楚地显式地保证编译器调用正确的成员函数,可以使用作用域 分辨操作符::,使用“类名::成员函数”来说明该成员函数属于哪 个类。 17.说明一个const成员函数(又称常量成员函数)的方法是,将 const写在__________之间,而且它修饰的是__________。 答:函数头与函数体、this指针 [解析]为了说明一个常量成员函数的方法是,将const写在函数头 的右圆括号‘)’与函数体的左花括号‘{’之间,而且它修饰的是对 象所属的this指针。表示该函数不能修改它所在对象中的数据成员的 值。 18.除析构函数外,不能带有参数的函数还有____________,而且 它的返回数据类型不能随便指定,而由____________来决定。 答:类型转换函数、return语句中返回变量的类型 [解析]除析构函数外,不能带有参数的函数还有类型转换函数,类 型转换函数的返回数据类型是不能随便指定的,必须由return语句中返 回变量的类型来决定。 19.当使用new动态生成一个对象时,隐含着对____________的一 次调用;而当使用delete删除一个对象时,隐含着对____________的一 次调用。 答:构造函数、析构函数 [解析]当使用new动态生成一个对象时,隐含着对构造函数的一次 调用,用来生成对象;而当使用delete删除一个对象时,隐含着对析构 函数的一次调用,以析构需删除的对象。 20.对某个运算符的重载,实际上是用关键字____________与该运 算符组成一个运算符函数,而且该运算符函数的返回类型不能是 ____________的。 答:operater、void [解析]对某个运算符的重载,实际上是用关键字operater 与该运 算符组成一个运算符函数,而且该运算符函数的返回类型不能是无类型 的,即不能是void的。 三,改错题(本大题共5小题,每小题2分,共10分) 21.分析下列程序中的错误,并说明出错原因。 # include class base { const int n; public:
Baidu Nhomakorabea
B.CSample(); public: C.CSample(int val); D.~ CSample(); } [解析]在下面对类“CSample”说明 中,“CSample()”和“CSample(int val)”是该类重载的构造函 数、“~ CSample()”是该类的析构函数,这三个语句都是正确的。错 误的语句是“int a=23”,因为它违反了在类的声明(不管是引用性声 明,还是定义性声明)中都不能以赋值表达式的形式给它的数据成员进 行初始化。 5.已知类A中的一个成员函数的说明如下: void Set(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的定义如下: class A { public: int i,j; void get(); }; class B:A { int i,j; protected: int k; public: void make(); }; void B::make() { k=i*j; } 则其中()是非法的表达式。 参考答案为:D A.void get(); B.int k; C.void make();
____________,关键字const 所修饰的是____________。 答:指向常量的指针、指针所指的字符串 [解析]根据由‘*’在修饰符“const”中位置的不同,它所修饰的 对象也不同,“const ”表示所修饰的是指针所指的常量,该指针称为 指向常量的指针;“* const”表示所修饰的是指针本身,该指针称为 常指针;“* const *”则表示所修饰的是指针本身和指针所指常量, 该指针称为指向常量的常指针。 13.引入虚基类的目的是为了解决多重继承中的____________和 ____________问题。 答:二义性、多占用空间 [解析]在允许多重继承时可能出现两个问题,第一个是公有派生类 中的成员通过不同基类调用它们上一级公共基类的同一成员,这就产生 了调用的二义性;每一个基类都为它们的上一级公共基类存有备份,这 就引起了公共基类的重复存储,也就多占了存储空间。引入虚基类的目 的是为了解决多重继承中的这两个问题。 14.派生类中所定义的虚函数的____________不影响对它的动态联 编,即基类中已定义的虚函数,其同名函数放在派生类中的 __________,都可以实现运行时多态性。 答:访问属性、任何地方 [解析]对虚函数的能否在类外调用,取决于基类中定义它时是否具 有公的访问属性,而派生类中重新定义的虚函数的访问属性不影响它的 特性,即对它的动态联编。也即基类中已定义的虚函数,其同名函数放 在派生类中的任何地方,都可以实现运行时多态性。 15.构造函数与析构函数所调用的虚函数是____________的函数, 因此调用时实现的是____________联编。 答:所在类、静态 [解析]在生成派生类的对象时,先调用基类的构造函数生成基类对 象,再调用派生类的构造函数来生成派生类对象。所以当在构造函数中 调用虚函数时,当调用基类的构造函数时,此时派生类还未生成,所以 它只能调用自己的虚函数;调用派生类构造函数时,它也只能调用自己 的虚函数,因为虚函数的调用是不能由派生类调用基类的。在析构派生 类对象是时,先调用派生类的析构函数析构掉派生类对象,再调用基类 的析构函数来析够掉基类的对象。所以当在析够构函数中调用虚函数 时,派生类的析构函数调用的是它自己的虚函数(原因同构造函数), 基类的析构函数调用的也是它自己的虚函数,因为此时派生类对象以已 被析构掉了。由上可见,当构造函数与析够函数调用虚函数时,它们调 用的都是自己类的函数,因此调用时实现的是静态联编。 16.C++的____________规则能保证编译器调用正确的成员函数。 有时为更保险地保证编译器调用正确的成员函数,可以使用
一、单项选择题(本大题共10小题,共20分) 在每小题列出的四个选项中,只有一个是符合题目要求的,请 将其代码填在题后的括号内。错选或未选均无分。 单项选择题(本大题共20小题,每小题1分,共20分) 1.面向对 象程序设计中的数据隐藏指的是 参考答案为:D A.输入数据必须输入保密口令 B.数据经过加密处理 C. 对象内部数据结构上建有防火墙 D.对象内部数据结构的不可访问性 [解析]输入数据必须输入保密口令和数据经过加密处理都不是面向 对象程序设计的特征;对象内部数据结构上也不可能建有防火墙,所以 它们都不是面向对象程序设计中所指的数据隐藏。面向对象程序设计系 统中的封装单位是对象,对象之间只能通过接口进行信息交流,外部不 能对对象中的数据随意地进行访问,这就造成了对象内部数据结构的不 可访问性,也使得数据被隐藏在对象中。这就是面向对象程序设计中的 数据隐藏所指。 2.下列各项中不符合函数重载必须满足的条件的是 参考答 案为:D A. 必须有不同的参数个数 B.对应的参数类型必须不相同 C. A和B必须同时满足 D.A和B只要满足一个即可 [解析]我们知道,在同一个作用域中,要实现函数重载必须满足的 条件的是:① 有不同的参数个数;或者 ② 对应的参数有不相同的数 据类型,即①和②中只要有一个满足就可以了。当然两者都满足更好, 但这不是必须的。 3.下列带缺省值参数的函数说明中,正确的说明是 参考答 案为:A A.int Fun(int x,int y=2,int z=3); B.int Fun(int x=1,int y,int z=3); C. int Fun(int x,int y=2,int z); D.int Fun(int x=1,int y,int z=3); [解析]在带缺省值参数的函数说明中,正确的说明应该是无缺省值 的参数依次排列在参数表的左边,排完无缺省值的参数后,再依次排列 带缺省值的参数。从所给出的四个选项来看,只有“int Fun(int x,int y=2,int z=3)”符合这条规定,其它的都不符合。 4.有如下的对类“CSample”的说明,其中( )是错误的。 class CSample { 参考答案为:A A.int a=23;