贵州师范大学计算机科学与技术专业大二2017-2018学年类和面向对象&数据结构
类和面向对象部分
1、下列有关类的说法不正确的是()。 [单选题] *
| A.对象是类的一个实例 |
| B.任何一个对象只能属于一个具体的类 |
| C.一个类只能有一个对象(正确答案) |
| D.类与对象的关系和数据类型与变量的关系相似 |
答案解析:对象是类的一个实例,类与对象的关系和数据与变量的关系相似,所以一个类可以有多个对象。
2、下面()项是对构造函数和析构函数的正确定义。 [单选题] *
| A.voidX::X(),voidX::~X() |
| B.X::X(参数),X::~X()(正确答案) |
| C.X::X(参数),X::~X(参数) |
| D.voidX::X(参数),voidX::~X(参数) |
答案解析:构造函数无返回类型、可带参数、可重载;析构函数无返回类型、不可带参数、不可重载。
3、()的功能是对象进行初始化。 [单选题] *
| A.析构函数 |
| B.数据成员 |
| C.构造函数(正确答案) |
| D.静态成员函数 |
答案解析:当一个对象定义时,C++编译系统自动调用构造函数建立该对象并进行初始化;当一个对象的生命周期结束时,C++编译系统自动调用析构函数注销该对象并进行善后工作。
4、下列选项中不属于面向对象程序设计特征的是()。 [单选题] *
| A. 继承性 |
| B. 多态性 |
| C. 类比性(正确答案) |
| D. 封装性 |
答案解析:面向对象设计是建立在“对象”概念上的方法学,对象是面向对象语言中类的实体,其特点包括:①标识唯一性,对象可区分;②分类性,可以将具有相同属性和操作的对象抽象成类;③多态性,同一个操作对于不同对象表现不同的行为;④封装性,屏蔽数据的具体结构以及操作的算法;⑤模块性好,对象内部各种元素结合紧密,内聚性强。
5、拷贝构造函数具有的下列特点中,()是错误的。 [单选题] *
| A.如果一个类中没有定义拷贝构造函数时,系统将自动生成一个默认的 |
| B.拷贝构造函数只有一个参数,并且是该类对象的引用 |
| C.拷贝构造函数是一种成员函数 |
| D.拷贝构造函数的名字不能用类名(正确答案) |
答案解析:如果一个类中没有定义拷贝构造函数时,系统将自动生成一个默认的;拷贝构造函数只有一个参数,并且是该类对象的引用;拷贝构造函数的名字与类同名,并且不被指定返回类型;拷贝构造函数是一种成员函数。
6、关于静态成员的描述中,()是错误的。 [单选题] *
| A.静态成员可分为静态数据成员和静态成员函数 |
| B.静态数据成员定义后必须在类体内进行初始化(正确答案) |
| C.静态数据成员初始化不使用其构造函数 |
| D.静态数据成员函数中不能直接引用非静态成员 |
答案解析:静态成员可分为静态数据成员和静态成员函数;静态数据成员被定义后,必须对它进行初始化,初始化在类体外进行,一般放在该类的实现部分最合适,也可以放在其他位置,例如,放在主函数前面等;静态数据成员初始化与该类的构造函数和析构函数无关;在静态成员函数的实现中,可以直接引用静态成员,但不能直接引用非静态成员。
7、关于友元的描述中,()是错误的。 [单选题] *
| A.友元函数是成员函数,它被说明在类体内(正确答案) |
| B.友元函数可直接访问类中的私有成员 |
| C.友元函数破坏封装性,使用时尽量少用 |
| D.友元类中的所有成员函数都是友元函数 |
答案解析:友元函数是非成员函数,在类体内说明了,在类体外定义,定义和调用等同于一般的普通函数;由于它可以直接访问类的私有成员,因此破坏了类的封装性和隐藏性,尽量少用。
8、下列关于类的访问权限的描述中,()是错误的。 [单选题] *
| A.类中说明为公有的成员可以被程序中的任何代码访问 |
| B.类中说明为私有的成员只能被类的成员函数和说明为友元类的成员函数访问 |
| C.类中说明为保护的成员可以被该类的派生类的成员访问 |
| D.类的对象和类成员函数一样可以访问类的所有成员(正确答案) |
答案解析:本题考核类成员的访问权限。类成员有3类访问权限:公有(public)、私有(private)和保护(protected)。公有成员是类的对外表现,而私有成员和保护成员是类的内部实现。类的成员函数可以访问类的所有成员,没有任何。而类的对象对类的成员的访问是受成员访问控制符制约的。通过类的对象只能访问类的公有成员,不能访问类的保护成员和私有成员。由此可知,选项D的描述是错误的。
9、下列关于构造函数说法不正确的是() [单选题] *
| A.构造函数必须与类同名 |
| B.构造函数可以省略不写 |
| C.构造函数必须有返回值(正确答案) |
| D.在构造函数中可以对类中的成员进行初始化 |
答案解析:构造函数是一类特殊的函数,其特点是函数名与类同名,没有返回值,也可以省略不写,还可以对类中的成员进行初始化。
10、在派生类中能直接访问基类的()。 [单选题] *
| A.公有成员,私有成员 |
| B.保护成员,私有成员 |
| C.全部成员 |
| D.公有成员,保护成员(正确答案) |
答案解析:派生类亦称为子类,基类亦称为父类。一个类中的public成员可被自己的成员和任意其它类及外部函数访问,保护成员可被自己以及其子类访问,私有成员只能被自己访问。所以此题应选D。
11、下列关于运算符重载的描述中,错误的是()。 [单选题] *
| A) 运算符重载不能改变操作数的个数、优先级、结合性和运算符的语法结构 |
| B) 不是所有的运算符都可以重载 |
| C) 运算符函数的调用必须使用关键字operator(正确答案) |
| D) 在C++语言中不可以通过运算符重载创造出新的运算符 |
答案解析:运算符重载不能改变运算符的语法规则、优先级、结合性和操作数个数。运算符重载不能创造新的运算符。不能重载“,”.“::”、“.*”、“->*”和“:”5个运算符。运算符重载函数在定义的时候必须使用关键字operator,调用时可直接使用运算符。
12、C++语言是从早期的C语言逐渐发展演变而来的。与C语言相比,它在求解问题方法上进行的最大改进是()。 [单选题] *
| A.面向过程 |
| B.面向对象(正确答案) |
| C.安全性 |
| D.复用性 |
答案解析:C++起源于C语言,它不仅保留了传统的结构化程序设计方法,又对流行的面向对象程序设计方法提供了完整的支持。
13、对于类中定义的成员,其隐含访问权限是()。 [单选题] *
| A.public |
| B.protected |
| C.private(正确答案) |
| D.Static |
答案解析:类中定义的成员,隐含访问权限是private。
14、下面有关重载函数的说法中,正确的是()。 [单选题] *
| A.重载函数必须具有不同的返回值类型 |
| B.重载函数形参个数必须不同 |
| C.重载函数必须有不同的形参列表(正确答案) |
| D.重载函数名可以不同 |
答案解析:函数重载允许用同一个函数名定义多个函数。被重载的函数必须要有不同的形参列表。不可以根据函数返回值类型来重载函数。
15、有如下的对类“CSample”的说明,其中()是错误的。
classCSample{ [单选题] *
| A.inta=23;(正确答案) |
| B.CSample();public: |
| C.CSample(intval); |
| D.~CSample(); |
答案解析:在上面对类“CSample”说明中,“CSample()”和“CSample(intval)”是该类重载的构造函数、“~CSample()”是该类的析构函数,这三个语句都是正确的。错误的语句是“inta=23”,因为它违反了在类的声明(不管是引用性声明,还是定义性声明)中都不能以赋值表达式的形式给它的数据成员进行初始化。
16、在int a=3,*p=&a中,*p的值是()。 [单选题] *
| A.变量s的地址值(正确答案) |
| B.无意义 |
| C.变量p的地址 |
| D.3 |
答案解析:*p表示指针p指向的内容,而语句*p=&a将a的地址传递给*p。
17、在一个类中可以对一个操作符进行()重载? [单选题] *
答案解析:重载运算符可以针对用户的各种新的数据类型按实际需要对原有运算符进行适当的改造,在一个类中可以有多种新的数据类型,所以一个操作符可以进行多种重载。
18、在公有继承的情况下,基类的成员在派生类中的访问权限为()。 [单选题] *
| A.公有 |
| B.私有 |
| C.保持不变(正确答案) |
| D.受保护 |
答案解析:派生类会继承基类的成员函数和成员变量,在公有继承的情况下,派生类不改变基类成员的访问权限。
19、应在下列程序画线处填入的正确语句是 ()。
#include <iostream>
using namespace std;
clas Base
public:
void fun()
cout<<"Base::fun"<<end1;
;
class Derived : public Base
void fun()
________________//显示调用基类的函数 fun()
cout<<"Derived::fun"<<end1;
;
[单选题] *
| A. fun(); |
| B. Base.fun(); |
| C. Base::fun();(正确答案) |
| D. Base->fun(); |
答案解析:作用域分辨符号是“::”,它可以用来限定要访问的成员所在的类的名称。在派生类Derive的定义中显式调用基类的函数fun(),则只能借助于作用域分辨符“::”。
20、下面的描述中表达错误的是() [单选题] *
| A.公有继承时基类中的public成员在派生类中仍是public的 |
| B.公有继承时基类中的private成员在派生类中仍是private的(正确答案) |
| C.公有继承时基类中的protected成员在派生类中仍是protected的 |
| D.私有继承时基类中的public成员在派生类中是private的 |
答案解析:C++中,继承方式控制了基类中具有不同访问属性的成员在派生类中的访问属性。基类中的私有成员在派生类中是隐蔽的,只能在基类内部访问。所以B) 选项是错误的。派生类中的成员不能访问基类的中私有成员,但可以访问基类中的公有成员和保护成员。此时派生类对基类中各个成员的访问能力与继承方式无关,但继承方式将影响基类成员在派生类中的访问控制属性,基类中公有和保护成员在派生类中的访问控制属性将随着继承方式而改变:派生类从基类公有继承时,基类的公有成员和保护成员在派生类中仍然是公有成员和保护成员;派生类从基类私有继承时,基类的公有成员和保护成员在派生类中都改变为私有成员,派生类从基类保护继承时,基类的公有成员在派生类中改变为保护成员,基类的保护成员在派生类中仍然为保护成员.所以,A) 、C) 和D) 选项都是正确的。
21、下面对于静态数据成员描述中,正确的是()。 [单选题] *
| A.静态数据成员可以在类体内初始化 |
| B.静态数据成员不可以在类体内初始化(正确答案) |
| C.静态数据成员不能受protected控件符控制 |
| D.静态数据成员可以直接用类名调用 |
答案解析:静态成员只能在类的外部定义,并且只定义一次。
22、面向对象程序设计中的数据隐藏指的是()。 [单选题] *
| A.输入数据必须输入保密口令 |
| B.数据经过加密处理 |
| C.对象内部数据结构上建有防火墙 |
| D.对象内部数据结构的不可访问性(正确答案) |
答案解析:输入数据必须输入保密口令和数据经过加密处理都不是面向对象程序设计的特征;对象内部数据结构上也不可能建有防火墙,所以它们都不是面向对象程序设计中所指的数据隐藏。面向对象程序设计系统中的封装单位是对象,对象之间只能通过接口进行信息交流,外部不能对对象中的数据随意地进行访问,这就造成了对象内部数据结构的不可访问性,也使得数据被隐藏在对象中。这就是面向对象程序设计中的数据隐藏所指。
23、下列各项中符合函数重载必须满足的条件的是()。 [单选题] *
| A.必须有不同的参数个数 |
| B.对应的参数类型必须不相同 |
| C.A和B必须同时满足 |
| D.A和B只要满足一个即可(正确答案) |
答案解析:在同一个作用域中,要实现函数重载必须满足的条件的是:①有不同的参数个数;或者②对应的参数有不相同的数据类型,即①和②中只要有一个满足就可以了。当然两者都满足更好,但这不是必须的。
24、拷贝(复制)构造函数的作用是()。 [单选题] *
| A.进行数据类型的转换 |
| B.用对象调用成员函数 |
| C.用对象初始化对象(正确答案) |
| D.用一般类型的数据初始化对象 |
答案解析:进行数据类型的转换和用一般类型的数据初始化对象都是一般构造函数的功能。用对象调用成员函数不用构造函数,只要用“对象名.成员函数名”即可。所以拷贝(复制)构造函数的作用,只能是用对象来初始化对象。
25、下面对结构或类中成员的访问中,不正确的访问是()。 [单选题] *
| A.*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”是不正确的访问。
数据结构部分
1、研究数据结构就是研究()。 [单选题] *
| A. 数据的逻辑结构(正确答案) |
| B. 数据的存储结构 |
| C. 数据的逻辑结构和存储结构 |
| D. 数据的逻辑结构、存储结构及其基本操作 |
答案解析:数据结构(data structure)是带有结构特性的数据元素的集合,它研究的是数据的逻辑结构和数据的物理结构(存储结构)以及它们之间的相互关系,并对这种结构定义相适应的运算,设计出相应的算法,并确保经过这些运算以后所得到的新结构仍保持原来的结构类型。算法的设计取决于数据的逻辑结构,而算法的实现依赖于指定的存储结构。
2、具有线性结构的数据结构是()。 [单选题] *
答案解析:栈(stack)是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。
3、计算机中的算法指的是解决某一个问题的有限运算序列,它必须具备输入、输出、()等5个特性。 [单选题] *
| A. 可行性、可移植性和可扩充性 |
| B. 可行性、有穷性和确定性(正确答案) |
| C. 确定性、有穷性和稳定性 |
| D. 易读性、稳定性和确定性 |
答案解析:算法是指为解决某个特定问题而采取的确定且有限的步骤。一个算法应当具有以下五个特性:1)、有穷性:一个算法包含的操作步骤应该是有限的。2)、确定性:算法中每一条指令必须有确切的含义,不能有二义性,对于相同的输入必须能得到相同的执行结果。3)、可行性:算法中指定的操作,都可以通过已经验证过可以实现的基本运算执行有限次后实现。4)、有0个或多个输入:在计算机上实现的算法是用来处理数据对象的,在大多数情况下这些数据对象需要通过输入来得到。5)、有一个或多个输出:算法的目的是为了求解,这些解只有通过输出才能得到(注意:算法要有一个以上的输出)。
4、下面程序段的时间复杂度是()。
for(i=0;ifor(j=0;ja[i][j]=i*j;[单选题] *
| A. O(m2) |
| B. O(n2) |
| C. O(m*n)(正确答案) |
| D. O(m+n) |
答案解析:解析: for(i=0;i for(j=0;j a[i][j]=i*j; /* m*n次*/T = 2mn+2m+1 = O(mn)。
5、某算法的语句执行频度为(3n+nlog2n+n2+8),其时间复杂度表示()。 [单选题] *
| A. O(n) |
| B. O(nlog2n) |
| C. O(n2)(正确答案) |
| D. O(log2n) |
答案解析:算法的时间度量依据算法中最大语句频度来估算,它是问题规模n的某个函数f(n), 算法的时间度量记作:T(n)=O(f(n))6、通常从正确性、易读性、健壮性、高效性等4个方面评价算法的质量,以下解释错误的是()。 [单选题] *
| A. 正确性算法应能正确地实现预定的功能 |
| B. 易读性算法应易于阅读和理解,以便调试、修改和扩充 |
| C. 健壮性指当环境发生变化时,算法能适当地做出反应或进行处理,不会产生不需要的运行结果 |
| D. 高效性即达到所需要的时间性能(正确答案) |
答案解析:高效性除了考虑时间性能,还要考虑空间性能。7、在一个长度为n的顺序表中,在第i个元素之前插入一个新元素时,需向后移动()个元素。 [单选题] *
| A. n-i |
| B. n-i+1(正确答案) |
| C. n-i-1 |
| D. i |
答案解析:除了第i个元素之前的元素,其余元素均需要移动,所以移动元素个数为n-(i-1)=n-i+1。8、非空的循环单链表head的尾结点p满足()。 [单选题] *
| A. p->next==head(正确答案) |
| B. p->next==NULL |
| C. p==NULL |
| D. p==head |
答案解析:循环单链表首尾节点相连,因此p->next==head。9、链表不具有的特点是()。 [单选题] *
| A. 可随机访问任一元素(正确答案) |
| B. 插入删除不需要移动元素 |
| C. 不必事先估计存储空间 |
| D. 所需空间与线性表长度成正比 |
答案解析:链表只能顺序访问,只能从第一个元素开始逐个地读取元素,不能随机访问任一元素。10、在双向循环链表中,在p指针所指的结点后插入一个指针q所指向的新结点,修改指针的操作是()。 [单选题] *
| A. p->next=q;q->prior=p;p->next->prior=q;q->next=q; |
| B. p->next=q;p->next->prior=q;q->prior=p;q->next=p->next; |
| C. q->prior=p;q->next=p->next;p->next->prior=q;p->next=q;(正确答案) |
| D. q->next=p->next;q->prior=p;p->next=q;p->next=q; |
答案解析:需先赋值插入节点的信息,再修改当前节点,避免节点信息丢失。11、从表中任一结点出发,都能扫描整个表的是()。 [单选题] *
| A. 单链表 |
| B. 顺序表 |
| C. 循环链表(正确答案) |
| D. 静态链表 |
答案解析:只有循环链表能从任一结点出发,找到所有元素。12、线性表L=(a1,a2,……,an),下列说法正确的是()。 [单选题] *
| A. 每个元素都有一个直接前驱和一个直接后继 |
| B. 线性表中至少要有一个元素 |
| C. 表中诸元素的排列顺序必须是由小到大或由大到小 |
| D. 除第一个和最后一个元素外,其余每个元素都由一个且仅有一个直接前驱和直接后继(正确答案) |
答案解析:A 第一个和最后一个元素不符合条件;B 线性表可以为空表; C 线性表不要求排序。13、在下列对顺序表进行的操作中,算法时间复杂度为O(1)的是()。 [单选题] *
| A. 访问第i个元素的前驱(1< )(正确答案) |
| B. 在第i个元素之后插入一个新元素( ) |
| C. 删除第i个元素( ) |
| D. 对顺序表中元素进行排序 |
答案解析:假设顺序表L,长度为n,求第i个节点L[i],直接取L[i-1],因此为O(1)。答案B需要移动n-i+1个节点,因此为O(n)
答案C也需要移动n-i个节点
答案D根据排序方法不同最慢O(n^2),最快O(nlogn)
14、在以下的叙述中,正确的是()。 [单选题] *
| A. 线性表的顺序存储结构优于链表存储结构 |
| B. 线性表的顺序存储结构适用于频繁插入/删除数据元素的情况 |
| C. 线性表的链表存储结构适用于频繁插入/删除数据元素的情况(正确答案) |
| D. 线性表的链表存储结构优于顺序存储结构 |
答案解析:顺序表和链表各有优劣,适用于不同的场景,链表在插入或删除元素是不需要移动其他元素,插入删除效率更高,所以C正确。15、在一个单链表中,已知q所指结点是p所指结点的前驱结点,若在q和p之间插入一个结点s,则执行()。 [单选题] *
| A. s->next=p->next; p->next=s; |
| B. p->next=s->next;s->next=p; |
| C. q->next=s;s->next=p;(正确答案) |
| D. p->next=s;s->next=q; |
答案解析:原来的节点关系为q、p,即q->next=p,插入s后的节点关系为q、s、q,因此,先让p指向s,即q->next=s;然后让s指向q,即s->next=p。16、一个栈的输入序列为:a,b,c,d,e,则栈的不可能输出的序列是()。 [单选题] *
| A. a,b,c,d,e |
| B. d,e,c,b,a |
| C. d,c,e,a,b(正确答案) |
| D. e,d,c,b,a |
答案解析:栈是先进后出的结构,对于C,由于e出栈时,a、b已进栈且还没有出栈,因此,b应该比a出,所以C错误。17、设计一个判别表达式中括号是否配对的算法,采用()数据结构最佳。 [单选题] *
| A. 顺序表 |
| B. 链表 |
| C. 队列 |
| D. 栈(正确答案) |
答案解析:右括号需要匹配最近的左括号,具有后进先出的特点,因此用栈更合适。18、栈和队列都是()。 [单选题] *
| A. 链式存储的线性结构 |
| B. 链式存储的非线性结构 |
| C. 存取点的线性结构(正确答案) |
| D. 存取点的非线性结构 |
答案解析:由于栈和队列都属于线性表,所以线性表的顺序存储结构和链式存储结构同样适用于栈和队列。队列(Queue)是一种先进先出(FIFO)的线性表,队列是只允许在一端进行插入,另一端进行删除运算的线性表。允许删除的那一端称为队首(Front),允许插入运算的另一端称为队尾(Rear)。栈(Stack)是限定仅在表尾进行插入或删除操作的线性表。表尾端称为栈项(top),表头端称为栈底(bottom)。故栈是后进先出(LIFO)的线性表。可见,栈和队列都是存储点的线性结构19、设循环队列的容量为70,现经过一系列的入队和出队操作后,front为20,rear为11,则队列中元素的个数为()。 [单选题] *
| A. 9 |
| B. 31 |
| C. 61(正确答案) |
| D. 39 |
答案解析:一个循环队列Q的存储空间大小为M,其队头和队尾指针分别为front和rear,则循环队列中元素的个数为(rear-front+M)%M20、设a,b为一棵二叉树上的两个结点,在中序遍历时,a在b前面的条件是()。 [单选题] *
| A. a在b的右方 |
| B. a在b的左方(正确答案) |
| C. a是b的祖先 |
| D. a是b的子孙 |
答案解析:中序遍历首先遍历左子树,然后访问根结点,最后遍历右子树。21、设一棵二叉树的中序遍历序列:badce,后序遍历序列:bdeca,则二叉树先序遍历序列为()。 [单选题] *
| A. adbce |
| B. decab |
| C. debac |
| D. abcde(正确答案) |
答案解析:由后序bdeca,确定a是根节点,由中序 badce,确定a节点左边有b节点,右边是cde节点。 总的树的形状 a
..................../ \
...................b c
...................../ \
....................d e
前序abcde
22、在一棵具有5层的满二叉树中结点总数为()。 [单选题] *
| A. 31(正确答案) |
| B. 32 |
| C. 33 |
| D. 16 |
答案解析:具有n层的满二叉树节点总数为2^n-123、任何一棵二叉树的叶结点在先序、中序和后序遍历序列中的相对次序()。 [单选题] *
| A. 不发生改变(正确答案) |
| B. 发生改变 |
| C. 不能确定 |
| D. 以上都不对 |
答案解析:先序、中序和后序遍历的区别在根节点的显示次序,不影响叶子节点的相对次序。24、假定在一棵二叉树中,度为2的结点数为15,度为1的结点数为30,则叶子结点数为()个。 [单选题] *
| A. 15 |
| B. 16(正确答案) |
| C. 17 |
| D. 47 |
答案解析:叶子节点的度为0,度0=度2+1;25、排序方法中,从未排序序列中依次取出元素与已排序序列中的元素进行比较,将其放入已排序序列的正确位置上的方法,称为()。 [单选题] *
| A. 快速排序 |
| B. 冒泡排序 |
| C. 插入排序(正确答案) |
| D. 选择排序 |
答案解析:插入排序,一般也被称为直接插入排序。对于少量元素的排序,它是一个有效的算法 [1] 。插入排序是一种最简单的排序方法,它的基本思想是将一个记录插入到已经排好序的有序表中,从而一个新的、记录数增1的有序表。26、有一个有序表为{1,3,9,12,32,41,45,62,75,77,82,95,100},当折半查找值为82的结点时,()次比较后查找成功。 [单选题] *
答案解析:表长为13。①第一次和第7位数45比较,发现比45大,就看45后的数字
②第二次和77比较,比77大,看77后面数字
③第三次和95比较,比95小,看前面
④第四次和82比较,相同,即完毕。