一、选择题 13. 有如下类定义:
class AA{
int a;
public:
AA(int n=0):a(n){}
};
class BB:public AA{
public:
BB(intn)______
};
其中横线处缺失部分是
。
A.:a(n){} B.:AA(n){} C.{a(n);} D.{a=n;)
A B C D
B
[解析] 根据派生类构造函数的一般格式:<派牛类名>(<总参数表>):<基类名1<(<参数表1>), …<基类名n>(<参数表n>), <成员对象名1>(<参数表n+1>), …<成员对象名m>(<参数表n+m>)<派生类构造函数体>。在派生类BB的构造函数总参数表后面应该接上基类名AA和其参数。
22. 有如下类定义:
class Sample {
public;
Sample(int x):ref(x){} //①
private:
Sample():ref(0){) //②
static int val=5; //③
const int ref; //④
};
上述程序段中,错误的语句是
。
A B C D
23. 有如下类定义:
class B{
public: void fun1(){}
private: void fun2(){}
protected: void fun3(){}
};
class D: public B{
protected: void fun4(){}
};
若obj是类D的对象,则下列语句中不违反访问控制权限的是
。
A.obj. fun1(); B.obj. fun2(); C.obj. fun3(); D.obj. fun4();
A B C D
A
[解析] 派生类D公有继承父类B,所以obj可以访问基类B的公有,不能访问其它成员。
24. 有如下类定义
class MyClass
public:
Private:
int data;
};
若要为MyClass类重载流输入运算符>>,使得程序中可以“cin>>obj;”形式输入MyClass类的对象obj,则横线处的声明语句应为
。
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);
A B C D
A
[解析] C++的输入运算符>>作为非类成员函数重载。在一个类中,可将输入运算符>>声明为友元函数,在类MyClass重载输入运算符>>的形式如选项A)所示。
25. 已知主函数中通过如下语句序列实现对函数模板swap的调用:
int a[10], b[10];
swap(a, b, 10);
下列对函数模板swap的声明中,会导致上述语句序列发生编译错误的是
。
A.template<typename T> void swap(T a[], T b[], int size); B.template<typename T> void swap(int size, T a[], T b[]); C.template<typename T1, typename T2> void swap(T1 a[], T2 b[], int size); D.template<class T1, class T2> void swap(T1 a[], T2 b[], int size);
A B C D
B
[解析] 由题目中函数swap(a, b, 10)调用语句可知,在对函数模板swap的声明语句中,应将第一、二个参数设为数组变量,第二个参数为整型变量。
27. 已知类Myclass的定义如下
class MyClass{
public:
void function1(MyClass& C) {cout<<c. data;)
static void function2(MyClass& C) {cout<<c. data;}
void function3(){cout<<data;}
staric void function4(){cout<<data;}
private:
int data;
};
其中有编译错误的函数是
。
A.function1 B.function2 C.function3 D.function4
A B C D
D
[解析] funcyion4()函数作为类的静态成员函数,不能直接访问类中说明的非静态成员,即cout<<data在编译时会出错。
28. 有如下程序:
#include<iostream>
using namespace std;
class MyClass{
public:
MyClass() {cout<<'*';)
MyClass(MyClass& A) {cout<<'#';)
~MyClass() {cout<<'@';)
};
int main();
MyClass a;
Myclass b(A);
return 0;
}
运行时的输出结果是
。
A B C D
C
[解析] 程序在执行时,先创建类对象a,输出*,再创建类对象b,输出#,然后再依次调用类对象b和a的析构函数,输出两个@。
29. 已知类Myclass的定义如下:
class MyClass{
public:
MyClass(int D) {data=d;}
~MyClass (){}
private:
int data;
};
下列对Myclass类对象数组的定义和初始化语句中,正确的是
。
A.MyClass arrays[2]; B.MyClass arrays[2]={MyClass(5)}; C.MyClass arrays[2]={MyClass(5), MyClass(6)}; D.MyClass*arrays=new MyClass[2];
A B C D
C
[解析] 在选项C) 中定义了类MyClass对象数组arrays[2],并用对象MyClass(5)和MyClass(6)对这个数组中的两个元素赋初值。
30. 有如下程序:
class Base{
public:
int data;
};
class Derived1:public Base{};
class Derived2:protected Base{};
int main(){
Derived1 d1;
Derived2 d2;
d1. data=0; //①
d2. data=0; //②
return 0;
}
下列关于程序编译结果的描述中,正确的是
。
A.①②皆无编译错误 B.①有编译错误,②无编译错误 C.①无编译错误,②有编译错误 D.①②皆有编译错误
A B C D
C
[解析] 保护继承的类Dervied2不能访问基类Base中的公共数据成员data。
31. 有如下程序:
#include<iostream>
using namespace std;
class Base1{
public:
Base1(int D){cout<<d;}
~Base1(){}
};
class Base2{
public:
Base2(int D){cout<<d;}
~Base2 (){}
};
class Derived:public Base1, Base2{
public:
Derived(int a, int b, int c, int D) ;
Base1(B), Base2(A), b1(D), b2(C){}
Private:
int b1;
int b2;
};
int main(){
Derived d(1, 2, 3, 4);
return 0;
}
运行时的输出结果是
。
A B C D
D
[解析] 程序在创建派生类对象d时,分别调用基类Base1和Base1的构造函数。
32. 有如下程序:
#include<iostream>
using namespace std;
class Base{
public:
virtual void function1(){cout<<'0';}
void function2(){cout<<'1';}
};
class Derived:public Base{
public:
void function1(){cout<<'2';}
void function2(){cout<<'3';}
};
int main(){
Base*P=new Derived();
p->function1();
p->function2();
return 0;
};
运行时的输出结果是
。
A B C D
B
[解析] 函数function1()在基类Base中定义为虚成员函数,而在派生类Dervied中重新进行了定义,输出字符2,函数function2()在基类Base中定义虚成员函数。在主函数中使用指向基类的指针变量p访问function2()时,输出1。
34. 有如下程序:
#include<iomanip>
#include<iostream>
using namespace std;
int main(){
cout<<setfill('*')<<setw(6)<<123<<456;
return 0;
}
运行时的输出结果是
。
A.***123***456 B.***123456*** C.***123456 D.123456
A B C D
C
[解析] 在主函数中第一次输出时调用函数setfill('*')设置填充字符为‘*’,调用函数setw(6)设置每次输出的宽度为6,所以第一次输出123时,多余的三个空位用‘*’填充,即结果为***123,第二次从输出流中输出456。
35. 有如下程序:
#include<iostream>
using namespace std;
void function2(int n);
void function1(int n){
if(n<=0)retum;
function2(n-2);
}
void function2(int n){
if(n<=0)return;
function1(n-1);
}
int main(){
function1(5);
return 0;
}
下列关于程序运行情况的描述中,正确的是
。
A.function1运行1次,function2运行2次 B.function1运行2次,function2运行1次 C.function1运行2次,function2运行3次 D.function1运行2次,function2运行2次
A B C D
D
[解析] 在主函数中执行function1(5)时,会调用function2(3),function2(3)又会调用function1(2),function1(2)又会调用function2(0),到此相互调用结束。所以function1()和function2()各执行了2次。
二、填空题 1. 数据结构分为线性结构与非线性结构,带链的栈属于______。
线性结构
[解析] 一般将数据结构分为线性结构与非线性结构两大类。如果一个非空的数据结构满足以下两个条件: ①有且只有一个根结点; ②每一个结点最多有一个前件,也最多有一个后件。 则称该数据结构为线性结构,所以带链栈为线性结构。
2. 在长度为n的顺序存储的线性表中插入一个元素,最坏情况下需要移动表中______个元素。
n
[解析] 在顺序存储的线性表中插入一个元素时,一般是从最后的元素向后移动一位,移动到插入的位置后,插入元索。在最坏情况下,需要移动n个元素。
3. 常见的软件开发方法有结构化方法和面向对象方法。对某应用系统经过需求分析建立数据流图(DFD) ,则应采用______方法。
结构化
[解析] 采用结构化方法开发软件时,需求分析阶段建立数据流图。
4. 数据库系统的核心是______。
数据库管理系统 (或DBMS)
[解析] 一般认为,数据库系统包括四个部分:数据库、数据库管理系统、数据库应用程序、数据库管理员。其中DBMS是为数据库的建立、使用和维护而配置的软件,是数据库系统的核心。
5. 在进行关系数据库的逻辑设计时,E-R图中的属性常被转换为关系中的属性,联系通常被转换为______。
关系
[解析] 在实体—关系图中的联系通常被转换为关系。
6. 若有“intx=15, y=20;”,则执行表达式y-=x++后,表达式x+y的值为______。
21
[解析] 变量x的初始值等于15,变量y的初始值等于20,执行表达式y-=x++后,变量x的值等于16,变量y的值等于5,因而表达式x+y的值等于21。
7. 执行语句序列“int k=0; do k++; while(k*k<20);”后,k的值为______。
5
[解析] 在while循环语句中,先执行循环体,然后再进行判断。对于本题来说,先执行k++,再判断k*k的值是否小于20。当k的值等于5时,5*5=25>20,退出while循环。
8. 下列程序运行时的输出结果是______。
#include<iostream>
using namespace std;
int Xfun(int*a, int n);
int main()
int b[6]={-2, 6, 8, -3, 5, 4);
cout<<Xfun(b, 6)<<end1;
return 0;
}
int Xfun(int*a, int n){
int x=0;
for(int*p=a; p<a+n; p++)if(*p>0)x+=*p;
return X;
}
23
[解析] 函数Xfun()的功能是求出数组a中所有大于0的元素的和。
9. 下列程序运行时的输出结果是______。
#include<iostream>
using namespace std;
void Xfun(int&, int&);
int main(){
int a=3, b=4;
Xfun(a, B) ;
cout<<a*a+b<<end1;
return 0;
}
void Xfun(int& x, int& y){
int z=x;
x=y; y=z;
}
19
[解析] 函数Xfun()的功能足将变量x和y中的值进行互换,在主两数中调用Xfun(a, B) 后,变量a的值等于4,变量b的值等于3,所以表达式a*a+b=4*4+3=19。
10. 若Xcs是一个类,该类中具有一个函数体为空的不带参数的构造函数,此构造函数的类外定义为______。
Xcs::Xcs(){}
[解析] 类Xcs的函数体为空不带参数的构造函数为Xcs(){},此函数要在类外定义,所以在函数名前面要加类名Xcs。
11. 有如下程序:
#include<iostream>
using namespace std;
class Sac{
int n;
public:
Sac():n(4){cout<<n;}
Sac(int k):n(k){cout<<n;}
~Sac(){cont<<n+n;}
};
int main(){
Sac s1,*s2;
s2=new Sac(3);
delete s2;
return 0;
}
运行时的输出结果是______。
4368
[解析] 在主函数中创建类对象s1时,调用类的默认构造函数输出4,创建s2时,调用类的带参数的构造函数输出3,删除对象s2时,调用类的析构函数输出6,程序运行结束时,调用类的析构函数输出8。
有如下两个类声明 class AA { public: int m; }; class BB: protected AA{ int n; }; 在类BB中,数据成员m的访问属性是 12 ,数据成员n的访问属性是 13 。13.
私有成员
[解析] 在派生类BB中,数据成员m是从基类AA保护继承而来,所以其属性为保护成员。在类的定义中,没有显式定义的数据成员其属性为私有成员。
14. 已知类Ben中将二元运算符“/”,重载为友元函数,若c1、c2是Ben的两个对象当使用运算符函数进行显式调用时,与表达式c1/c2等价的表示为______。
operator/(c1, c2)
[解析] 将两个类Ben对象c1, c2作为参数,显示调用重载二元运算符“/”的形式为operator/(c1, c2)。
15. C++中的模板分为函数模板和______。
类模板
[解析] C++的模板分为函数模板和类模板。