1、C+程序设计模拟试卷(二)一、单项选择题(本大题共20小题,每小题1分,共20分)在每小题列出的四个备选项中只有一个是符合题目要求的,请将其代码填写在题后的括号内。错选、多选或未选均无分。1. 静态成员函数没有()A. 返回值B. this指针C. 指针参数D. 返回类型答案:B解析:(P107)静态成员函数是普通的函数前加入static,它具有函数的所有的特征:返回类型、形参,所以使用(P107)静态成员函数,指针可以作为形参,也具有返回值。静态成员是类具有的属性,不是对象的特征,而this表示的是隐藏的对象的指针,因此静态成员函数没有this 指针。静态成员函数当在类外定义时,要注意不能使
2、用static关键字作为前缀。由于静态成员函数在类中只有一个拷贝(副本),因此它访问对象的成员时要受到一些限制:静态成员函数可以直接访问类中说明的静态成员,但不能直接访问类中说明的非静态成员;若要访问非静态成员时,必须通过参数传递的方式得到相应的对象,再通过对象来访问。2. 假定AB为一个类,则执行 “AB a(2), b3 ,*p4;”语句时调用该类构造函数的次数为()A. 3B. 4C. 5D. 9答案:B解析:(P79)a(2)调用1次带参数的构造函数,b3调用3次无参数的构造函数,指针没有给它分配空间,没有调用构造函数。所以共调用构造函数的次数为4。3. 有关多态性说法不正确的是()A
3、. C+语言的多态性分为编译时的多态性和运行时的多态性B. 编译时的多态性可通过函数重载实现C. 运行时的多态性可通过模板和虚函数实现D. 实现运行时多态性的机制称为动态多态性答案:C解析:(P171)多态性分为静态的和动态的。静态通过函数的重载来实现,动态是通过基类指针或基类引用和虚函数来实现的。所以错误的是C项。4. 假定一个类的构造函数为“A(int i=4, int j=0) a=i;b=j;”, 则执行“A x (1);”语句后,x.a和x.b的值分别为()A. 1和 0B. 1和 4C. 4和 0D. 4和 1答案:A解析:(P75)带默认的构造函数,对应实参没有值时就采用形参值。
4、调用构造函数时,i=1,不采用默认值,而只有一个参数,j采用默认值0即j=0,因此a=1,b=0,选择A项。5. 类MyA的拷贝初始化构造函数是 ()A. MyA()B. MyA(MyA*)C. MyA(MyAB. A1-p=5;C. A1.*p=5;D. *A1.p=5;答案:C解析:(P118)A中p是指针即地址,错误;B选项中A1不是指针不能使用指向运算符-,错误;“*”比“.”级别要高,所以D选项*A1.p=5相当于(*A1).p=5;错误。另外涉及到指向成员函数时注意以下几点:指向成员函数的指针必须于其赋值的函数类型匹配的三个方面:(1)参数类型和个数;(2)返回类型;(3)它所属的
5、类类型。成员函数指针的声明:指向short型的Screen类的成员的指针定义如下:short Screen:* ps_Screen;ps_Screen可以用_height的地址初始化如下:short Screen:*ps_Screen=类成员的指针必须总是通过特定的对象或指向改类型的对象的指针来访问。是通过使用两个指向成员操作符的指针(针对类对象和引用的.*,以及针对指向类对象的指针的-*)。18. 以下基类中的成员函数表示纯虚函数的是()A. virtual void tt()=0B. void tt(int)=0C. virtual void tt(int)D. virtual void
6、tt(int)答案:A解析:(P173)当在基类中不能为虚函数给出一个有意义的实现时,可以将其声明为纯虚函数,实现由派生类完成。格式:virtual()=0;。19. C+类体系中,不能被派生类继承的有()A. 常成员函数B. 构造函数C. 虚函数D. 静态成员函数答案:B解析:(P132)构造函数不能被继承。20. 静态成员函数不能说明为()A. 整型函数B. 浮点函数C. 虚函数D. 字符型函数答案:C解析:(P108)使用关键字static声明的成员函数就是静态成员函数,静态成员函数也属于整个类而不属于类中的某个对象,它是该类的所有对象共享的成员函数。静态成员函数可以在类体内定义,也可以
7、在类外定义。当在类外定义时,要注意不能使用static关键字作为前缀。由于静态成员函数在类中只有一个拷贝(副本),因此它访问对象的成员时要受到一些限制:静态成员函数可以直接访问类中说明的静态成员,但不能直接访问类中说明的非静态成员;若要访问非静态成员时,必须通过参数传递的方式得到相应的对象,再通过对象来访问。虚函数是非静态的、非内联的成员函数。静态成员函数不能被说明为虚函数。二、填空题(本大题共20小题,每小题1分,共20分)请在每小题的空格中填上正确答案。错填、不填均无分。1. 假设int a=1,b=2;则表达式 (+a/b)*b-的值为 _。答案:2解析前缀或表示先使变量值变化,再使用,
8、这和后缀恰恰相反。但是编译coutvoid main()int num=2,i=6;doi-;num+;while(-i);coutnew;其中,可以是基本数据类型,也可以是由基本类型派生出来的类型;取得分配到的内存首地址。new有3种使用形式。(1)给单个对象申请分配内存int *ip;ip=new int;/ip指向1个未初始化的int型对象(2)给单个对象申请分配内存的同时初始化该对象int *ip;ip=new int(68);/ip指向1个表示为68的int型对象(3)同时给多个对象申请分配内存int *ip;ip=new int5;/ip指向5个未初始化的int型对象的首地址for
9、(int i=0;i()const;常成员函数不更新对象的数据成员,也不能调用该类中没有用const修饰的成员函数。常对象只能调用它的常成员函数,而不能调用其他成员函数。const关键字可以用于参与重载函数的区分。8. 在C+程序设计中,建立继承关系倒挂的树应使用_继承。答案:(P138)单解析一个基类可以派生多个子类,一个子类可以再派生出多个子类,这样就形成了一个倒立的树。9. 基类的公有成员在派生类中的访问权限由_ 决定。答案:(P132)访问控制方式或继承方式10. 不同对象可以调用相同名称的函数,但执行完全不同行为的现象称为_。答案:(P167)多态性解析多态性的概念。虚函数是实现多态
10、的基础,运行过程中的多态需要同时满足3个条件:(1)类之间应满足子类型关系。(2)必须要有声明的虚函数。(3)调用虚函数操作的是指向对象的指针或者对象引用;或者是由成员函数调用虚函数(如果是在构造函数或析构函数中调用虚函数,则采用静态联编)。11. this指针始终指向调用成员函数的_。答案:对象this指针是隐藏的指针,它指向调用函数的对象。12. 预处理命令以 _符号开头。答案:(P183)#解析文件包含、预处理和编译都是以开头。13. 类模板用来表达具有_的模板类对象集。答案:(P145)相同处理方法解析模板特点是不同的数据具有相同的处理方法的抽象。14. C+程序的源文件扩展名为_。答
11、案:(P21)cpp解析源程序*.cpp,目标文件为*.obj,可执行程序*.exe。15. 在#include 命令中所包含的头文件,可以是系统定义的头文件,也可以是_的头文件。答案:(P7)自定义解析include装入文件有两种方式abc;,double s=sqrt(l*(l-a)*(l-b)*(l-c);解析输入三个边的长度,由公式得出三角形的面积double s=sqrt(l*(l-a)*(l-b)*(l-c);4. 下面程序中Base是抽象类。请在下面程序的横线处填上适当内容,以使程序完整,并使程序的输出为:Der1 called!Der2 called!#include clas
12、s Basepublic:_;class Der1:public Basepublic:void display()coutdisplay();void main()Der1 b1;Der2 b2;Base * p=fun(p);p=fun(p);答案:virtual void display()=0;,Base *p解析抽象类有纯虚函数,派生类为display。结果fun函数用指针做参数。5. 下面程序中用来求数组和。请在下面程序的横线处填上适当内容,以使程序完整,并使程序的输出为:s150。#include class Arrint *a,n;public:Arr():a(0),n(0)A
13、rr(int *aa, int nn)n=nn;a=new intn;for(int i=0;iclass exampleint a;public:example(int b=5)a=b+;void print()a=a+1;cout void main() int *p1;int *p2=int b=20;p1=coutclass Baseprivate:int Y;public:Base(int y=0) Y=y;coutclass Apublic:A()cout#include class Stringpublic:String(const char *str=NULL); / 普通构造
14、函数String(const String / 拷贝构造函数String(); / 析构函数String / 赋值函数void show()coutm_dataendl;private:char *m_data; / 用于保存字符串;答案:String:String()deletem_data;/由于m_data是内部数据类型,也可以写成delete m_data;String:String(const char *str)if(str=NULL)m_data=new char1;/若能加NULL判断则更好*m_data=0;elseint length=strlen(str);m_data=
15、new charlength+1; /若能加NULL判断则更好strcpy(m_data, str);String:String(const String m_data=new charlength+1;/若能加NULL判断则更好strcpy(m_data, other.m_data);String deletem_data;int length=strlen(other.m_data);m_data=new charlength+1;/若能加NULL判断则更好strcpy(m_data, other.m_data);return *this;void main()String str1(“aa“),str2;str1.show();str2=str1;str2.show();String str3(str2);str3.show();_