C++模拟题5答案

上传人:B****n 文档编号:77113260 上传时间:2022-04-19 格式:DOC 页数:25 大小:134KB
返回 下载 相关 举报
C++模拟题5答案_第1页
第1页 / 共25页
C++模拟题5答案_第2页
第2页 / 共25页
C++模拟题5答案_第3页
第3页 / 共25页
点击查看更多>>
资源描述
C+ 程序设计模拟试卷(五 )一、单项选择题 (本大题共 20 小题,每小题 1 分,共 20 分 )在每小题列出的四个备选项中只有一个是符合题目要求的,请将其代码填写在题后的括号内。错选、多选或未选均无分。1.静态成员函数没有()A. 返回值B. this指针C. 指针参数D.返回类型答案: B解析: (P107) 静态成员函数是普通的函数前加入 static, 它具有函数的所有的特征:返回类型、形参,所以使用 (P107) 静态成员函数,指针可以作为形参,也具有返回值。静态成员是类具有的属性,不是对象的特征, 而 this 表示的是隐藏的对象的指针,因此静态成员函数没有 this 指针。静态成员函数当在类外定义时,要注意不能使用 static 关键字作为前缀。由于静态成员函数在类中只有一个拷贝(副本),因此它访问对象的成员时要受到一些限制:静态成员函数可以直接访问类中说明的静态成员,但不能直接访问类中说明的非静态成员;若要访问非静态成员时,必须通过参数传递的方式得到相应的对象,再通过对象来访问。2. 在类的定义中, 用于为对象分配内存空间, 对类的数据成员进行初始化并执行其他内部管理操作的函数是()A. 友元函数-WORD格式 - 可编辑 -B. 虚函数C. 构造函数D. 析构函数答案: C解析: (P75) 定义构造函数作用就是初始化对象,而析构函数释放对象空间。虚函数用于完成多态性,友元增加访问方便性。3. 所有在函数中定义的变量,都是()A. 全局变量B. 局部变量C. 静态变量D. 寄存器变量答案: B解析:(P136) 变量存储类可分为两类:全局变量和局部变量。( 1 )全局变量:在函数外部定义的变量称为全局变量,其作用域为:从定义变量的位置开始到源程序结束。全局变量增加了函数之间数据联系的渠道,全局变量作用域内的函数,均可使用、修改该全局变量的值,但是使用全局变量降低了程序的可理解性,软件工程学提倡尽量避免使用全局变量。( 2 )局部变量:在函数内部定义的变量称为局部变量,其作用域为:从定义变量的位置开始到函数结束。局部变量包含自动变量 (auto )静态变量( static )以及函数参数。auto 变量意味着变量的存储空间的分配与释放是自动进行的。说明符 auto 可以省略。函数中的局部变量存放在栈空间。在函数开始运行时,局部变量被分配内存单元,函数结束时,局部变-WORD格式 - 可编辑 -量释放内存单元。 因此,任两个函数中的局部变量可以同名,因其占有不同的内存单元而不影响使用。这有利于实现软件开发的模块化。static 变量是定义在函数体内的变量,存放在静态存储区,不用栈空间存储,其值并不随存储空间的释放而消失。4. 假定 AB 为一个类,则执行“ AB a(2), b 3 ,*p 4 ; ”语句时调用该类构造函数的次数为()A. 3B. 4C. 5D. 9答案: B解析: (P79)a(2)调用 1 次带参数的构造函数,b 3 调用 3次无参数的构造函数,指针没有给它分配空间,没有调用构造函数。所以共调用构造函数的次数为4 。5. 如果表达式 +a 中的“ + ”是作为成员函数重载的运算符,若采用运算符函数调用格式,则可表示为()A. a.operator+(1)B. operator+(a)C. operator+(a,1)D. a.operator+()答案: D解析: (P186) 运算符的重载,前缀先让变量变化。调用a,等价为 a.operator+(), 注意无参的形式。后缀的话a+, 等价于 a.operator(0),带形参,形参-WORD格式 - 可编辑 -名可省。6. 已知 f1 和 f2 是同一类的两个成员函数, 但 f1 不能直接调用f2 ,这说明()A. f1 和 f2 都是静态函数B. f1 不是静态函数,f2 是静态函数C. f1 是静态函数, f2 不是静态函数D. f1 和 f2 都不是静态函数答案: C解析: (P107) 普通成员函数可以调用静态函数,相反静态函数不能调用普通成员函数,这与普通函数与常成员函数相同。因此选择C 项。7. 一个函数功能不太复杂, 但要求被频繁调用, 则应把它定义为 ()A. 内联函数B. 重载函数C. 递归函数D. 嵌套函数答案: A解析: (P59) 内联函数特征代码少, 频繁调用, 执行效率高。重载函数解决统一接口的问题;递归是子程序调用,程序调用要耗费很多空间和时间,循环 / 迭代都比递归有效率得多,递归只是从形式上,逻辑比较简洁。 嵌套函数即反复调用,速度较慢。所以选择 A 项。8. 解决定义二义性问题的方法有()A. 只能使用作用域分辨运算符B. 使用作用域分辨运算符或成员名限定C. 使用作用域分辨运算符或虚基类D. 使用成员名限定或赋值兼容规则-WORD格式 - 可编辑 -答案: B解析: (P139) 解决二义性问题主要要两种方法: (1) 赋值兼容规则; (2) 虚基类。9. 在 main 函数中可以用 p.a 的形式访问派生类对象 p 的基类成员 a ,其中 a是()A. 私有继承的公有成员B. 公有继承的私有成员C. 公有继承的保护成员D. 公有继承的公有成员答案: D解析: (P132) 公有成员可以在类外访问,保护类型成员可以在派生类中访问,但不能在类外访问,在 main 函数中访问,说明 a是公有成员。只有公有继承时a才能是公有的,所以 D 项正确。10. 在 C+ 中不返回任何类型的函数应该说明为()A. intB. charC. voidD. double答案: C解析:无形参或无返回值都可以用 void 来声明, int char double 分别是整型、字符型和实型。11. 若 Sample 类中的一个成员函数说明如下:void set(Sample& a),则 Sample& a的含义是()A. 指向类 Sample 的名为 a的指针B. a 是类 Sample 的对象引用,用来作函数Set ()的形参C. 将 a的地址赋给变量 SetD. 变量 Sample 与 a按位与的结果作为函数 Set 的参数答案: B-WORD格式 - 可编辑 -解析: (P53) 成员函数使用对象的引用作为形参。该函数的功能是将已知对象的所有数据成员的值拷贝给相应对象的所有数据成员,不会建立临时对象,这里是对象的引用所以选择 B 。12. 要实现动态联编必须()A. 通过成员名限定来调用虚函数B. 通过对象名来调用虚函数C. 通过派生类对象来调用虚函数D. 通过对象指针或引用来调用虚函数答案: D解析: (P170) 通过基类指针或基类引用来调用虚函数实现动态多态性,静态多态性通过重载来实现的。所以选择D 项。13. 在派生类中定义虚函数时,可以与基类中相应的虚函数不同的是()A. 参数类型B. 参数个数C. 函数名称D. 函数体答案: D解析:(P170) 虚函数在基类和派生类, 具有相同的返回类型、形参类型和形参个数,而函数体可以根据不同的派生类或基类实现不同的操作,即不同函数体。14. 实现两个相同类型数加法的函数模板的声明是()A. add(T x,T y)B. T add(x,y)C. T add(T x,y)D. T add(T x,T y)答案: D-WORD格式 - 可编辑 -解析: (P63) 实现两个相同类型数加法结果应该和操作数具有相同类型。进行加法运算后结果也是和参数具有相同类型,需要返回值。 A 无返回值时要用 void,B 形参无类型, C 形参 y没有类型,所以选择 D 项。15. 下列不是描述类的成员函数的是()A. 构造函数B. 析构函数C. 友元函数D. 拷贝构造函数答案: C解析: (P109) 友元函数虽然不是成员函数但是可以访问类所有成员。构造函数、析构函数和拷贝构造函数 (复制构造函数 )都是类的特殊函数用于对象的创建和撤销,所以选择 C 项。16. 继承机制的作用是()A. 信息隐藏B. 数据封装C. 定义新类D. 数据抽象答案: C解析: (P40) 面向对象设计中的类的特点:抽象、封装、继承和多态等,继承用于对类的扩展,所以选择 C 项。17. 已知: p 是一个指向类 A 数据成员 m 的指针, A1 是类 A的一个对象。如果要给 m 赋值为 5 ,正确的是()A. A1.p=5;B. A1-p=5;-WORD格式 - 可编辑 -C. A1.*p=5;D. *A1.p=5;答案: C解析: (P118)A 中 p 是指针即地址, 错误; B 选项中 A1 不是指针不能使用指向运算符-, 错误;“*”比“ . ”级别要高, 所以 D 选项 *A1.p=5相当于 (*A1).p=5;错误。另外涉及到指向成员函数时注意以下几点:指向成员函数的指针必须于其赋值的函数类型匹配的三个方面: (1) 参数类型和个数; (2) 返回类型; (3) 它所属的类类型。成员函数指针的声明:指向 short 型的 Screen 类的成员的指针定义如下:short Screen:* ps_Screen;ps_Screen可以用 _height 的地址初始化如下:shortScreen:*ps_Screen=&Screen:_height;类成员的指针必须总是通过特定的对象或指向改类型的对象的指针来访问。是通过使用两个指向成员操作符的指针 (针对类对象和引用的 .* ,以及针对指向类对象的指针的 -*) 。18. 如果采用动态多态性,要调用虚函数的是()A. 基类对象指针B. 对象名C. 基类对象D. 派生类名答案: A解析: (P171) 基类指针或者基类的引用调用虚函数都会产生动态多态性19. 若有以下定义,则说法错误的是()-WORD格式 - 可编辑 -int a=100,*p=&a;A. 声明变量 p ,其中 * 表示 p 是一个指针变量B. 变量 p 经初始化,获得变量 a的地址C. 变量 p 只可以指向一个整型变量D. 变量 p 的值为 100答案: D解析:指针变量如同其他变量一样,在使用之前必须先声明。声明指针变量的格式为:*;其中, 是指针变量所指向对象的类型,它可以是 C+ 语言预定义的类型,也可以是用户自定义类型。 是用户自定义的标识符。 符号 * 表示 是指针变量。而不是普通变量。 *表示指针, p 是变量, p 指向一个整型的变量,值为 a的地址值, *p=100 。20. C+ 语言建立类族是通过()A. 类的嵌套B. 类的继承C. 虚函数D. 抽象类答案: B解析: (P174) 类族即同一个类派生出来的类,各个类是兄弟或父子关系。二、填空题(本大题共 20 小题,每小题 1 分,共 20 分)请在每小题的空格中填上正确答案。错填、不填均无分。1.假设 int a=1,b=2;则表达式 (+a/b)*b-的值为 _。答案: 2解析前缀或表示先使变量值变化,再使用,这-WORD格式 - 可编辑 -和后缀恰恰相反。但是编译cout(+a/b)*b- 时,先 +a/b 值为 1 ,后 1*b- ,先取 b 2 ,结果为 2 ,再让 b 1 。2. 复制构造函数使用 _作为形式参数。答案: (P80) 对象的引用解析复制构造函数使用对象的引用来初始化一个新对象,避免临时产生对象。3. 通过 C+ 语言中的 _机制,可以从现存类中构建其子类。答案: (P127) 继承解析继承概念,从现有的类生成新类,原有的类称为父类或基类,新类又称子类或派生类或衍生类,它是对基类的扩充。4. 静态成员函数、 友元函数、 构造函数和析构函数中, 不属于成员函数的是 _。答案: (P109) 友元函数解析友元函数不是类成员,但可以访问类成员。类的封装性保证了数据的安全,但引入友元,虽然访问类是方便了,但确实破坏类访问的安全性。5. 在下面的类定义中,私有成员有 _。class Locationint X,Y;protected:int zeroX,zerxY;int SetZero(intzeroX, intzeroY);private:int length,height;public:void init(int initX,int initY);int GetX();-WORD格式 - 可编辑 -int GetY();答案: (P69)X,Y,length,height6.在 C+ 程序设计中,建立继承关系倒挂的树应使用_继承。答案: (P138) 单解析一个基类可以派生多个子类,一个子类可以再派生出多个子类,这样就形成了一个倒立的树。7. C+ 支持的两种多态性分别是 _多态性和运行多态性。答案: (P165) 静态或编译解析多态性包括静态(编译时)的和动态(运行时)的动态性。8. C+ 中语句 const char * const p=“ hello ”;所定义的指针 p 和它所指的内容都不能被_。答案: (P12) 修改解析使用 const 修改的内容不能修改,这里同时修饰地址和值,表示地址和值都不变。9.在 C+ 中,定义虚函数的关键字是_。答案: (P170)virtual解析在普通函数前面用 virtual 修饰的函数,就称为虚函数。10. 采用私有派生方式, 基类的 public 成员在私有派生类中是_成员。答案: (P132) 私有11. 对赋值运算符进行重载时,应声明为 _函数。答案: (P183) 类成员解析运算符重载的方法有友元或者成员函数两种途径,-WORD格式 - 可编辑 -但是赋值运算符只能使用成员函数的方法来实现。12.在 C+ 中有两种参数传递方式即值传递和_传递。答案: (P51) 引用解析函数参数传递有传值和传引用两种。13. 预处理命令以 _符号开头。答案: (P183)operater解析文件包含、预处理和编译都是以开头。14. 在构造函数和析构函数中调用虚函数时采用_。答案: (P167) 静态联编解析在析构或构造函数调用虚函数发生静态多态性。15. C+ 是通过引用运算符 _来定义一个引用的。答案: (P10)&解析引用是 C不具有使用方法,它表示变量的别名,在函数中使用很频繁,因为调用形式同传值调用,但修改形参实参也会相应改变的特征。16. 如果要把类 B 的成员函数 void fun() 说明为类 A的友元函数,则应在类中加入语句 _。答案: (P111)friend void B:fun();解析声明成员函数作为另外一个类的友元函数时,使用类作用域运算符:。17. 如果要把 PI 声明为值为 3.14159 类型为双精度实数的符号常量,该声明语句是 _。答案: (P6)const double PI(3.14159);或者 const doublePI 3.14159;解析使用 const 声明符号常量,常量和常量值可以用括号也可以赋值号。18. 在 C 四个流对象中, _用于标准屏幕输出。答案: (P194)cout-WORD格式 - 可编辑 -解析 cin 、cout 、cerr 和 clog 中 cin 用于输入, cout 用于输出, cerr 、 clog 错误处理。19. 执行下列代码int a=32;double c=32;cout.setf(ios:hex);couthex:a=a,c=cendl;cout.unsetf(ios:hex);程序的输出结果为_。答案: (P193)hex:a=20,c=32解析用十六进制只能输出整型数据,而不能将其它类型数据转换成十六进制的数据输出。所以double 类型不变仍然是 32 ( double 类型)。20. 已知有 20 个元素 int 类型向量 V1 ,若用 V1 初始化为 V2向量,语句是 _。答案: (P151)ector V2(V1);解析采用向量初始化另一个向量的形式:vector name1(name);三、改错题(本大题共5小题,每小题 4 分,共 20 分)1. #include class A private: int x;public:A(int i)x=i;A()x=0;friend int min(A&,A&);int min(A & a,A &b)-WORD格式 - 可编辑 - return (a.xb.x)?a.x:b.x;void main() A a(3),b(5); couta.min(a,b)endl;答案: couta.min(a,b)endl;友元函数不是类成员,所以对象 a 不能使用 a.min(a,b)这种方法。min 就是一个普通的友元函数。修改 coutmin(a,b)endl;2. #include class shapepublic:virtual int area()return 0;class rectangle:public shapepublic:int a, b;void setLength (int x, int y) a=x;b=y;int area() return a*b;void main()rectangle r;r.setLength(3,5);shape s1,*s2=&r;cout r.area() endl;s2=s1;cout s2.area()endl;-WORD格式 - 可编辑 -答案: shape s1,*s2=r; 指针使用错误。 s是指针使用它指向对象的成员有两种方法,有下面两行可知,使用的是引用。修改改为 shape &s=r;3. 下面的类定义中有一处错误, 请用下横线标出错误所在行并给出修改意见。#include template class Aprivate:T x,y,s;public:A(T a,T b)x=a,y=b;s=x+y;void show()coutx+y=sendl;void main() A add(10,100); add.show();答案:修改 A add(10,100);解析 A add(10,100); 类模板的使用,参数实例化后生成模板类。用类模板定义对象时要指定参数类型。4. 生成具有 n 个元素的动态数组。#include void main()-WORD格式 - 可编辑 -int n;cinn;int a n ;a 0 =2;couta 0 endl;答案:int a n ;生成具有 n 个元素的动态数组, 要使用 new ,所以 int a n ; 错误。修改 int *a=new int n ;5. #include class Aint i;public:virtual void fun()=0;A(int a)i=a;class B:public Aint j;public:void fun()coutB:fun()n; B(int m,int n=0):A(m),j(n);void main()A *pa;B b(7);pa=&b;-WORD格式 - 可编辑 -答案: B(int m,int n=0):A(m),j(n)因为基类是抽象类,不能被实例化,所以在派生类中不能调用初始化基类对象。所以B(int m,int n=0):A(m),j(n)错误,删去 A(m) 。修改 B(int m,int n=0):j(n)四、完成程序题(本大题共 5小题,每小题4分,共 20 分 )1. 在下面程序横线处填上适当字句, 以使该程序执行结果为:5043421100 7.1 8.1 9.1 10.1 11.1#include template void f (_)_;for (int i=0;in/2;i+)t=a i , a i =a n-1-i , a n-1-i =t;void main ()int a 5 =10,21,34,4,50;double d 6 =11.1,10.1,9.1,8.1,7.1; f(a,5);f(d,6);for (int i=0;i5;i+)cout ai ;cout endl;for (i=0;i6;i+)cout d i ;cout endl;答案: T a ,int n,T t=0;解析不同的数据类型的调用,使用了模板。f 函数增加 t-WORD格式 - 可编辑 -变量,因为实参类型不同,所以t 的类型应该是 T类型的。2. 完成下面类中成员函数的定义。#include #include class Arrprotected:float *p;int n;/数组大小(元素个数)public:Arr(int sz=10) n=sz;p=new float n ;Arr(void)_int Getn(void) constreturn n;float & operator (int i)_void Print();void Arr:Print()-WORD格式 - 可编辑 -int i;for(i=0;iGetn();i+)if (i%10=0)cout endl;coutsetw(6)p i ;coutendl;void main()Arr a(20);for (int i=0;ia.Getn();i+)a i =i* 2;a.Print();答案: delete p; ,return pi ;解析在析构函数中释放对象空间。第二个是对运算符的重载,函数返回类型是实型,形参i ,取得下标为 i 的元素的值。3. 下面是一个输入半径, 输出其面积和周长的 C+ 程序,在下划线处填上正确的语句。#include _;_;void main()double rad;coutrad;double l=2.0*pi*rad;double s=pi*rad*rad;-WORD格式 - 可编辑 -cout n The long is:lendl;coutThe area is: sendl;答案: using namespace std,#define pi 3.14159解析进行输入或输出要引入iostream,所以 usingnamespace std;从标点看没有分号,所以使用宏定义, #define pi 3.14159。4. 在下划线处填上缺少的部分。#include class Samppublic:void Setij(int a,int b)i=a,j=b;Samp()coutDestroying.iendl;int GetMuti()return i*j;protected:int i;int j;int main()Samp *p;p=new Samp 5 ;if(!p)coutAllocation error n;return 1;for(int j=0;j5;j+)p j .Setij(j,j);for(int k=0;k5;k+)coutMuti k is:p k ._endl;-WORD格式 - 可编辑 -_return 0;答案: GetMuti(),delete p;解析调用只有一个有返回值的成员函数,释放对象数组所占的空间。5. 请在下面程序的横线处填上适当内容,以使程序完整 , 并使程序的输出为 :11,1013,12#include class Aint a;public:A(int i=0)a=i;int Geta()return a;void show()coutaendl;class BA a;int b;public:B(int i,int j)_void show()couta.Geta(),bendl; ;void main()B b 2 =B(10,11),B(12,13);for(int i=0;i2;i+)-WORD格式 - 可编辑 -_答案: :a(j),b(i) , b i .show();解析在构造函数中对数据成员初始化,从结果先输出a,后b ,所以对 a j , b=i; 在循环中输出成员,调用 show 成员。五、程序分析题 (本大题共 2小题,每小题 5分, 共 10 分 )1. 给出下面程序输出结果。#include class Baseprivate:int Y;public:Base(int y=0) Y=y;coutBase(y) n;Base() coutBase() n;void print() cout Y ;class Derived:public Baseprivate:int Z;public:Derived (int y, int z):Base(y)Z=z;coutDerived(y,z)n;Derived() cout Derived()n;void print()Base:print();coutZendl;-WORD格式 - 可编辑 -;void main()Derived d(10,20);d.print();答案: Base(10)Derived(10,20)10 20 Derived()Base()解析派生类对象,先调用基类构造函数输出 Base(10) ,后调用派生类构造函数输出Derived(10,20) ,后执行 d.print(), 调用派生类的 print ,再调用 Base:print() 输出 10 ,后返回输出 z的值 20 。后派生类析构,再基类析构。2. 给出下面程序输出结果。#include class testint x;public:test(int i=0):x(i)virtual void fun1()cout test:xxendl;class ft:public testint y;public:void fun1()cout ft:y=yendl;-WORD格式 - 可编辑 -ft(int i=2):test(i),y(i);void main() ft ft1(3);void (test:*p)();p=test:fun1;(ft1.*p)();答案: ft:y=3解析指向函数的指针的使用,p 指向 fun1 函数,( ft1.*p )实际就是调用 ft1 对象的fun1 ()函数。六、程序设计题(本大题共1 小题,共 10 分)1.求 n(n=3) 个学生的最高分和最低分及姓名,已有 student类声明和 main 函数,完成student类的实现部分。#include #include class studentchar name 10 ;int deg;public:student(char na =,int d=0);char * getname();friend int compare(student &s1,student &s2);int getdeg();void main()student st =student(王强 ,74),student(李刚-WORD格式 - 可编辑 -,68),student(张雪 ,84);int i=0,min=0,max=0;for(i=1;i3;i+)if(compare(st max ,st i )=-1)max=i;if(compare(st min ,st i )=1)min=i;cout最高分: st max .getdeg()姓名 :st max .getname()endl;cout最低分 :(*(st+min).getdeg()姓名 :st max .getname()s2.deg)return 1;else if(s1.deg=s2.deg)return 0;else return -1;int student:getdeg()return deg;_-WORD格式 - 可编辑 -
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 管理文书 > 各类标准


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!