最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 正文

历年计算机二级c++题库

来源:动视网 责编:小OO 时间:2025-09-26 05:23:33
文档

历年计算机二级c++题库

1、下列叙述中正确的是______。A、栈是"先进先出"的线性表B、队列是"先进后出"的线性表C、循环队列是非线性结构D、有序线性表既可以采用顺序存储结构,也可以采用链式存储结构栈是一种特殊的线性表,这种线性表只能在固定的一端进行插入和删除操作,允许插入和删除的一端称为栈顶,另一端称为栈底。一个新元素只能从栈顶一端进入,删除时,只能删除栈顶的元素,即刚刚被插入的元素。所以栈又称"后进先出"表,所以选项A是错误的。队列可看作是插入在一端进行,删除在另一端进行的线性表,允许插入的一端称为队尾,允许
推荐度:
导读1、下列叙述中正确的是______。A、栈是"先进先出"的线性表B、队列是"先进后出"的线性表C、循环队列是非线性结构D、有序线性表既可以采用顺序存储结构,也可以采用链式存储结构栈是一种特殊的线性表,这种线性表只能在固定的一端进行插入和删除操作,允许插入和删除的一端称为栈顶,另一端称为栈底。一个新元素只能从栈顶一端进入,删除时,只能删除栈顶的元素,即刚刚被插入的元素。所以栈又称"后进先出"表,所以选项A是错误的。队列可看作是插入在一端进行,删除在另一端进行的线性表,允许插入的一端称为队尾,允许
1、下列叙述中正确的是______。

A、栈是"先进先出"的线性表

B、队列是"先进后出"的线性表

C、循环队列是非线性结构

D、有序线性表既可以采用顺序存储结构,也可以采用链式存储结构

    栈是一种特殊的线性表,这种线性表只能在固定的一端进行插入和删除操作,允许插入和删除的一端称为栈顶,另一端称为栈底。一个新元素只能从栈顶一端进入,删除时,只能删除栈顶的元素,即刚刚被插入的元素。所以栈又称"后进先出"表,所以选项A是错误的。

    队列可看作是插入在一端进行,删除在另一端进行的线性表,允许插入的一端称为队尾,允许删除的一端称为队头。在队列中,只能删除队头元素,队列的最后一个元素一定是最新入队的元素。因此队列又称"先进先出"表,所以选项B是错误的。

    循环队列是将队列存储空间的最后一个位置绕到第一个位置,形成逻辑上的环状空间,供队列循环使用。它的逻辑结构仍然是线性结构,所以选项C是错误的。

    有序线性表既可以采用顺序存储结构,也可以采用链式存储结构,所以选项D是正确的。

故本题答案为D。

2、将E-R图转换为关系模式时,实体和联系都可以表示为______。

A、属性

B、键

C、关系

D、域

    将E-R图转换为关系模式时,实体和联系都可以表示成关系,E-R图中属性也可以转换成关系的属性。实体集也可以转换成关系。

故本题答案为C。

3、下面叙述中错误的是______。

A、软件测试的目的是发现错误并改正错误

B、对被调试的程序进行"错误定位"是程序调试的必要步骤

C、程序调试通常也称为Debug

D、软件测试应严格执行测试计划,排除测试的随意性

    1983年IEEE将软件测试定义为:使用人工或自动手段来运行或测定某个系统的过程,其目的在于检验它是否满足规定的需求或是弄清预期结果与实际结果之间的差别。因此选项A的叙述是错误的。

    软件测试的基本准则为:①所有测试都应追溯到需求。②严格执行测试计划,排除测试的随意性。③充分注意测试中的群集现象。④程序员应避免检查自己的程序。⑤穷举测试不可能。⑥妥善保存测试计划、测试用例、出错统计和最终分析报告,为维护提供方便。因此选项D正确。

    在对程序进行了成功的测试之后将进入程序调试(通常称Debug,即排错)。因此选项C正确。

    程序调试的任务是诊断和改正程序中的错误。程序调试的基本步骤:①错误定位。②修改设计和代码,以排除错误。③进行回归测试,防止引进新的错误。因此选项B是正确的。

    故本题答案为A。

4、下列排序方法中,最坏情况下比较次数最少的是______。

A、冒泡排序

B、简单选择排序

C、直接插入排序

D、堆排序

    (1)冒泡排序法:是一种最简单的交换类排序法,它是通过相邻数据元素的交换逐步将线性表变成有序。假设线性表的长度为n,则在最坏情况下,冒泡排序需要经过n/2遍的从前往后的扫描和n/2遍的从后往前的扫描,需要比较的次数为n(n-1)/2次。

    (2)简单插入排序法:在简单插入排序法中,每一次比较后最多移掉一个逆序,因此,这种排序方法的效率与冒泡排序法相同。在最坏情况下,简单插入排序需要n(n-1)/2次比较。

    (3)简单选择排序法:对于长度为n的序列,选择排序需要扫描n-1遍,每一遍扫描均从剩下的子表中选出最小的元素,然后将该最小的元素与子表中的第一个元素进行交换。简单选择排序法在最坏情况下需要比较n(n-1)/2次。

    (4)堆排序法:堆排序的方法为:①首先将一个无序序列建成堆。②然后将堆顶元素(序列中的最大项)与堆中最后一个元素交换(最大项应该在序列的最后)。在最坏情况下,堆排序需要比较的次数为。

    假设线性表的长度为16,那么冒泡排序、直接插入排序、简单选择排序都需要比较120次,而堆排序需要比较次。

    故本题答案为D。

5、耦合性和内聚性是对模块性度量的两个标准。下列叙述中正确的是______。

A、提高耦合性降低内聚性有利于提高模块的性

B、降低耦合性提高内聚性有利于提高模块的性

C、耦合性是指一个模块内部各个元素间彼此结合的紧密程度

D、内聚性是指模块间互相连接的紧密程度

    内聚性:内聚性是一个模块内部各个元素间彼此结合的紧密程度的度量。耦合性:耦合性是模块间互相连接的紧密程度的度量。因此选项C、D是错误的。在程序结构中,各模块的内聚性越强,则耦合性越弱。一般较优秀的软件设计,应尽量做到高内聚,低耦合,即减弱模块之间的耦合性和提高模块内的内聚性,有利于提高模块的性。因此选项A是错误的,应该降低耦性合提高内聚性,所以选项B是正确的。

    故本题答案为B。

6、有两个关系R,S如下:

          R                  S

          

由关系R通过运算得到关系S,则所使用的运算为______。

A、选择

B、投影

C、插入

D、连接

    专门的关系运算包括:选择、投影和连接。1、选择:从关系中找出满足给定条件的元组的操作称为选择。选择是从行的角度进行的运算,即从水平方向抽取记录。2、投影:从关系模式中指定若干个属性组成新的关系。投影是从列的角度进行的运算,相当于对关系进行垂直分解。3、连接:连接是关系的横向结合。连接运算将两个关系模式拼接成一个更宽的关系模式,生成的新关系中包含满足连接条件的元组。连接过程是通过连接条件来控制的,连接条件中将出现两个表中的公共属性名,或者具有相同语义、可比的属性。选择和投影运算的操作对象只是一个表。相当于对一个二维表进行切割。连接运算需要两个表作为操作对象。

    由图可知关系R通过运算得到关系S,关系S与关系R相比,记录的条数没有发生变化,属性的个数发生了变化。因此所使用的运算应该是投影。选项C插入运算会增加记录的条数。所以选项B是正确的。

故本题答案为B。

7、数据库应用系统中的核心问题是______。

A、数据库设计

B、数据库系统设计

C、数据库维护

D、数据库管理员培训

    数据库应用系统是数据库系统再加上应用软件及应用界面这三者所组成,具体包括:数据库、数据库管理系统、数据库管理员、硬件平台、软件平台、应用软件、应用界面。在数据库应用系统中的一个核心问题就是设计一个能满足用户要求,性能良好的数据库,这就是数据库设计。所以选项A是正确的。

故本题答案为A。

8、支持子程序调用的数据结构是______。

A、栈

B、树

C、队列

D、二叉树

    子程序调用是一种层次关系,子程序调用功能模块,调用功能模块的个数也不确定,可以是一个,也可以是多个。选项A、C中元素之间是一种前后件关系,前后元素之间没有层次之分,每个结点有一个前件也只有一个后件。二叉树是一种很有用的非线性结构,二叉树不同于树形结构。二叉树具有以下两个特点:①非空二叉树只有一个根结点;②每一个结点最多有两棵子树,且分别称为该结点的左子树与右子树。选项D规定每个结点只能有两个后件。在子程序调用中,调用的功能模块可以是多个,可以调用超过两个功能模块。所以选项A、C、D均不正确。

故本题答案为B。

9、某二叉树有5个度为2的结点,则该二叉树中的叶子结点数是______。

A、10

B、8

C、6

D、4

    在任意一棵二叉树中,度为0的结点(即叶子结点)总是比度为2的结点多一个。本题中度为2的结点数为5,故叶子结点数为5+1=6个。

故本题答案为C。

10、软件按功能可以分为:应用软件、系统软件和支撑软件(或工具软件)。下面属于应用软件的是______。

A、编译程序

B、操作系统

C、教务管理系统

D、汇编程序

    软件按功能可以分为:应用软件、系统软件、支撑软件(或工具软件)。应用软件是为解决特定领域的应用而开发的软件。例如,事务处理软件、工程与科学计算软件,实时处理软件,嵌入式软件,人工智能软件等应用性质不同的软件。因此选项C教务管理系统属于应用软件。系统软件是计算机管理自身资源,提高计算机使用效率并为计算机用户提供各种服务的软件。如操作系统,编译程序,汇编程序,网络软件,数据库管理系统等。因此选项A、B、D都属于系统软件。

故本题答案为C。

11、有如下程序:

#include

using namespace std;

class ONE{

      int c;

public:

ONE():c(0){cout<<1;}

ONE(int n):c(n){cout<<2;}

};

class TWO{

      ONE one1;

      ONE one2;

public:

TWO(int m):one2(m){cout<<3;}

};

int main(){

      TWO t(4);

      return 0;

}

运行时的输出结果是______。

A、3

B、23

C、123

D、213

    本题主要考查了成员对象。

    当一个类的成员是另外一个类的对象时,该对象就称为成员对象。建立一个类的对象时,要调用它的构造函数。如果这个类有成员对象,要首先执行所有的成员对象的构造函数,当全部成员对象的初始化都完成之后,再执行当前类的构造函数体。当类中有多个成员对象时,要按照定义成员对象的顺序建立各个子对象,即成员对象构造函数的执行顺序仅与成员对象在类中声明的顺序有关,而与成员初始化列表中给出的成员对象的顺序无关。如果在构造函数的成员初始化列表中没有给出对成员对象的初始化,则表示使用成员对象的缺省构造函数。如果所有的成员对象都是调用缺省构造函数建立的,那么该类的构造函数的成员初始化列表可以省略。类TWO的数据成员是类ONE的对象one1和one2,main()函数中首先创建类TWO的对象t并提供初始值4,先执行成员对象one1的构造函数体,输出1;再执行成员对象one2的构造函数体,输出2,最后执行类TWO的构造函数体,输出3。因此本题程序运行时的输出结果是123。

    故本题答案为C。

12、假设下列语句都是程序运行后首次执行的输出语句,其中输出结果与另外三条语句不同的语句是______。

A、cout<B、cout<C、cout<<123<D、cout<    本题主要考查了输出格式控制。

    操纵符setw为紧随其后的输出项指定输出宽度,在一个域输出完后,域宽度恢复成它的默认值0,输出项默认对齐方式为右对齐,操纵符setfill的作用是设置填充字符。因此选项A、选项B和选项D的输出结果都为123******321,而选项C的输出结果为123***321。

    故本题答案为C。

13、已知表达式++a中的"++"是作为成员函数重载的运算符,则与++a等效的运算符函数调用形式为______。

A、a.operator++(1)

B、operator++(a)

C、operator++(a,1)

D、a.operator++()

    本题主要考查了运算符重载。

    C++把重载的运算符视为特殊的函数,称为运算符函数,函数名就是在运算符前加上保留字operator。一般而言,如果a是类X的对象,在类X中重载前置单目运算符@,则下列两种函数调用方法是等价的:

    第一种是通过运算符构成表达式的形式进行调用, 即@a;

    第二种是像一般函数那样用函数名进行调用:当把@作为成员函数重载时,调用形式为a.operator @();当把@作为非成员函数重载时,调用形式为operator @(a)。本题是把前置单目运算符++重载为成员函数,因此与表达式++a等效的表示为a.operator ++()。

    故本题答案为D。

14、已知有数组定义

char a[3][4];

下列表达式中错误的是______。

A、a[2]="WIN"

B、strcpy(a[2],"WIN")

C、a[2][3]='W'

D、a[0][1]=a[0][1]

    本题主要考查了数组。

    如果把二维数组a[3][4]看作3行4列矩阵,a[2]是第三行数据的首地址,是一个常量,不能对其赋值。

本题答案为A。

15、运算符重载时不需要保持的性质是______。

A、操作数个数

B、操作数类型

C、优先级

D、结合性

    本题主要考查了运算符重载。

    重载的运算符应尽可能保持其原有的基本语义,重载的运算符应该体现为原运算符的功能在新的数据类型上的延伸。重载的运算符应尽可能保持其原有的特性,运算符的操作数个数、优先级和结合性是三个最基本的特性。因此运算符重载时不需要保持的性质是操作数类型。

故本题答案为B。

16、当使用ifstream流类定义一个流对象并打开一个磁盘文件时,文件的默认打开方式为______。

A、ios_base::in

B、ios_base::in│ios_base::out

C、ios_base::out

D、ios_base::in & ios_base::out

    本题主要考查了文件输入流。

    当使用ifstream流类定义一个流对象并打开一个磁盘文件时,文件的默认打开方式为ios_base::in。

故本题答案为A。

17、有如下类定义和变量定义:

class Parents{

  public:

         int publicData;

  private:

         int privateData;

};

class ChildA:public Parents{/*类体略*/};

class ChildB:private Parents{/*类体略*/};

ChildA a;

ChildB b;

下列语句中正确的是 ______。

A、cout<B、cout<C、cout<D、cout<    本题主要考查了派生类对基类成员的访问。

    基类中公有成员在派生类中的访问控制属性将随着继承方式而改变:派生类从基类公有继承时,基类的公有成员在派生类中仍然是公有成员;派生类从基类私有继承时,基类的公有成员在派生类中改变为私有成员。通过类的对象只能访问类的公有成员,故选项A是正确的。

故本题答案为A。

18、有如下程序段:

int i=4;int j=1;

int main() {

int i=8,j=i;

cout<}

运行时的输出结果是______。

A、44

B、41

C、88

D、81

    本题主要考查了变量的作用域与可见性。

    在C++中,作用域可见性的规则之一是:如果在两个或多个具有包含关系的作用域中声明了同名标识符,则外层标识符在内层不可见。本题中,在main()函数之前声明的变量i和j具有文件作用域。它的有效范围是整个源代码文件。在main()函数中又声明了同名变量i和j并赋初值均为8,其作用域为函数块,有效范围为整个函数体。因为具有块作用域的变量隐藏了具有文件作用域的同名变量,所以main()函数中第二条输出语句中的变量i和j指的是在main()函数中声明的变量i和j,故程序运行时的输出结果是88。

故本题答案为C。

19、已知类MyClass声明如下:

class MyClass{

       int n;

public:

       MyClass(int k):n(k){}

       int getValue()const{return n;}

};

在下列数组定义中正确的是______。

A、MyClass x1[2];

B、MyClass x2[2]={new MyClass(1),new MyClass(2)};

C、MyClass *x3[2];

D、MyClass *x4[2]={MyClass(1),MyClass(2)};

    本题主要考查了对象数组、指针数组和new运算符。

    new运算符返回指向指定类型的一个指针。对象数组是指数组元素为对象的数组,该数组中的每一个元素都是同一个类的对象。定义对象数组时,系统将自动调用构造函数创建每一个对象元素,因为类MyClass中定义了一个有一个整型参数的构造函数,编译器将不再为其生成缺省构造函数,所以定义对象数组时必须分别调用有参构造函数为每一个数组元素指定初始值。因此选项A错误,没有初始化对象数组;选项B中,用指向对象的指针初始化对象数组,类型不匹配,因此选项B错误;指针数组是由指针组成的数组,即数组中的每一个元素都是指向同一类型对象的指针。选项C定义了指向MyClass类对象的指针数组x3,该定义语句正确;选项D中,只能用指向MyClass类对象的指针或用已有的MyClass类对象的地址来初始化指针数组x4的每一个元素,不能用对象进行初始化,因此选项D错误。

故本题答案为C。

20、有如下程序:

#include

#include

using namespace std;

class XCF {

       int a;

public:

XCF(int aa=0): a(aa){cout<<"1";}

XCF(XCF& x){a=x.a; cout<<"2";}

~XCF(){cout<       int Geta(){return a;}

};

int main(){

       XCF d1(5),d2(d1);

       XCF *pd=new XCF(8);

cout<Geta();

       delete pd;

       return 0;

}

运行时的输出结果是______。

A、1215588

B、1218855

C、12185

D、128512

    本题主要考查了构造函数、拷贝构造函数和析构函数。

    构造函数在对象被创建的时候由系统自动调用,析构函数在对象的生存期即将结束的时刻被系统自动调用,拷贝构造函数发生在用一个已知的对象初始化一个正在创建的同类对象的时候。在main()函数中,语句XCF d1(5),d2(d1);先后创建了两个对象d1和d2。在创建对象d1时,系统自动调用了构造函数,d1数据成员a的值为5,输出字符1;在创建对象d2时是用已创建的对象d1初始化,系统自动调用拷贝构造函数,对象d2数据成员a的值为5,输出字符2;然后执行语句XCF *pd=new XCF(8);系统再次调用构造函数通过new运算符动态创建了一个XCF类的对象,该对象的数据成员a的值为8,输出字符1,并将首地址赋给XCF类的指针pd。成员函数Geta()的功能是获取数据成员a,因此执行语句cout<Geta();输出8。接着执行语句delete pd;系统自动调用析构函数,输出指针pd所指向对象的数据成员a,即输出8,当main()函数结束时,系统先自动调用析构函数删除对象d2,输出对象d2的数据成员a的值5,然后再次调用析构函数删除对象d1,输出对象d1的数据成员a的值5。因此程序输出结果为1218855。

    故本题答案为B。

21、已知函数fun的原型为

int fun (int,int,int);

下列重载函数原型中错误的是______。

A、char fun(int,int);

B、double fun(int,int,double);

C、int fun(int,clar*); 

D、float fun(int,int,int);

    本题主要考查了函数重载。

    函数重载允许用同一个函数名定义多个函数。被重载的函数必须要有不同的形参列表(即参数个数不同或参数类型不同),不可以根据函数返回值类型来重载函数。

故本题答案为D。

22、下列关于函数模板的描述中,错误的是______。

A、从模板实参表和从模板函数实参表获得信息矛盾时,以模板实参的信息为准

B、对于常规参数所对应的模板实参,任何情况下都不能省略

C、虚拟类型参数没有出现在模板函数的形参表中时,不能省略模板实参

D、模板参数表不能为空

    本题主要考查了函数模版。

    在调用一个模板函数时,编译系统需要足够的信息来判别每个虚拟类型参数所对应的实际类型,可以从两个不同的渠道获得这样的信息:从模板实参表(用<和>括起来的参数表)或从模板函数实参表(用(和)括起来的参数表),模板实参的信息优先于函数实参的信息,因此选项A正确。如果从后者获得的信息已经能够判定其中部分或全部虚拟类型参数所对应的实际参数,而且它们又正好是参数表中最后的若干参数,则模板实参表中的那几个参数可以省略。如果模板实参表中的实参都被省略了,则空表<>也可以不要,因此选项D错误。反之,对于某个模板实参,如果从模板函数的实参表中无法获得同样的信息,就不能省略;或者虽然能够获得同样的信息,但在它后面还有其他不能省略的实参,则其自身还是不能省略。下面列举几种模板实参不能省略的情况。①从模板函数实参表获得的信息有矛盾。②需要获得特定类型的返回值,而不管参数的类型如何。③虚拟类型参数没有出现在模板函数的形参表中,因此选项C正确。④函数模板含有常规形参,因此选项B正确。

    故本题答案为D。

23、有如下程序:

#include

using namespace std;

class Pair{

      int m;

      int n;

public:

      Pair(int i,int j):m(i),n(j){}

bool operator >(Pair p)const; //须在类体外给出定义

};

int main(){

      Pair p1(3,4),p2(4,3),p3(4,5);

cout<<(p1>p2)<<(p2>p1)<<(p2>p3)<<(p3>p2);

      return 0;

}

运算符函数operator>的功能是比较两个Pair对象的大小,当左边对象大时,返回true,否则返回false。比较规则是首先比较两对象的m成员,m大者为大;当m相等时比较n,n大者为大。程序输出0101,下列对运算符重载函数的正确定义是______。

A、bool Pair::operator >(Pair p)const

{if (m!=p.m) return m>p.m; return n>p.n;}

B、bool Pair::operator >(Pair p)

{if(m!>p.m) return m>p.m;return n>p.n;}

C、bool Pair::operator >(Pair p)const

{if(m>p.m) return true;return n>p.n;}

D、bool Pair::operator >(Pair p)

{if(m>p.m) return true;return n>p.n;}

    本题主要考查了常成员函数和运算符重载。

    因为const关键字可以用于对重载函数的区分,所以在类外定义常成员函数时不能省略const关键字,因此选项B和选项D错误。选项C中,如果mp.n返回值为true,但题目要求返回值应为false,因此选项C错误。

    故本题答案为A。

24、有如下类定义:

class XX{

      int xx;

public:

XX():xx(0){cout<<'A';}

XX(int n):xx(n){cout<<'B';}

};

class YY:public XX{

      int yy;

public:

YY():yy(0){cout< YY(int n):XX(n+1),yy(n){cout< YY(int m,int n):XX(m),yy(n){cout<};

下列选项中,输出结果为A0的语句是______。

A、YY y1(0,0);

B、YY y2(1);

C、YY y3(0);

D、YY y4;

    本题主要考查了派生类构造函数执行顺序。

    建立派生类对象时,构造函数的执行顺序为:①执行基类的构造函数,调用顺序按照各个基类被继承时声明的顺序(自左向右);②执行成员对象的构造函数,调用顺序按照各个成员对象在类中声明的顺序(自上而下);③执行派生类的构造函数。

    根据声明类YY的对象时提供的初始值个数和类型,确定和其匹配的构造函数,再根据该构造函数中在初始化基类时给出的初始值的个数和类型,确定和其匹配的基类的构造函数。选项A中构造函数的执行顺序为:先执行基类XX的有一个整型参数的构造函数,输出字符B,再执行派生类YY的有两个整型参数的构造函数,输出数据成员yy的值0,因此选项A的输出结果为B0;选项B中构造函数的执行顺序为:先执行基类XX的有一个整型参数的构造函数,输出字符B,再执行派生类YY的有一个整型参数的构造函数,输出数据成员yy的值1,因此选项B的输出结果为B1;选项C的输出结果为B0;选项D中构造函数的执行顺序为:先执行基类XX的缺省构造函数,输出字符A,再执行派生类YY的缺省构造函数,输出数据成员yy的值0,因此选项D的输出结果为A0。

    故本题答案为D。

25、有下列程序:

#include

#include

using namespace std;

class XCD{

      char* a;

      int b;

public:

      XCD(char* aa,int bb){

         a=new char[strlen(aa)+1];

         strcpy(a,aa);

         b=bb;

      }

      char* Geta(){ return a;}

      int Getb(){ return b;}

};

int main(){ 

      char *p1="abcd",*p2="weirong";

      int d1=6,d2=8;

      XCD x(p1,d1),y(p2,d2);

cout<      return 0;

}

运行时的输出结果是______。

A、12

B、16

C、14

D、11

    本题主要考查了构造函数。

    构造函数在对象被创建的时候由系统自动调用。在mian()函数中,语句XCD x(p1,d1),y(p2,d2); 创建了两个对象x和y,在创建对象x时系统自动调用类的构造函数,使对象x的数据成员字符指针a指向的内存空间的值为字符串"abcd";成员函数Geta的功能是获取数据成员a,库函数strlen()的功能是获取字符串的长度,故strlen(x.Geta())的值为4;在创建对象y时系统自动调用类的构造函数,使对象y的数据成员b的值为8,成员函数Getb的功能是获取数据成员b,故y.Getb()的值为8。因此程序运行的输出结果是4+8,即12。

故本题答案为A。

26、下列描述中,不属于面向对象思想主要特征的是______。

A、封装性

B、跨平台性

C、继承性

D、多态性

    本题主要考查了面向对象思想。

    C++是一种面向对象的程序设计语言,它充分支持面向对象思想中的三个主要特征:封装性、继承性、多态性。

故本题答案为B。

27、有如下程序:

#include

using namespace std;

class AA{

        int k;

protected:

        int n;

void setK(int k){ this->k=k;}

public:

void setN(int n){ this->n=n;}

};

class BB:public AA{/*类体略*/};

int main(){

        BB x;                       

        x.n=1;                        //1

        x.setN(2);                    //2

        x.k=3;                        //3

        x.setK(4);                    //4

        return 0;

}

在标注号码的四条语句中正确的是______。

A、1

B、2

C、3

D、4

    本题主要考查了派生类对象对基类成员的访问。

    类BB公有继承类AA,类AA的公有成员函数setN()成为类BB的公有成员,类AA的保护数据成员n和保护成员函数setK()成为类BB的保护成员,通过派生类对象只能访问派生类的公有成员,因此选项B正确,不能访问派生类的私有成员和保护成员,因此选项A和选项D错误;无论哪种继承方式,派生类BB的对象都不能访问基类AA中的私有成员,因此选项C错误。

故本题答案为B。

28、在定义一个类模板时,模板形参表是用一对括号括起来的,所采用的括号是______。

A、( )

B、[ ]

C、< >

D、{ }

    本题主要考查了类模版。

    类模板声明的语法形式是:

template <模板形参表> class 类名{类成员声明}

因此本题答案为C。

29、对C++编译器区分重载函数无任何意义的信息是______。

A、参数类型

B、参数个数

C、返回值类型

D、常成员函数关键字const

    本题主要考查了函数重载。

    进行函数重载时,要求同名函数在参数个数上不同,或者参数类型上不同,不可以根据函数返回值类型来重载函数;const关键字可以用于参与对重载函数的区分。因此对C++编译器区分重载函数无任何意义的信息是返回值类型。

故本题答案为C。

30、有如下程序段:

int i=5;

while (int i=0){ cout<<'*'; i--; }

运行时输出"*"的个数是______。

A、0

B、1

C、5

D、无穷

    本题主要考查了while循环语句的使用。

    while语句的语法格式为:while(表达式) <语句>

    while语句的执行过程是:

    (1)计算<表达式>的值,如果此值不等于0(即循环条件为"真"),则转向步骤(2);如果此值等于0(即循环条件为"假"),则转向步骤(4)。

    (2)执行一遍循环体<语句>;

    (3)转向步骤(1);

    (4)结束while循环。

    本题的表达式声明了变量i并赋初值0,因此循环条件为"假",结束while循环。故while语句循环了0次,因此输出"*"的个数是0。

故本题答案为A。

31、建立一个类对象时,系统自动调用______。

A、析构函数

B、构造函数

C、静态函数

D、友元函数

    本题主要考查了构造函数。

    构造函数的作用是在对象被创建时利用特定的值构造对象,将对象初始化为一种特定的状态,使该对象具有区别于其他对象的特征。构造函数在对象被创建的时候由系统自动调用。

故本题答案为B。

32、有如下类定义和变量定义

class  A{

public:

       A() {data=0;}

       ~A() {}

       int GetData() const {return data;}

       void SetData(int n) {data=n;}

private: 

       int data;

};

const A a;

A b;

下列函数调用中错误的是______。

A、a.GetData();

B、a.SetData(10);

C、b.GetData();

D、b.SetData(10);

    本题主要考查了常对象和常成员函数。

    使用const关键字修饰的对象称为常对象,使用const关键字说明的成员函数称为常成员函数。由于常对象不能被更新,因此,在将一个对象说明为常对象后,通过这个常对象只能调用它的常成员函数,而不能调用其他成员函数。一般对象既可以调用常成员函数,也可以调用一般成员函数。选项B中对象a为常对象,而成员函数SetData()不是常成员函数,所以这样调用会发生编译错误。

故本题答案为B。

33、有如下程序:

#include

using namespace std;

class A{

public:

virtual void f(){cout<<1;}

void g(){cout<<2;}

};

class B:public A{

public:

virtual void f(){cout<<3;}

void g(){cout<<4;}

};

void show(A &a){a.f(); a.g();}

int main(){

      B b;

      show(b);

      return 0;

}

运行时的输出结果是______。

A、12

B、34

C、14

D、32

    本题主要考查了虚函数。

    本题中show函数的形参是基类A的对象的引用,main()函数中的调用语句show(b);中的实参b是派生类B的对象,这是利用类型兼容规则中的派生类对象可以初始化基类的引用。执行show函数中的语句a.f();函数f()是虚函数,在虚函数情况下,通过基类引用将访问被引用的派生类B的对象b的同名虚成员函数f(),故此处输出3,然后执行show函数中的语句a.g();,函数g()是实函数,在实函数的情况下,通过基类指针(或引用)所调用的只能是基类的那个函数版本,故此处输出2,show函数执行结束,main()函数执行结束。因此本题运行时的输出结果为32。

故本题答案为D。

34、通过派生类的对象可直接访问其______。

A、公有继承基类的公有成员

B、公有继承基类的私有成员

C、私有继承基类的公有成员

D、私有继承基类的私有成员

    本题主要考查了继承和派生。

    基类中公有成员在派生类中的访问控制属性将随着继承方式而改变:派生类从基类公有继承时,基类的公有成员在派生类中仍然是公有成员;派生类从基类私有继承时,基类的公有成员在派生类中改变为私有成员;无论哪种继承方式,派生类的成员和派生类的对象都无法访问基类的私有成员。因此选项B和选项D错误。通过类的对象只能访问类的公有成员,因此选项C错误。

故本题答案为A。

35、要建立文件流并打开当前目录下的文件file.dat用于输入,下列语句中错误的是______。

A、ifstream fin=ifstream.open("file.dat");

B、ifstream *fin=new ifstream("file.dat");

C、ifstream fin;fin.open("file.dat");

D、ifstream *fin=new ifstream();fin->open("file.dat");

    本题主要考查了文件输入流的建立。

    每个文件流都应当与一个打开的文件相联系。可以用两种不同的方式打开文件。①在建立文件流对象的同时打开文件,故选项B正确。②先建立文件流对象,再在适当的时候打开文件。因此选项C和D正确。对于公有的静态成员函数,可以通过类名或对象名来调用,而一般的非静态成员函数只能通过对象名来调用,因为open成员函数是一般的非静态成员函数,故不能通过类名来调用,因此选项A错误。

36、数据库系统的核心是______。

标准答案为:数据库管理系统 或 DBMS

数据库管理系统是数据库的机构,它是一种系统软件,负责数据库中的数据组织、数据操纵、数据维护、控制及保护和数据服务等。数据库管理系统是数据库系统的核心。

37、软件测试可分为白盒测试和黑盒测试。基本路径测试属于______测试。

标准答案为:白盒

软件测试的方法和技术是多种多样的,若从是否需要执行被测软件的角度,可以分为静态测试和动态测试方法。若按功能划分可以分为白盒测试和黑盒测试。白盒测试方法也称结构测试或逻辑驱动测试。白盒测试的主要方法有逻辑覆盖、基本路径测试。黑盒测试方法也称功能测试或数据驱动测试。黑盒测试方法主要有等价类划分法、边界值分析法、错误推测法、因果图等,主要用于软件确认测试。

38、在E-R图中,图形包括矩形框、菱形框、椭圆框。其中表示实体联系的是______框。

标准答案为:菱形

    E-R模型可以用一种非常直观的图的形式表示,这种图称为E-R图。在E-R图中我们分别用下面不同的几何图形表示E-R模型中的三个概念与两个联接关系。

    (1)实体集表示法。在E-R图中用矩形表示实体集,在矩形内写上该实体集的名字。

    (2)属性表示法。在E-R图中用椭圆形表示属性,在椭圆形内写上该属性的名称。

(3)联系表示法。在E-R图中用菱形(内写上联系名)表示联系。

39、符合结构化原则的三种基本控制结构是:选择结构、循环结构和______。

标准答案为:顺序结构

结构化程序设计方法是程序设计的先进方法和工具。其中结构化程序设计的三种基本控制结构是:选择结构、循环结构、顺序结构。

40、假设用一个长度为50的数组(数组元素的下标从0到49)作为栈的存储空间,栈底指针bottom指向栈底元素,栈顶指针top指向栈顶元素,如果bottom=49,top=30(数组下标),则栈中具有______个元素。

标准答案为:20 或 20 或 二十

栈是限定在一端进行插入与删除的线性表。在栈中,允许插入与删除的一端称为栈顶,而不允许插入与删除的另一端称为栈底。栈顶元素总是最后被插入的元素,从而也是最先能被删除的元素;栈底元素总是最先被插入的元素,从而也是最后才能被删除的元素。即栈是按照"先进后出"或"后进先出"的原则组织数据的,因此,栈也被称为"先进后出"表或"后进先出"表。通常用指针top来指示栈顶的位置,用指针bottom指向栈底。由题意可知栈顶指针top=30,bottom=49,则栈中具有的元素应该为bottom-top+1即49-30+1=20。

41、有如下程序段:

for (int i=1;i<=50;i++){

   if(i%3!=0)

   continue;

else

   if(i%5!=0)

   continue;

cout<}

执行这个程序段的输出是______。

标准答案为:15,30,45, 或 15,30,45, 或 15,30,45, 或 15,30,45,

    本题主要考查了for循环语句和continue语句。

本题程序的功能是找出1~50中既能被3整除又能被5整除的数,每找到一个满足条件的数则输出该数,然后紧随其后输出逗号,故本题程序段的输出是15,30,45,。

42、下面的函数利用递归实现了求1+2+3…..+n的功能:

int sum(int n){

    if( n==0 )

        return 0;

    else

        return n+sum(n-1);

}

在执行sum(10)的过程中,递归调用sum函数的次数是______。

标准答案为:10 或 10 或 十 或 十次

    本题主要考查了递归函数。

递归函数即自调用函数,在函数体内部直接或间接地自己调用自己,即函数嵌套调用的是函数本身。本题中sum()函数共被调用了11次,第一次是由其它函数调用,不属于递归调用,以后的10次由自己调用自己,属于递归调用。

43、非成员函数应该声明为类的______函数才能访问该类的私有成员。

标准答案为:友元

    本题主要考查了友元函数。

C++规定,一个类的私有成员和保护成员,只能由其本身的成员来访问,不能被其他函数访问,这样就形成了封装的概念,也保护了类本身的数据不被破坏。但是如果想让类中的私有成员可以被其它函数访问,可以通过友元函数声明,来分享类中的资源。

44、有如下程序:

#include

using namespace std;

class Animal {

public:

      virtual char* getType() const {return "Animal";}

      virtual char* getVoice() const {return "Voice";}

};

class Dog:public Animal{

public:

      char* getType() const {return "Dog";}

      char* getVoice() const { return "Woof";}

};

void type(Animal& a) {cout<void speak(Animal a) {cout<int main(){

Dog d;type(d);cout<<" speak ";speak(d);cout<      return 0;

}

运行时的输出结果是______。

标准答案为:Dog speak Voice

    本题主要考查了虚函数和多态性。

    基类Animal中声明了两个虚函数getType()和getVoice(),这两个虚函数在派生类Dog中被重定义,无论是否用virtual修饰,重定义的函数仍然是一个虚函数。对虚函数的调用有两种方式:非多态调用和多态调用。非多态调用是指不借助于指针或引用的直接调用。多态调用是指借助于指向基类的指针或引用的调用。在C++中,一个基类指针(或引用)可以用于指向它的派生类对象,而且通过这样的指针(或引用)调用虚函数时,被调用的是该指针(或引用)实际所指向的对象类的那个重定义版本。在main()函数中首先定义派生类Dog的对象d,然后以派生类对象d作为实参调用type()函数,执行type()函数体语句cout<45、补充完整下面的类定义:

class XCH{

      char* a;

public:

      XCH(char* aa){ //构造函数

          a=new char[strlen(aa)+1];

          strcpy(a,aa);

      }

      XCH& operator=(const XCH& x){ //重载赋值函数

      delete []a;

      a=new char[strlen(x.a)+1];

      strcpy(a,x.a);

      ______;

      }

      ~XCH(){delete []a;}

};

标准答案为:return *this

    本题主要考查了this指针。

根据题意知该题缺少部分应为返回成员函数所属对象。this指针是一个隐含的指针,它隐含于每个类的非静态成员函数中,它明确表示出了成员函数当前操作的数据所属的对象。当对一个对象调用成员函数时,编译程序先将对象的地址赋值给this指针,然后调用成员函数。故本题应填return *this。

46、补充完整下面的类定义:

const double PI=3.14;

class Circle{ //圆形物体的抽象基类

protected:

      double r; //半径

public:

      Circle(double radius=0): r(radius){}

      ______;//计算圆形物体表面积的纯虚函数声明

};

class Cylinder:public Circle{ //圆柱体类

      double h;//高度

public:

      Cylinder (double radius=0,double height=0):

            Circle(radius),h(height){}

      virtual double Area(){ //计算圆柱体的表面积

            return 2*PI*r*(r+h);

      }

};

标准答案为:virtual double Area()=0

    本题主要考查了纯虚函数。

为了将一个虚函数声明为纯虚函数,需要在虚函数原形的语句结束符 ; 之前加上=0。故本题应填virtual double Area()=0。

47、补充完整下面的模板定义:

template //Type为类型参数

class Xtwo{ //由两个Type类型的数据成员构成的模板类

          Type a;

          Type b;

    public:

          Xtwo(Type aa=0,Type bb=0):a(aa),b(bb){}

          int Compare(){ //比较a和b的大小

if(a>b) return 1;

          else if(a==b) return 0;

          else return -1;

          }

          Type Sum() {return a+b;} //返回a和b之和

          Type Mult();             //函数声明,返回a和b之乘积

};

template

______::Mult() {return a*b;} //Mult函数的类外定义

标准答案为:Type Xtwo

    本题主要考查了类模板。

    如果需要在类模板外定义其成员函数,则要采用如下形式:

template<模板形参表声明>

<返回类型> <类名><<模板形参表>>::<函数名>(<函数形参表>)<函数体>

本题中模板形参为Type,类Xtwo的成员函数Mult()的返回类型为Type,故该题应填Type Xtwo

48、有如下程序:

#include

using namespace std;

class Monitor{

public:

      Monitor(char t):type(t){}

      void Print() const

{cout<<"The type of monitor is "<private:

      char type;

};

class Computer{

public:

      Computer(int i,char c):______{}

      void Print() const

{cout<<"The computer is "<private:

      int id;

      Monitor mon;

};

int main(){

      const Computer myComputer(101,'B');

      myComputer.Print();

      return 0;

}

请将程序补充完整,使程序在运行时输出:

The computer is 101

The type of monitor is B

标准答案为:mon(c),id(i) 或 id(i),mon(c)

    本题主要考查了成员对象。

当一个类的成员是另外一个类的对象时,该对象就称为成员对象。类Computer的成员mon是类Monitor的对象,所以mon是成员对象。类Computer的构造函数要包含对成员对象的初始化,通常采用成员初始化列表的方法来初始化成员对象。定义的一般格式如下:<类名>::<类名>(<总形参表>):<成员对象1>(<形参表1>),<成员对象2>(<形参表2>),...{//类成员的初始化}。故该题缺少的部分应是成员初始化列表。程序的输出结果是执行main()函数中的第二条语句myComputer.Print();,即调用Computer类的常成员函数Print()得到,结合题目要求的输出结果确定对象myComputer的数据成员id的值为101,成员对象mon的数据成员type的值为'B',又因为类Computer的构造函数体为空,所以对象myComputer的数据成员id的初始化也是通过初始化列表完成。故该题应填mon(c),id(i) 或id(i),mon(c)。

49、有如下程序段:

int x=1,y=2,z=3;

x=x^z;

y=y^z;

z=x^y;

cout<执行这个程序段的输出是______。

标准答案为:213 或 213

    本题主要考查了位运算。

^为按位异或运算符,它将两个运算分量的对应二进制位进行异或操作。具体运算规则是:若对应位相同,则该位的运算结果是0;若对应位不同,则该位的运算结果为1。本题中,语句x=x^z;等价于变量x的初值1对应的二进制数为:00000001,与变量z的初值3对应的二进制数00000011按位异或,得到00000010赋给x,故x的值为2。后两个语句的执行和此类似。执行后,变量y的值为1,变量z的值为3。因此,本题程序段的执行结果是213。

50、有如下程序段:

char c[20]="examination";

c[4]=0;

cout<执行这个程序段的输出是______。

标准答案为:exam

    本题主要考查了字符串的输入/输出。

    字符串整体输入/输出时,要注意:输出的字符不包括字符串结束符'\\0',输出字符串时,输出项是字符数组名,输出时遇到字符串结束符'\\0'结束。本程序段先定义了一个有20个元素的字符数组c,并赋初值"examination",然后执行语句c[4]=0;c[4]的值为ASCII码值为0的字符,即c[4]的值为字符串结束符'\\0',又数组下标从0开始,因此执行语句cout<

文档

历年计算机二级c++题库

1、下列叙述中正确的是______。A、栈是"先进先出"的线性表B、队列是"先进后出"的线性表C、循环队列是非线性结构D、有序线性表既可以采用顺序存储结构,也可以采用链式存储结构栈是一种特殊的线性表,这种线性表只能在固定的一端进行插入和删除操作,允许插入和删除的一端称为栈顶,另一端称为栈底。一个新元素只能从栈顶一端进入,删除时,只能删除栈顶的元素,即刚刚被插入的元素。所以栈又称"后进先出"表,所以选项A是错误的。队列可看作是插入在一端进行,删除在另一端进行的线性表,允许插入的一端称为队尾,允许
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top