C++期末模拟试题及答案一、选择题(每题2分,共40分)1、面向对象程序设计将描述事物的数据与封装在一起,作为一个相互依存、不可分割的整体来处理。
A) 信息B) 数据隐藏C) 对数据的操作D) 数据抽象2、下列语句中,错误的是。
A) int *p=new int(5);B) int *p=new int[5];C) int *p=new int [20][(0);D) int *p=new int;3、下面有关类和对象的说法中,正确的是。
A) 系统为类和对象分配内存空间B) 类和对象没有区别C) 系统为类分配存储空间,不为对象分配存储空间D) 类与对象的关系和数据类型与变量的关系类似4、下列有关类和对象的说法中,不正确的是。
A) 任何一个对象只能属于一个类B) 对象是类的一个实例C) 类实质上是一种数据类型D) 一个类只能有一个对象5、下列说法中,不正确的是。
A) 要在类的外部直接使用类的私有成员是错误的B) 一个对象数组中的所有数组元素属于同一个类C) 当在类外部定义成员函数时,必须在函数名前加上类名和作用域运算符D) 同一个类的两个对象占用相同的内存空间6、在声明类时,下面的说法正确的是。
A) 数据成员的数据类型可以是registerB) 可以在类的声明中给数据成员赋初值C) 没有用private,public,protected定义的数据成员是公有成员D) 定义时,private,public,protected可以按任意顺序出现7、下列关于构造函数的描述中,正确的是。
A) 构造函数必须带有参数B) 构造函数可以带有返回值C) 构造函数的名字与类名完全相同D) 构造函数必须定义,不能默认8、下列有关析构函数叙述中,不正确的是。
A) 析构函数必须与类名相同,并在其前面加上符号~,以便和构造函数名区别B) 析构函数不能带有任何参数,不能有返回值C) 析构函数可以重载D) 对于全局定义的对象,在程序开始时调用构造函数,到程序结束时调用析构函数9、关于成员函数特征的下列叙述中,是错误的。
A) 成员函数一定是内联函数B) 成员函数可以重载C) 成员函数可以设置参数的默认值D) 成员函数可以是静态的10、下列说法中,不正确的是。
A) 利用常对象只能调用类中的常成员函数B) 类的常数据成员和引用成员必须在构造函数的初始化表中进行初始化C) 常成员函数可以对类中的任何数据成员进行更新D) 在程序中既可以定义指针数据成员,也可以定义对象指针11、友元函数的作用是。
A) 提高程序的运行效率B) 加强类的封装性C) 实现数据的隐藏性D) 增加成员函数的种类12、在下列有关静态成员函数的描述中,正确的是。
A) 静态成员函数只能在类外定义B) 在静态成员函数中可以使用this指针C) 在建立对象前,就可以为静态数据成员赋值D) 静态成员函数在类外定义时,要用static前缀13、使用派生类的主要原因是。
A) 提高程序的运行效率B) 加强类的封装性C) 提高代码的可重用性D) 实现数据的隐藏14、下列说法,不正确的是。
A) 函数在重载时其函数名应相同B) 基类中定义了虚函数ab(int,int),若在派生类中重新定义ab(int),则在派生类中ab为重载函数C) C++中所有运算符都可以重载D) 对于基类中定义的运算符重载函数,派生类中不一定可以继承15、下列叙述中,不正确的说法是。
A) 不能直接由抽象类建立对象B) 至少有一个纯虚函数的类称为抽象类C) 抽象类中能包含构造函数D) 抽象类中不能有数据成员16、下列说法中,不正确的是。
A) 在派生过程中构造函数不被继承B) 在派生过程中析构函数不被继承C) 声明为指向基类对象的指针可以指向其公有派生的对象D) 声明为指向公有派生类对象的指针可以指向其基类的对象17、关于虚函数的描述中,正确的是。
A) 虚函数是一个static类的成员函数B) 虚函数是一个非静态成员函数C) 派生类的虚函数与基类的虚函数具有不同的参数个数和类型D) 内联函数、构造函数、静态变量可以声明为虚函数18、模板的使用是为了。
A) 实现多态性B) 提高代码的运行效率C) 加强类的封装性D) 提高代码的可重用性19、下列说法中,不正确的是。
A) 类模板代表一个具体的、实际的类B) 函数模板经实例化生成的具体函数称为模板函数C) 在template语句与函数模板定义语句间不允许有别的语句D) 模板函数类似于重载函数,只是更严格一些20、当包含头文件iostream.h后,一个C++源程序中的cin是。
A) 一个标准语句。
B) 预定义的类。
C) 预定义的函数。
D) 预定义的对象。
二、判断题(每题1分,共10分)1、面向对象方法中的抽象,是指对具体问题进行概括,抽出一类对象的公共性质并加以描述的过程。
2、多态性是指一段程序能够处理多种类型对象的能力。
3、保护类型成员的性质和私有成员的性质相似,差别在于继承过程中对产生的新类影响不同。
4、拷贝构造函数是使用一个已经存在的对象,去初始化同类的一个新对象。
5、UML中的图形的作用是描述软件中类和对象以及它们的静态关系。
6、静态数据成员具有静态生存期。
7、条件编译是指程序中的某些内容要在满足一定条件的情况下才参与编译。
8、默认的拷贝构造函数完成的是深拷贝。
9、当类的继承方式为私有继承时,基类中的公有成员和保护成员都以私有成员身份出现在派生类中,基类的私有成员在派生类中不能直接访问。
10、如果基类声明了带有形参表的构造函数时,派生类就应当声明构造函数。
三、程序填空题(每题5分,共10分)1、按照程序执行结果,填入合适语句:#include<iostream>using namespace std;class Test{private:int n;static int m;public:int p;static int q;Test(int arg);static void disp1();void disp2();};___(1)____________(2)_________Test::Test(int arg){n=arg;p=arg;}void Test::disp1(){cout<<”m=”<<m<<”,q=”<<q<<endl;}void Test::disp2(){ cout<<”m=”<<m<<”,q=”<<q<<endl;cout<<”n=”<<n<<”,p=”<<p<<endl;}int main(){Test obj1(2);cout<<”p=”<<obj1.p<<”,q=”<<Test::q<<endl;Test::disp1();obj1.disp2();return 0;}程序执行结果:p=2,q=20m=10,q=20m=10,q=20n=2,p=22、按照程序执行结果,填入合适语句:#include<iostream>#include<cstdio>using namespace std;int count(char *str){int i,num=0;for(i=0;str[i];i++){____(1)_____________num++;}____(2)_____________}int main(){char text[100];cout<<”输入一句英语:”<<endl;gets(text);cout<<”这个句子里有”<<count(text)<<”个字母。
”<<endl;return 0;}程序执行结果:输入一句英语:It is very interesting!这个句子里有19个字母。
四、程序阅读题(共20分)1、阅读下面的程序,写出程序运行结果:(5分)#include <iostream>#include <iomanip>#include <algorithm>#include <vector>using namespace std ;int main(){vector<int> A(4);vector<int>::iterator pi;pi=A.begin(); *pi++=51; *pi++=61; *pi++=51; *pi++=81; cout<<*(A.begin()+1)<<endl;;cout<<*find(A.begin(),A.end(),51)<<endl;cout<<count(A.begin(),A.end(),51)<<endl;reverse(A.begin(),A.end());for (pi=A.begin();pi!=A.end();pi++) cout<<*pi<<" "; cout<<endl;sort(A.begin(),A.end());for (pi=A.begin();pi!=A.end();pi++) cout<<*pi<<" "; cout<<endl;return 0;}2、阅读下面的程序,写出程序运行结果:(5分)#include <iostream>using namespace std ;class A{public:virtual void func(int data){cout<<"class A:"<<data<<endl;} virtual void func(char *str){ cout<<"class A:"<<str<<endl; }void func(){ cout<<"class A" <<endl;}};class B: public A{public:void func(int data) { cout<<"class B:"<<data<<endl; }void func(char *str,int i){ cout<<"class B:"<<str<<" "<<i<<endl;} void func(){ cout<<"class B"<<endl;}};int main(int argc,char *argv[]){A *pa;B b;pa=&b;pa->func(1);pa->A::func(1);pa->func("haha");b.func("haha",2);pa->func();return 0;}3、阅读下面的程序,写出程序运行结果:(6分)#include <iostream>#include<string>using namespace std;class CreateAndDestroy{public:CreateAndDestroy(int value, char str[20]){data=value;strcpy(memo,str);cout<< "Object "<<memo<<" constructor"<<endl; }~CreateAndDestroy(){cout<<"Object "<<memo<<" destructor "<<endl; }private:int data;char memo[20];};CreateAndDestroy first( 1," first " );void create( void ){CreateAndDestroy fifth( 3," fifth " );}int main(){create();CreateAndDestroy fourth( 2," fourth " );return 0;}4、阅读下面的程序,写出程序运行结果:(4分)#include <iostream>using namespace std;class CRange{public:int index;CRange(int i) { index = i; }};class CString{char a[100];int len;public:CString(char* s) {len = strlen(s);strcpy(a, s);}char& operator[](int i) {if( i>=0 && i<len ) return a[i];else throw CRange(i);}};int DisplayHasCatch(CString& s){try{int j;for( j=0; j<20; j++ ) cout<<s[j]<<endl; //注意[]运算符被重载了}catch( CRange r ) {cerr<<endl<<"字符串下标:"<<r.index<<"超界!"<<endl;}return 99;}int main(){CString S("ABC");int i = DisplayHasCatch(S);return 0;}五、编程题(共20分)1、根据下面的要求,完成程序编写,要求包含main函数并在main中使用所定义类的对象。