【计算机二级C++】题目与C++知识自检
@TOC
公共基础知识
计算机基础
计算机完成一条指令所花费的时间称为
指令周期
顺序程序不具有
并发性
下列叙述中正确的是
C
A. 算法的复杂度与问题的规模无关
B.算法的优化主要通过程序的编制技巧来实现
C.对数据进行压缩存储会降低算法的空间复杂度
D.数值型算法只需要考虑计算结果的可靠性
结构化程序设计强调
程序的易读性
要使用外存储器中的信息,应先将其调入
A
A.内存储器
B.控制器
C.运算器
D.微处理器
进程是
D
A.存放在内存中的程序
B.与程序等效的概念
C.一个系统软件
D.程序的运行过程
结构化程序的三种基本控制结构是
C
A.递归、堆栈、队列
B.调用、返回、转移
C.顺序、选择、重复
D.过程、子函数、函数
理论上计算机虚拟内存的最大容量取决于
计算机地址位数
整数在计算机中存储和运算通常采用的格式是
补码
在操作系统中,将文件名转换为文件存储地址的结构是
文件目录
软件工程的三要素是
方法、工具、过程
I/O方式中使计算机系统并行工作程度最高的是
D
A.DMA
B.程序查询
C.程序中断
D.通道
不属于结构化程序设计原则的是
多态性
进程具有多种属性,并发性之外的另一重要属性是
动态性
CPU芯片内部连接各元件的总线是
D
A.系统总线
B.外围总线
C.外部总线
D.内部总线
如果一个进程在运行时因某种原因暂停,该进程将脱离运行状态进入
C
A.静止状态
B.停止状态
C.阻塞状态
D.就绪状态
下列叙述中正确的是
A
A.进程控制块PCB是进程存在的惟一标志
B.进程创建完成后即进入运行状态
C.处于就绪状态的进程只能有一个
D.处于运行状态的进程当运行时间片用完后将转换为阻塞状态
在软件设计阶段不使用
A
A.DFD图(数据流程图)
B.PAD图
C.程序流程图
D.判定表
下列叙述中正确的是
A
A.处于阻塞状态的进程,当阻塞原因解除后即进入就绪状态
B.进程一旦创建即进入运行状态
C.进程在运行状态下,如果时间片用完即终止
D.进程在就绪状态下,如果时间片用完即终止
解析:处于等待(阻寒)状态的进程,如果它等待的事件已经发生,即条件得到满足,就转为就绪状态。进程创建完成后会进入就绪状态;处于运行状态的进程,分配给它的时间片用完,就让出CPU而转为就绪状态:处于就绪状态的进程,一旦分配到CPU,就转化为运行状态。
下面属于黑盒测试方法的是
D
A.条件覆盖
B.基本路径测试
C.判定覆盖
D.错误推测法
解析:黑盒测试的主要技术有等价类划分法、边界值分析法、错误推测法和因果图等。白盒测试的主要技术有逻辑覆盖测试、基本路径测试,其中逻辑覆盖测试包括语句覆盖、路径覆盖、判定覆盖、条件覆盖、判断-条件覆盖。
下列叙述中正确的是
A
A.在CPU执行一条指令的过程中至少占用一个机器周期
B.在CPU执行一条指令的过程中只需要占用一个机器周期
C.在CPU执行一条指令的过程中至少占用二个机器周期
D.在CPU执行一条指令的过程中只需要占用一个机器周期
机器周期的同步标准是
B
A.CPU执行指令所占用的时间
B.CPU访问存储器一次所需要的时间
C.CPU分析指令所需要的时间
D.CPU访问寄存器一次所需要的时间
数据库
在数据库管理技术发展的三个阶段中,没有专门的软件对数据进行管理的是
人工管理阶段
建立表示学生选修课陈活动的实体联系模型,其中的两个实体分别是
C
A.学生和学号
B.课程和成绩
C.学生和课程
D.课程和课程号
解析:‘“学号”、“成绩”是“学生”的属性,“课程号”是“课程”的属性
数据库管理系统的基本功能不包括
数据库和网络中其他系统的通信
关系数据库规范化的目的是为了解决关系数据库中的
插入、删除异常及数据冗余问题
不属于对象构成成分的是
D
A.标识
B.属性
C.方法(或操作)
D.规则
如果定义班级关系如下:班级(班级号,总人数,所属学院,班级学生),则使它不满足第一范式的属性是
D
A.所属学院
B.班级号
C.总人数
D.班级学生
解析:对于关系模式,若其中的每个属性都已经不能再分为简单项,则它属于第一范式。本题中,在关系模式“班级”中,属性“班级学生”又可以分为“学生学号”和“学生姓名”等,因此不满足第一范式。
下面模型中为概念模型的是
D
A.层次模型
B.关系模型
C.网状模型
D.实体-联系模型
解析:最著名的概念模型有实体-联系模型和面向对象模型。
图书馆管理系统中实体图书和实体借阅人之间的联系是
B
A.N:1
B.M:N
C.1;1
D.1:N
解析:在图书馆管理系统中,一本图书可以被多名借阅人借阅,一名借阅人也可以借多本图书,则图书和借阅人之间的联系是多对多,即M:N。
定义学生选修课程的关系模式如下:SC(S#,Sn,C#,Cn,G,Cr)(其属性分别为学号、姓名、课程号、课程名、成绩、学分),则关系最高是
B
A.2NF
B.1NF
C.3NF
D.BCNF
解析:满足最低要求的叫第一范式,简称1NF。在满足第一范式的甚础上,进一步满足更多要求规范则是第二范式。然后在满足第二范式的甚础上,还可以再满足第三范式,以此类推。 第一范式(1NF):主属性(主键)不为空且不重复,字段不可再分。 第二范式(2NF):如果关系模式是第一范式,每个非主属性都没有对主键的部分依赖。 第三范式(3NF):如果关系模式是第二范式,没有非主属性对主键的传递依赖。 BCNF范式:所有属性都不传递依赖于关系的任何候选键。 本题中关系模式SC的主键为(S#,C#),但“学号”就可以决定"姓名”,"课程号”就可以决定"课程名”,这里有非主属性对主键的部分依赖,不满足第二范式。关系SC最高是1NF。
关系数据模型的三个组成部分中不包括
A
A.关系的并发控制
B.关系的数据操纵
C.关系的数据结构
D.关系的完整性约束
数据库概念设计阶段得到的结果是
C
A.关系模型
B.数据字典
C.E-R模型
D.物理模型
在关系数据库中,描述全局数据逻辑结构的是
C
A.内模式
B.用户模式
C.概念模式
D.物理模式
将实体-联系模型转换为关系模型时,实体之间多对多联系在关系模型中的实现方式是
A
A.建立新的关系
B.建立新的属性
C.增加新的关键字
D.建立新的实体
将数据库的结构划分成多个层次,是为了提高数据库的逻辑独立性和
B
A.安全性
B.物理独立性
C.操作独立性
D.管理规范性
用树型结构表示实体之间联系的模型是
A
A.层次模型
B.关系模型
C.网状模型
D.运算模型
解析:用网状结构表示实体及其之间联系的模型称为网状模型,关系模型则采用二维表来表示关系。
规范化主要为克服数据库逻辑结构中的插入异常,删除异常以及
A
A.冗余度大的问题
B.结构不合理的问题
C.数据不一致的问题
D.数据丢失的问题
学生和课程的关系模式定义为 S(S#,Sn,Sd,Dc,S)(其属性分别为学号、姓名、所在系、所在系的系主任、年龄); C(C#,Cn,P#)(其属性分别为课程号、课程名、先选课); SC(S#,C#,G)(其属性分别学号、课程号和成绩)。 关系中包含对主属性传递依赖的是
B
。A.S#→Sd
B.S#→Sd,Sd→Dc
C.S#→Sd,(S#,C#)→G
D.C#→P#,(S#,C#)→G
解析:在关系模式中,如果Y→X,X→A,且X不决定Y,A不属于X,那么Y→A是传递依赖。在关系模式S中,S#→Sd,Sd→Dc,且Sd不决定S#,DC不属于Sd,那么S#→Dc是传递依赖。
数据结构
树
设某棵树的度为3,其中度为3,2,1的结点个数分别为3,0,4。则该树中叶子结点的个数为
7
解析:叶子节点就是度为0的结点,假设共有n个叶子节点。接下来计算树的所有结点的个数,可以列出方程:
在具有2n个结点的完全二叉树中,叶子结点的个数为
n
某二叉树具有12个结点,其中只有1个叶子结点。则该二叉树的深度为
D
A.3
B.6
C.8
D.12
解析:对任何一棵二叉树,度为0的结点(即叶子结点)总是比度为2的结点多一个。本题中,叶子结点 个数为1,则度为2的结点个数为0,所以有11个度为1的结点,所以深度为12
链表
在长度为n的有序链表中进行查找,最坏情况下需要比较的次数为
n
下列叙述中正确的是
A
A.在栈中,栈顶指针的动态变化决定栈中元素的个数
B.在循环队列中,队尾指针的动态变化决定队列的长度
C.在循环链表中,头指针和链尾指针的动态变化决定链表的长度
D.在线性链表中,头指针和链民指针的动态变化决定链表的长度
解析:在栈中,栈顶指针动态反映了栈中元素的变化情况,A选项叙述正确。在循环队列中,队尾指针和队头指针的动态变化决定队列的长度,B选项叙述错误。在链式存储结构中,无论是循环链表还是线性链表,插入和移除元素时,只需要改变相应位置的结点指针即可,头指针和尾指针无法确定链表的长度,C、D选项叙述错误。
排序
对长度为8的数组进行快速排序,最多需要的比较次数为
28
解析:对长度为的线性表进行快速排序,最坏情况下需要比较的次数为(n-1)/2。数组属于线性表,故对长度为8的数组进行快速排序,最多需要的比较次数为8(8-1)/2=28。
在快速排序法中,每经过一次数据交换(或移动)后
能消除多个逆序
设顺序表的长度为16,对该表进行简单插入排序。在最坏情况下需要比较的次数是
120
解析:对长度为n的线性表进行简单插入排序,最坏情况下需要比较的次数为n(n-1)/2。
队列
下列关于循环队列叙述正确的是
A
A.循环队列是队列的一种顺序存储结构
B.循环队列是队列的一种链式存储结构
C.循环队列中的队尾指针一定大于队头指针
D.循环队列中的队尾指针一定小于队头指针
循环队列的存储空间为Q(1:50),初始状态为空。经过一系列正常的入队与退队操作后,front=24,rear=25。此时该循环队列中的元素个数为
1
解析:若循环队列的存储空间为(1:m),在循环队列运转起来后,如果front<rear,则队列中的元素个数为rear-front。如果front>rear,则队列中的元素个数为rear-front+m。
循环队列的存储空间为Q(1:50)。经过一系列正常的入队与退队操作后,front=rear=25。后又成功地将一个元素入队,此时队列中的元素个数为
1
设循环队列的存储空间为Q(1:m),当front=rear=m时,循环队列为空:当front=rear且不等于m时,循环队列可能为空,也可能为满。当为空时,可以插入元素:当为满时,插入元素会发生"上溢”错误。题目中已经说明“成功地将一个元素入队”,说明之前循环队列的状态为空,插入一个元素后,队列中共有1个元素。
某带链的队列初始状态为front=rear=NULL。经过一系列正常的入队与退队操作后,front=10,rear=5。该队列中的元素个数为
D
A.4
B.5
C.6
D.不确定
栈
设栈的存储空间为S(1:50),初始状态为top=51。现经过一系列正常的入栈和出栈后,top=50,则栈中元素个数为
1
栈的存储空间为S(1:50),初始状态为top=51,即栈的初始状态为空。当第一个元素进栈后,top=50,第二个元素进栈后,top=49,第三个元素进栈后,top=48,以此类推;若第三个元素出栈后,top=48,第二个元素出栈后,top=50。即每进栈一个元素,top-1;每出栈一个元素,top+1。当top=50时,栈中只有一个元素。
带链栈(队列)空的条件是
D
A.top=bottom=-1
B.top=-1且bottom=NULL
C.top=NULL且bottom=-1
D.top=bottom=NULL
解析:带链的栈是具有栈属性的链表。线性链表的存储单元是不连续的。因为是不连续的存储空间,所以指针将不会有规律地连续变化。当top=bottom=NULL时,栈为空:当top=bottom且不等于NULL时,栈中存在一个元素,其他情况无法判断。
C++
const与static
下列语句中错误的是
B
A.const int buffer=256;
B.const int temp;
C.const double *p;
D.const double *rt=new double(5.5);
由于常对象不能被更新,因此
A
A.通过常对象只能调用它的常成员函数
B.通过常对象只能调用静态成员函数
C.常对象的成员都是常成员
D.通过常对象可以调用任何不改变对象值的成员函数
下列关于虚函数的说明中,正确的是
B
A.从虚基类继承的函数都是虚函数
B.虚函数不得是静态成员函数
C.只能通过指针或者引用来调用虚函数
D.抽象类中的成员函数都是虚函数
有如下的类的定义:
能被正确编译的语句是D
下列语句中,错误的是
D
A.const int buffer=256;
B.const double * point;
C.int const buffer =256;
D.double * const point;
解析:D为指针常量,即不能修改所指向内容的指针,必须初始化
指针
有如下程序:
编译运行程序将出现的情况是D
A.编译时出现语法错误,不能生成可执行文件
B.运行时一定输出:The value at p:9
C.运行时一定输出:The value at p:*9
D.运行有可能出错
下列关于this指针的描述中,正确的是
D
A.类的成员函数都有this指针
B.类的友元函数都有this指针
C.任何与类相关的函数都有this指针
D.类的非静态成员函数都有this指针
已知有数组定义:
下列表达式中错误的是A
A.a[0]="AAA"
B.strcpy(a[1],"BBB")
C.a[2][3]='C'
D.a[1][1]=a[2][2]
解析:在C++中,数组是不能被赋值的,所以代码中的 a[0]=str1; 是错误的。如果你想将 str1 的值复制到 a[0] 中,可以使用字符串库函数 strcpy。
函数
下列关于C++函数的说明中,正确的是
C
A.内联函数就是定义在另一个函数体内部的函数
B.函数体的最后一条语句必须是return语句
C.标准C++要求在调用一个函数之前,必须先声明其原型
D.编译器会根据函数的返回值类型和参数表来区分函数的不同重载形式
下列有关内联函数的叙述中,正确的是
C
A.内联函数在调用时发生控制转移
B.内联函数必须通过关键字inline定义
C.内联函数是通过编译器来实现的
D.内联函数的函数体的最后一条语句必须是return语句
下列说法正确的是
B
A.内联函数在运行时是将该函数的目标代码插入每个调用该函数的地方
B.内联函数在编译时是将该函数的目标代码插入每个调用该函数的地方
C.类的内联函数必须在类体内定义
D.类的内联函数必须在类体外通过加关键字inline定义
下面对于友元函数描述正确的是
C
A.友元函数的实现必须在类的内部定义
B.友元函数是类的成员函数
C.友元函数破坏了类的封装性和隐藏性
D.友元函数不能访问类的私有成员
关于函数声明格式中的<返回类型>,下列叙述错误的是
A
A.<返回类型>有可能包含关键字true
B.<返回类型>有可能包含自定义标识符
C.<返回类型>有可能包含字符*
D.<返回类型>有可能包含关键字float
重载
运算符重载是对已有的运算符赋予多重含义,因此
C
A.可以对基本类型(如int类型)的数据,重新定义“+”运算符的含义
B.可以改变一个已有运算符的优先级和操作符个数
C.只能重载C++中已经有的运算符,不能定义新的运算符
D.C++中已经有的所有运算符都可以重载
下列运算符不能重载为友元函数的是
A
A.= () [] ->
B.+ - ++ --
C.> < >= <=
D.+= -= *= /=
解析:成员函数运算符重载时,运算符左值类型必须为所在类类型;而友元函数运算符重载则不必。 一般来说,对于双目运算符,应当将其重载为友元函数,而对于单目运算符,则应将其重载为成员函数。 但这也不是绝对的:“=”、“ []”、“->”和“ ()”是必须重载为成员函数的;“<<”、“>>”是必须重载为友元函数的。
PS:若运算符重载为成员函数,那么这个运算符的操作数上限等于其参数表的个数+1;若运算符重载为友元函数,那么这个运算符的操作数上限等于其参数表的个数。
PS:重载运算符不能有默认参数
PS:不能重载的运算符有:
.
、.*
、::
、?:
、sizeof
通过运算符重载,可以改变运算符原有的
A
A.操作数类型
B.操作数个数
C.优先级
D.结合性
有如下的类的定义:
若要为Myclass类重载流输入运算符">>",使得程序中可以"cin>>data;"的形式改变Myclass类的对象中数据成员data的值,则空缺处的声明语句应该为A
A.friend istream& operator >> (istream& is, Myclass& a);
B.friend istream& operator >> (istream& is, Myclass a);
C.istream& operator >> (istream& is, Myclass& a);
D.istream& operator >> (istream& is, Myclass a);
对C++编译器区分重载函数无任何意义的信息是
返回值类型
构造与析构
有如下的类的定义:
如果执行语句
则Point类的构造函数被调用的次数是4
下列情况中,不会调用拷贝构造函数的是
B
A.用一个对象去初始化同一类的另一个新对象时
B.将类的一个对象赋值给该类的另一个对象时
C.函数的形参是类的对象,调用函数进行形参和实参结合时
D.函数的返回值是类的对象,函数执行返回调用时
下列关于派生类构造函数和析构函数的说法中,错误的是
D
A.派生类的构造函数会隐含调用基类的构造函数
B.如果基类中没有缺省构造函数,那么派生类必须定义构造函数
C.在建立派生类对象时,先调用基类的构造函数,再调用派生类的构造函数
D.在销毁派生类对象时,先调用基类的析构函数,再调用派生类的析构函数
对于一个类定义,下列叙述中错误的是
B
。A.如果没有定义拷贝构造函数,编译器将生成一个拷贝构造函数
B.如果没有定义缺省的构造函数,编译器一定将生成一个缺省的构造函数
C.如果没有定义构造函数,编译器将生成一个缺省的构造函数和一个拷贝构造函数
D.如果已经定义了构造函数和拷贝构造函数,编译器不会生成任何构造函数
多态、继承、权限
下列关于基类和派生类关系的叙述中,正确的是
D
A.每个类最多只能有一个直接基类
B.派生类中的成员可以访问基类中的任何成员
C.基类的构造函数必须在派生类的构造函数体中调用
D.派生类除了继承基类的成员,还可以定义新的成员
下列关于类定义的说法中,正确的是
B
A.类定义中包括数据成员和函数成员的声明
B.类成员的缺省访问权限是保护的
C.数据成员必须被声明为私有的
D.成员函数只能在类体外进行定义
如果派生类以protected方式继承基类,则原基类的protected成员和oublic成员在派生类中的访问属性分别是
D
A.public和public
B.public和protected
C.protected和public
D.protected和protected
下列有关继承和派生的叙述中,正确的是
C
A.派生类不能访问基类的保护成员
B.作为虚基类的类不能被实例化
C.派生类应当向基类的构造函数传递参数
D.虚函数必须在派生类中重新实现
解析:派生类可以访问基类的保护成员,而不能访问基类的私有成员。作为虚基类的类可以被实例化。虚函数如果没有派生类中重新实现,那么仍然使用基类的成员函数。
下列代码段中声明了3个类:
下列关于这些类之间关系的描述中,错误的是B
A.类Person是类Undergraduate的基类
B.类Undergraduate从类Student公有继承
C.类Student是类Person的派生类
D.类Undergraduate是类Person的派生类
解析:如果没有指明哪种继承方式,那么默认为私有继承。
下列有关类继承的叙述中,错误的是
D
A.继承可以实现软件复用
B.虚基类可以解决由多继承产生的二义性问题
C.派生类构造函数要负责调用基类的构造函数
D.派生类没有继承基类的私有成员
解析:3种继承方式中,派生类继承了基类的私有成员,但不能被直接访问,可以通过派生类的友元函数去访问基类的私有成员。
下列关于虚基类的描述,错误的是
B
A.设置虚基类的目的是为了消除二义性
B.虚基类的构造函数在非虚基类之后调用
C.若同一层中包含多个虚基类,这些虚基类的构造函数按它们说明的次序调用
D.若虚甚类由非虚甚类派生而来,则仍然先调用基类构造函数,再调用派生类的构造函数
下列关于多态性的描述,错误的是
C
A.C++语言中的多态性分为编译时的多态性和运行时的多态性
B.编译时的多态性可通过函数重载实现
C.运行时的多态性可通过模板和虚函数实现
D.实现运行时多态性的机制称为动态绑定
编译时的多态性是通过函数重载和模板体实现的,运行时的多态性是通过虚函数体实现的。
下列关于继承和派生的叙述中,正确的是
D
A.派生类中新定义的成员函数可以访问基类的所有成员
B.在私有继承的情况下,派生类中新定义的成员函数不能访问基类的保护成员
C.基类对像可以赋值给派生类对象
D.如果派生类没有实现基类的一个纯虚函数,则该派生类是一个抽象类
数据类型
下列各组类型声明符中,含义相同的一组是
B
A.unsigned long int 和 long
B.signed short int 和 short
C.unsigned short 和 short
D.short int 和 int
输入输出流
下列关于C++预定义流对象的叙述中,正确的是
A
A.cin是C++预定义的标准输入流对象
B.cin是C++预定义的标准输入流类
C.cout是C++预定义的标准输入流对象
D.cout是C++预定义的标准输入流类
有如下语句序列:
当从键盘输入"I love this game"时,str中的字符串是D
A."I love this game"
B."I love thi"
C."I love"
D."I"
解析:cin是C++预定义的标准输入流对像,cin用来接收字符串时,遇“空格”、“TAB”、“回车”时都会结束。
C++系统预定义了4个用于标准数据流的对象,下列选项中不属于此类对象的是
D
A.cout
B.cin
C.cerr
D.cset
解析:C++标准数据流对象分别是cout、cin、cerr、clog
下列语句都是程序运行时的第1条输出语句,其中一条语句的输出效果与其他三条语句不同,该语句是
D
A.cout<<internal<<12345
B.cout<<left<<12345
C.cout<<right<<12345
D.cout<<setw(6)<<12345
解析:A、B、C选项都会输出"12345",D选项会输出" 12345"
模板
下列有关模板的叙述中,正确的是
B
A.函数模板不能含有常规形参
B.函数模板的一个实例就是一个函数定义
C.类模板的成员函数不能是模板函数
D.用类模板定义对象时,绝对不能省略模板实参
下列关于函数模板的叙述中,错误的是
D
A.从模板实参表和从模板函数实参表获得信息矛盾时,以模板实参的信息为准
B.对于常规参数所对应的模板实参,任何情况下都不能省略
C.虚拟类型参数没有出现在模板函数的形参表中时,不能省略模板实参
D.模板实参表不能为空
Last updated