(24)执行下列程序时输入123<空格>456<空格>789<回车>,输出结果是
A)123,456,789
B)1,456,789
C)1,23,456,789
D)1,23,456
(25)右加下程序
该程序的输出结果是
A)不定值
B)2
C)1
D)O
(26)下列关于虚基类的描述中错误的是
A)虚基类子对象的初始化由最派生类完成
B)虚基类子对象的初始化次数与虚基类下面的派生类个数有关
C)设置虚基类的目的是消除二义性
D)带有虚基类的多层派生类构造函数的成员初始化列表中都要列出对虚基类构造函 数调用
(27)在某类的公共部分有声明string operator++();和string operator++(int);
则说明
A)string operator++();是前置自增运算符声明
B)string operator++ ();是后置自增运算符声明
C)string operator++ (int);是前置自增运算符声明
D)两条语句无区别
(28)以下有关类与结构体关系的叙述不正确的是
A)结构体中只包含数据;类中封装了数据和操作
B)结构体的成员对外界通常是开放的;类的成员可以被隐蔽
C)用struct不能声明一个类型名;而claSS可以声明一个类名
D)结构体成员默认为puhlic;类成员默认为private
(29)设有char str[80];以下不能将输入数据flrst\nsecond\n读取到数组str中的语句是
A)cin.get(str,strlen(str));
B)cin.getline(str,strlen(str));
C)cin>>str;
D)cin.read(str,strIen(str));
(30)下列能对对象进行初始化的是
A)构造函数
B)析构函数
C)友元函数
D)静态成员函数
(31)控制格式输入/输出的操作子中,设置域宽的的函数是
A)WS
B)oct
C)setfill(int)
D)setw(mt)
(32)下列不能作为类的成员的是
A)自身类对象的指针
B)自身类对象
C)自身类对象的引用
D)另一个类的对象
(33)设置虚基类的目的是
A)简化程序
B)消除二义性
C)提高程序运行效率
D)减少目标代码
(34)下列描述中正确的是
A)类中可以定义与类名相同的数据成员
B)直接子类中可以定义与父类名相同的数据成员
C)孙子类中可以定义与爷爷类名相同的数据成员。
D)类的所有子孙中都不可以定义与该类同名的数据成员。
(35)要通过函数实现一种不太复杂的功能,并且要求加快执行速度,则应该选用
A)重载函数
B)内联函数
C)静态函数
D)虚函数
二、填空题(每空2分,共30分)
请将每空的正确答案写在答题卡【l】~【15】序号的横线上,答在试卷上不得分。
(1)数据结构分为线性结构和非线性结构,其中循环链表属于【1】。
(2)程序设计分为面向过程程序设计和面向对象程序设计,具有继承性特点的程序设汁
称为 【2】 程序设计。
(3)为了在两个关系中提取所有相同的元组,则在交与并这两种关系运算中,应使用
【3】 运算。
(4)在算法执行过程中所需要的基本运算次数称为算法的 【4】 复杂度。
(5)数据模型分为格式化模型和非格式化模型,则关系模型属于 【5】 模型。
(6)逻辑表达式x>3&&x<10的相反表达式为 【6】 。
(7)在派生类中,对类对象成员,基类成员和非类对象成员的初始化程序是【7】 。
(8)假定用户没有给一个名字为Sample的类定义构造函数,则系统为其隐含定义的构造
函数为 【8】 。
(9)在C十+流类库中,根基类为【9】 。
(10)若需要定义一个标识符常量,并且使得c++能够进行类型检查,则应在定义语句的开始使用保留字【10】 。
(11)下列程序的运行结果是—【11】 。
(12)下列程序的执行结果为【12】
(13)下列程序的执行结果为。【13】
(14)下列程序用于将源文件中的字母进行大小写转换,while的条件是【14】
(15)以下程序的执行结果是【15】
标准预测试卷六答案及解析
一、选择题
(1)B【解析】一般来说,二叉树采用链式存储结构,但由于完全二叉树的特点,采用顺序存储也能方 便地访问其中的每一个元素。因此,选项A)中的说法是不对的。 所谓循环队列,就是将队列存储空间的最后一个位置绕到第一个位置,形成逻辑上的环状空间,供队 列循环使用。在循环队列结构中,当存储空间的最后一个位置已被使用而再要进行人队运算时·只 要存储空间的第一个位置空闲,便可将元素加入到第一个位置.即将存储空间的第一个位置作为队 尾。因此,循环队列是队列的一种顺序存储方式,选项B)中的说法是正确的。 栈是特殊的线性表,它既能采用顺序存储结构,又能采用链式存储结构。因此,选项C)中的说法也 是不对的。 前面说过,循环队列是队列的一种顺序存储方式,不属于链式存储结构。因此,选项D)中的说法也 是不对的。
(2)C【解析】软件测试的目标是在精心控制的环境下执行程序,以发现程序中的错误,给出程序可靠 性的鉴定。 测试不是为了证明程序是正确的,而是在设想程序有错误的前提下进行的.其目的是设法暴露程序 中的错误和缺陷。 由于测试的这一特征,一般应当避免由开发者测试自己的程序。 测试只能说明程序有错,而不能证明程序无错,希望通过有限次的测试就能发现程序中的所有错误 是不可能的,即完全测试是不可能的。 因此,选项A)与D)中的说法都是错误的。 调试也称排错。
·测试的目的是暴露错误,而调试的目的是发现错误的位置,并改正错误。
·经测试发现错误后,可以立即进行调试并改正错误;经过调试后的程序还需进行回归测试,以检查 调试的效果,同时也可防止在调试过程中引进新的错误。 因此,选项B)中的说法也是错误的,而选项C)中的说法是正确的。
(3)D【解析】在程序设计中,优良的风格要求在输出中加入必要的注释。因此.选项D)中的说法是 不对的。
(4)C【解析】二叉树有一个性质:在二叉树的第k层上,最多有2k—l(k≥1)个结点。对于满二叉树 来说,最后一层上的叶子结点数正好达到最大值。因此,深度为6的满二叉树中,叶子结点的个数即 是第6层上结点数的最大值,为 2k-1=26-1=32
(5)B【解析】队列是按“先进先出”原则组织数据的,而循环队列只是队列的一种存储形式。因此,循 环队列是按“先进先出”原则组织数据的。
(6)D【解析】对长度为n的线性表进行插入排序,在最坏情况下需要n(n一1)/2次比较,现线性表的 长度为7,在最坏情况下需要比较的次数为7(7—1)/2=21。
(7)A【解析】按照二叉树前序遍历的方法:在访问根结点、遍历左子树与遍历右子树这三者中,首先 访问根结点,然后遍历左子树,最后遍历右子树;并且,在遍历左、右子树时,仍然先访问根结点遍历左 子树,然后遍历左子树,最后遍历右子树。对本题中的二叉树进行前序遍历的结果应是FCADBEG。
(8)A【解析】所谓信息隐蔽是指,在一个模块内包含的信息(过程或数据),对于不需要这些信息的 其它模块来说是不能访问的。因此,选项A)中的说法是不对的。 系统设计的质量主要反映在模块的独立性上。评价模块独立性的主要标准有两个:一是模块之间的 耦合,它表明两个模块之间互相独立的程度;二是模块内部之间的关系是否紧密,称为内聚。因此, 选项B)、C)、D)中的说法都是正确的。
(9)B【解析】数据库概念设计中,由分散到集中的设计方法是视图集成设计。
(10)C【解析】投影运算是在给定关系的某些域上进行的运算。通过投影运算可以从一个关系中选 择出所需要的属性成分,并且按要求排列成一个新的关系,而新关系的各个属性值来自原关系中相 应的属性值。因此,经过投影运算后,会取消某些列,即投影运算可能改变关系中属性的个数。
(11)B【解析】本题考察eonst修饰符的使用规则,只要考生理解了corlst表示“常”的意思就容易举 一反三。根据被修饰内容的不同,const在修饰数据成员,成员函数和对象时,具有特定的含义。很 明显,常数据成员是不能被修改的,这一点在选项B中被破坏,因此可以确定本题答案为B,如果考 生对其他选项难于区分,同样可以得到正确答案。
(12)C【解析】继承中的二义性主要表现在多重继承中具有多条继承路径时,派生类中行为的不确定 性。如果强制指定了按照某条路径访问,亦即采用域作用符限定访问的成员函数的方法可以解决 之,故选项A排除。在选项B和C中,唯一的区别在于参数表是否一致,我们知道:参数表不一致 同名函数属于重载,是不存在二义性问题的,故选项C是正确答案。关于选项D,虚基类是C++ 中解决二义性的一种有效手段。
(13)D【解析】在一个类的内部声明,并用friend修饰的函数称为该类的友员函数,友员函数可以像 成员函数一样.访问类的所有级别的成员。友员机制主要用于提高访问效率。但是破坏了类的封装 性原则。在程序中适当使用友员函数.并寻求封装和效率之间的一个平衡点,是使用友员技术的一 个主要内容。
(14)A【解析】 本题考察在C++中.字符串的存放方式,以及不同的字符串函数的作用。其中, strlen是专门用于求字符串长度的,其自动去掉字符数组后面的那个‘/0’,而sizeof后面求的则是 str指针,指针在目前的32位机器中是固定大小的,其值与字符串的长度是没有关系的。故可以排 除B和D。而选项C则将‘/0’多考虑了一次。
(15)C【解析】在赋值操作中,将发生对象的拷贝操作,但并不说明两者是完全一样的。一般情况下, 如果给类定义了赋值操作符,则应该同时定义合适的拷贝构造函数,除非系统默认生成的拷贝构造 函数满足赋值操作。实际上,系统默认的拷贝构造函数仅仅将数据成员进行简单的对应赋值,而在 多数特殊应用中,这么简单的对应关系是不适用的.这就需要程序员重新定义拷贝构造函数。
(16)D【解析】抽象类指的是类中至少有一个纯虚函数,纯虚函数是虚函数后有“=0”修饰,表示该函 数在本级类中没有实现,类仅用于派生。抽象类存在的唯一目的就是构造类层次,派生出其他类。抽 象类与其他类的最大区别就在于抽象类不能实例化。
(17)B【解析】 内联函数用inline修饰,用于取代C语言中的宏定义。Inline是个建议机制而不是强 制机制.也就是说,程序员可以指定任意函数为inline函数,但是编译器会根据系统情况来决定是 否将其inline处理。对于较大的函数.编译器往往会取消其inline特性。Inline函数的特点之一就 是执行速度快.他实质是在编译时将函数的目标代码插入到每个调用该函数的地方,从而没有出栈 人栈、保护现场等开销.提高了效率。在类体内定义的成员函数,自动被编译器当做内联函数处理, 在类体外定义的成员函数,如果用inline修饰,编译器也认为是一种内联建议。
(18)C【解析】本题乍一看让人迷惑,如果找到切入点就可以简单快速的解答本题。观察四个选项可知,变量a和b的四种组合分别是四个选项。很明显指针在做值使用时需要加星号修饰.即如*p1一整数变量的形式。故b不可能是int型,故可排除A和B。另外需要注意的是变量的初始化和 赋值是不同的。p2在声明时就指向变量a,其值为a的地址。因此,变量a应为int型,故正确答案 为C。
(19)D【解析】指针是一个既强大又危险的技术,C/C++语言之所以灵活高效,原因之一就是采用 了指针技术,所以C/C++特别适合开发系统软件和工具软件。在C#语言中已经取消了指针,而 且全部属于托管代码。而在dotnet框架中.为了保持兼容性,仍然可以使用C++,但分托管和非 托管代码。本题实际上有个圈套,只要注意到题干中“语句”,而且注意到各个选项中都有分号结 尾,就可以判断选项D是正确的:语句不是以逗号结尾的。
(20)D【解析】虚函数和函数重载的区别比较大,只要清楚各个概念的基本知识就足以判断出本题的 正确答案为D。
(21)A【解析】 本题考察switch语句的嵌套,以及break语句的使用规则,即break中断当前的执行 流,不再执行下面的case语句,如果没有break语句.则会顺序执行随后语句。据此,读程序可知, 内层switch执行case 0分支,故a增l,调出内层switch后,由于没有break语句,随后执行外层 switch的case 2分支,a又增1,b增1。故答案为A。
(22)B【解析】本题是两个循环语句和一个判断语句的嵌套。对于这类试题,只要考生基础知识扎 实,细心判断,一般是没有多大难度的。For循环的作用是在i等于l0的时候跳出循环。本题的答 案为B。
(23)A【解析】本题编译没有错误,但是执行结果确实错误的。细心的考生可以发现,第一个考生的 乘积输入完之后,sun的值并没有被清空,接着累加第二个考生的分数,随后进行四门平均是错误 的。所以需要内层循环和平均值计算完毕后进行sum的清空。
(24)D【解析】本题实质是考察C语言中的格式化输入和输出。在C++中.输人和输出控制的简易 性有了很大提高,无需用户小心输入.而是由编译系统判断其输人和输出格式,自行进行相应的 处理。
(25)D【解析】本题较为简单.实际上其中的for循环只是起到混淆视听的效果.对结果并没有任何 影响。
(26)B【解析】虚基类主要是为了消除在多重继承中的二义性问题。实际上说某个类是虚基类.并 不是该类本身有什么特殊的地方.而是在继承的时候加上virtual修饰词。虚基类不同于抽象类。虚 基类是可以被实例化的,派生类初始化时,必须列出虚基类的构造函数调用。虚基类对象的初始化 次数只于对象的多少有关,与类的层次结构是没有关系的。故本题正确答案为B。
(27)A【解析】在重载单操作符的过程中,对于像十+和一这样的操作符,不易区分属于前置还是后 置,因此C++规定了用一个虚的形参来区分前置和后置。
(28)C【解析】类和结构体有着密切的血缘关系。类可以看做是将动作和数据都封装的结构体,当然 结构体本身是没有动作的。另外,结构体中的成员对外界访问是没有限制的.而类的成员却是有不 同的访问级别限制。
(29)B【解析】本题考察C++中输入输出流对象的一些常用成员函数的用法。其中get和gctline 的区别在于getline读取中以”\n”作为输入结束符。故本题中getline只能接收第一个换行符之前 的字符,即first。后面的字符被丢弃。因此正确答案应为B。
(30)A【解析】对象的初始化工作由构造函数来完成.析构函数则完成对象销毁前的资源回收等工 作。静态成员函数为同一类中所有对象所共享。
(31)D【解析】 本题需要考生记忆一些输入输出控制操作子.OCt为八进制.setfill为设置填充符,setw 为设置域宽操作子。
(32)B【解析】引用是C++中引入的新概念.可以理解为:看着像变量,实际同指针。故选项A和C 相同,可以排除。在OO开发中,类之间的关系很重要,具体到程序中,类之间的关系就体现为类对 象之问的has a或is a关系上,一个类对象作为另外一个类的成员是很常见的现象。自身类对象做 类的成员将引起无限递归。故本题正确答案为B。
(33)B【解析】虚基类的目标就是要消除二义性。尽管C++或其他OO语言支持多重继承,但在实 际软件开发中多重继承用的并不多,原因在于多重继承过于复杂。因此,在C#中已经不再支持多 重继承了。
(34)C【解析】本题所有选项中均提到了同名数据成员的现象。是否允许同名数据成员存在,关键要 看这种同名现象编译器是否能够判断出来,如果可以判断.则是允许的,否则则是禁止的。
(35)B【解析】 内联iMine函数就是取代宏定义的,在编译时展开,插人到相应的位置,从而减少了系统开 销.加快了执行速度。虚函数则是为了取消二义性现象,静态函数则是一个类所有对象的共享函数。
二、填空题
(1)【l】线性结构 【解析】循环链表是线性表的一种存储结构,因此,循环链表属于线性结构。
(2)【2】面向对象 【解析】程序设计分为面向过程程序设计和面向对象程序设计,具有继承性特点的 程序设计称为面向对象程序设计。
(3)【3】交 【解析】为了在两个关系中提取所有相同的元组,则在交与并这两种关系运算中,应使用 交运算。
(4)【4】时间 【解析】在算法执行过程中所需要的基本运算次数称为算法的时间复杂度。
(5)【5】非格式化 【解析】数据模型分为格式化模型和非格式化模型,关系模型属于非格式化模型。
(6)【6】x<=3|| x>=l0【解析】在3,10之间的区间和之前的两个区间是相反的,故可以写出一个 基本的或表达式。
(7)【7】基类成员类对象成员非类对象成员 【解析】在派生类的初始化过程中,最先初始化的是基类 对象,然后是其他类的对象成员,包括自身类对象的引用或指针,或其他类的对象,最后在是非类对 象成员。析构的时候则反之。
(8)【8】Sample(){} 【解析】尽管系统可以做很多默认的工作,但只是满足了逻辑上的最低要求.其实 就是一些空的框架.虽然没有什么实际使用意义,但却可以满足编译器的最低要求。
(9)【9】iOS【解析】lOS是所有输入输出类的根基类。同时要知道.C++内置了四个输入输出流对象, 可以不用实例化就可以直接使用,如cin,cout,cerr,clog等。
(10)【10】const【解析】const在实际编程中用的比较多,在防止无意中对变量或对象的修改,往往用 const进行限定,从而可以借助C++的强大类型检查功能来防止在程序中带人错误。
(11)【n】Base:97【解析】本题主要考察两个知识点,一是基类指针可以指向派生类对象。并可以访问派生 类的所有成员。二是在函数重载中进行隐式类型转换。如pd一>f(‘a’);系统到底调用哪个重载函数呢? 实参即不是派生类中的形参,也不是基类中f函数的形参类型。此时系统根据就近原则和从高优先级到 低优先级的规则尝试隐式转换。单字符更接近整数,故调用的是基类的f函数。
(12)【12】sum=20【解析】本题考察静态数据成员在同类的不同对象间的数据传递功能。Sum为所 有对象的公共数据,M对象和N对象分别对sum进行累加.故结果为20。
(13)【13】O【解析】 注意本题不同于基类的指针指向派生类对象。Fun函数的形参是Point基类的引 用。在可以用基类对象的地方.均可以用派生类替代,完成基类的行为。反之,在使用派生类对象 的地方却不能用基类对象代替.这是因为派生类中的某些行为在基类对象中是不存在的。本题调 用的是Point类对象的面积函数.其值永远为O。
(14)【14】(ch=filel.get())!=EoF【解析】需要填空的内容是判断文件是否达到结尾,可以使用流 输入的get函数获得当前字符.然后判断该字符是否是EoF即可。
(15)【15】x=l0,y=20【解析】本题比较特殊,考察域作用符的使用规则。其实际含义是:指针先指 向x,然后指向y,并利用该指针分别为x和y赋值。在使用过程中进行了作用域的限定。