21关于在调用模板函数时模板实参的使用,下列表述中正确的是( )。
A.对于虚拟类型参数所对应的模板实参,如果能从模板函数的实参中获得相同的信息,则都可以省略
B.对于虚拟类型参数所对应的模板实参,如果它们是参数表中的最后的若干个参数,则都可以省略
C.对于虚拟类型参数所对应的模板实参,若能够省略则必须省略
D.对于常规参数所对应的模板实参,任何情况下都不能省略
参考答案:D
参考解析:在调用一个模板函数时,编译系统需要足够的信息来判别每个虚拟类型参数所对应的实际类型,可以从两个不同的渠道获得这样的信息:从模板实参表(用“<>”括起来的参数表)或从模板函数实参表(用“()”括起来的参数表)。如果从后者获得的信息已经能够判定其中部分或全部虚拟类型参数所对应的实际参数,而且它们又正好是参数表中最后的若干参数,则模板实参表中的那几个参数可以省。如果模板实参表中的实参都被省了,则空表“<>”也可以不要,因此选项D错误。反之,对于某个模板实参,如果从模板函数的实参表中无法获得同样的信息,就不能省;或者虽然能够获得同样的信息,但在它后面还有其他不能省的实参,则其自身还是不能省。
22有如下程序段:
int i=0,J=1;
int&r=i;//①
r=j;//②
int*P=&i;//⑧
*P=&r;//④
其中会产生编译错误的语句是( )。
A.④B.③C.②D.①
参考答案:A
参考解析:本题考查指针和引用。①为引用,使用正确;④中&r表示一一个地址,而* P已经是一个值了,不能将一个指针赋值给一个值,所以编译错误。
23有如下程序:
#include
using namespace std;
class Obj{
static int i;
public:
Obj(){i++;}
一Obj(){i一一;}
static int getVal(){return i;}
};
int Obj::i=0:
void f(){Obj ob2;cout<
int main(){
Obj obl;
f();
Obj}ob3=new Obj;cout
delete ob3;cout<
return 0;
}
执行这个程序的输出结果是( )。
A.232B.231C.222D.221
参考答案:D
参考解析:本题考查构造函数和析构函数的调用顺序,调用顺序为先构造的后析构,后构造的先析构。本题中先定义了一个对象ob1,会执行构造函数,那么i就变为了l;再执行函数f后,由于又定义了一个对象ob2,所以再次执行构造函数,i就变为了2,输出了2。函数执行完后执行析构函数,i变为了1,然后又定义了对象指针,i变为了2。释放ob3后,i变为了1,所以答案为D。
24有如下类定义:
class MyBase{
int k;
public:
MyBase(int n=O):k(n)}}
int value()eonst{return k;}
};
class MyDerived:MyBase{
intj;
public:
MyDerived(int i):j(i)}}
int getK()const{return k;}
int getJ()const{return j;}
};
编译时发现有一处语法错误,对这个错误最准确的描述是( )。
A.函数9etK试图访问基类的私有成员变量k
B.在类MyDerived的定义中,基类名MyBase前缺少关键字public、protected或private
C.类MyDerived缺少一个无参的构造函数
D.类MyDerived的构造函数没有对基类数据成员k进行初始化
参考答案:A
参考解析:默认继承方式为私有继承,私有继承将基类的公用成员和保护成员都变为r私有成员,基类的私有成员依然属于基类私有,派生类不能访问基类的私有成员。所以A选项正确。
25下列关于虚基类的描述,错误的是( )。
A.设置虚基类的目的是为了消除二义性
B.虚基类的构造函数在非虚基类之后调用
C.若同一层中包含多个虚基类,这些虚基类的构造函数按它们说明的次序调用
D.若虚基类由非虚基类派生而来,则仍然先调用基类构造函数,再调用派生类的构造函数
参考答案:B
参考解析:虚基类的引入就是为j-消除。二义性,其构造函数的调用仍然是按照继承的顺序进行的,对于多个虚基类则按它们说明的次序调用,虚基类的构造函数先于非虚基类的构造函数执行。
26在长度为n的有序线性表中进行二分查找,最坏情况下需要比较的次数是( )。
A.O(n)B.O(n2)C.O(1092n)D.0(n1092n)
参考答案:C
参考解析:当有序线性表为顺序存储时才能用:二分法查找。可以证明的是对于长度为n的有序线性表,在最坏情况下,二分法查找只需要比较l092n次,而顺序查找需要比较n次。
27在软件开发中,需求分析阶段可以使用的工具是( )。
A.N—s图B.DFD图C.PAD图D.程序流程图
参考答案:B
参考解析:在需求分析阶段可以使用的工具有数据流图DFD图,数据字典DD,判定树与判定表,所以选择B。
28有如下类声明:
class Base{
protected:
int amount;
public:
Base(int n=0):amount(n){}
int getAmount()const{retum amount;}
};
class Derived:public Base{
protected:
int value;
public:
Derived(int m,int n):value(m),Base(n){}
int getData()const{return value+amount;}
}:
已知x是一个Derived对象,则下列表达式中正确的是( )。
A.x.value+X.getAmount()B.x.getData()一x.getAmount()C.x.getData()一x.amountD.x.value+X.amount
参考答案:B
参考解析:本题考查公有继承中派生类对象对基类的访问属性。在公有继承中,派生类对象只能访问基类的公有成员,而不能}方问基类的保护成员和私有成员。题中x是派生类的对象,只能访问基类中公有的Base()和getAmount()成员,而不能访问保护类型的amount成员,故选项C、D错误。而类对象对类成员的访问也存在类似的情况,即类对象只能访问类的公有成员,而value是Derived的保护成员,所以A选项也错误。故答案为B。
30下面描述中,不属于软件危机表现的是( )。
A.软件过程不规范B.软件开发生产率低C.软件质量难以控制D.软件成本不断提高
参考答案:A
参考解析:软件危机主要表现在:软件需求的增长得不到满足;软件开发成本和进度无法控制;软件质撼难以保证;软件不可维护或维护程度非常低;软件的成本不断提高;软件开发生产率的提高赶不上硬件的发展和应用需求的增长。所以选择A。