《2022年完整word版,C++试题及答案.docx》由会员分享,可在线阅读,更多相关《2022年完整word版,C++试题及答案.docx(19页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选学习资料 - - - - - - - - - C+程序设计模拟试卷 五 一、单项挑选题 本大题共 20小题,每道题 1分,共 20分 在每道题列出的四个备选项中 只有一个是符合题目要求的,请将其代码填写在题后的括号内;错选、多项或未选均无 分;1. 静态成员函数没有()A. 返回值 B. this 指针 C. 指针参数 D. 返回类型 答案: B 解析:静态成员函数是一般的函数前加入static,它具有函数的全部的特点:返回类型、形参,所以使用静态成员函数,指针可以作为形参,也具有返回值;静态成员是类具有的 属性,不是对象的特点,而 this 表示的是隐匿的对象的指针,因此静态成员函数没有
2、 this 指针;静态成员函数当在类外定义时,要留意不能使用 static 关键字作为前缀;由于静态成员函数在类中只有一个拷贝(副本),因此它拜访对象的成员时要受到一些限制:静态成员函数可以直接 拜访类中说明的静态成员,但不能直接拜访类中说明的非静态成员;如要拜访非静态成员时,必 须通过参数传递的方式得到相应的对象,再通过对象来拜访;2. 在类的定义中,用于为对象安排内存空间,对类的数据成员进行初始化并执行其他内部管 理操作的函数是()A. 友元函数 B. 虚函数 C. 构造函数 D. 析构函数 答案: C 解析:定义构造函数作用就是初始化对象,而析构函数释放对象空间;虚函数用于完成多 态性,
3、友元增加拜访便利性;3. 全部在函数中定义的变量,都是()A. 全局变量 B. 局部变量 C. 静态变量 D. 寄存器变量 答案: B 解析:变量储备类可分为两类:全局变量和局部变量;( 1)全局变量:在函数外部定义的变量称为全局变量,其作用域为:从定义变量的位置开头 到源程序终止;全局变量增加了函数之间数据联系的渠道,全局变量作用域内的函数,均可使用、修改该全局变量的值,但是使用全局变量降低了程序的可懂得性,软件工程学提倡尽量防止使用全局变量;( 2)局部变量:在函数内部定义的变量称为局部变量,其作用域为:从定义变量的位置开头 到函数终止;局部变量包含自动变量(auto )静态变量( sta
4、tic)以及函数参数;auto 变量意味着变量的储备空间的安排与释放是自动进行的;说明符 auto 可以省略;函数中 的局部变量存放在栈空间;在函数开头运行时,局部变量被安排内存单元,函数终止时,局部变 量释放内存单元;因此,任两个函数中的局部变量可以同名,因其占有不同的内存单元而不影响 使用;这有利于实现软件开发的模块化;static 变量是定义在函数体内的变量,存放在静态储备区,不用栈空间储备,其值并不随存 储空间的释放而消逝;4. 假定 AB为一个类,就执行“AB a2, b3,*p 4; ” 语句时调用该类构造函数的次数为()A. 3 B. 4 C. 5 D. 9 答案: B 解析:
5、a2 调用 1次带参数的构造函数,b3调用 3次无参数的构造函数,指针没有给它 安排空间,没有调用构造函数;所以共调用构造函数的次数为 4;5. 假如表达式 +a中的“+” 是作为成员函数重载的运算符,如采纳运算符函数调用格式,就 可表示为()A. a.operator+1 B. operator+a C. operator+a,1 D. a.operator+ 答案: D 解析:运算符的重载,前缀先让变量变化;调用a,等价为 a.operator+, 留意无参 的形式;后缀的话 a+, 等价于 a.operator0, 带形参,形参名可省;6. 已知 f1 和f2 是同一类的两个成员函数,但
6、 f1 不能直接调用 f2 ,这说明()A. f1 和f2 都是静态函数 B. f1 不是静态函数, f2 是静态函数 C. f1 是静态函数, f2 不是静态函数名师归纳总结 - - - - - - -第 1 页,共 10 页精选学习资料 - - - - - - - - - D. f1 和f2 都不是静态函数 答案: C 解析:一般成员函数可以调用静态函数,相反静态函数不能调用一般成员函数,这与一般函数与常成员函数相同;因此挑选 C项;7. 一个函数功能不太复杂,但要求被频繁调用,就应把它定义为()A. 内联函数 B. 重载函数 C. 递归函数 D. 嵌套函数 答案: A 解析:内联函数特点
7、代码少,频繁调用,执行效率高;重载函数解决统一接口的问题;递 归是子程序调用,程序调用要耗费许多空间和时间,循环 / 迭代都比递归有效率得多,递归只是 从形式上,规律比较简洁;嵌套函数即反复调用,速度较慢;所以挑选 A项;8. 解打算义二义性问题的方法有()A. 只能使用作用域辨论运算符 B. 使用作用域辨论运算符或成员名限定 C. 使用作用域辨论运算符或虚基类 D. 使用成员名限定或赋值兼容规章 答案: B 解析:解决二义性问题主要要两种方法:1 赋值兼容规章;2 虚基类;9. 在 main函数中可以用 p.a 的形式拜访派生类对象 p的基类成员 a,其中 a是()A. 私有继承的公有成员
8、B. 公有继承的私有成员 C. 公有继承的爱护成员 D. 公有继承的公有成员 答案: D 解析:公有成员可以在类外拜访,爱护类型成员可以在派生类中拜访,但不能在类外拜访,在 main函数中拜访,说明a是公有成员;只有公有继承时a才能是公有的,所以D项正确;10. 在 C+中不返回任何类型的函数应当说明为()A. int B. char C. void D. double 答案: C 解析:无形参或无返回值都可以用 void 来声明, int char double 分别是整型、字符型和实型;11. 如 Sample类中的一个成员函数说明如下:void setSample& a,就 Sample
9、& a的含义是()A. 指向类 Sample的名为 a的指针 B. a是类 Sample的对象引用,用来作函数 Set ()的形参 Set C. 将 a的地址赋给变量 D. 变量 Sample与a按位与的结果作为函数 Set 的参数 答案: B 解析:成员函数使用对象的引用作为形参;该函数的功能是将已知对象的全部数据成员的 值拷贝给相应对象的全部数据成员,不会建立暂时对象,这里是对象的引用所以挑选 B;要实现动态联编必需()12. A. 通过成员名限定来调用虚函数 B. 通过对象名来调用虚函数 C. 通过派生类对象来调用虚函数 D. 通过对象指针或引用来调用虚函数 答案: D 解析:通过基类指
10、针或基类引用来调用虚函数实现动态多态性,静态多态性通过重载来实 现的;所以挑选 D项;13. 在派生类中定义虚函数时,可以与基类中相应的虚函数不同的是()A. 参数类型 B. 参数个数 C. 函数名称 D. 函数体 答案: D 解析:虚函数在基类和派生类,具有相同的返回类型、形参类型和形参个数,而函数体可 以依据不同的派生类或基类实现不同的操作,即不同函数体;14. 实现两个相同类型数加法的函数模板的声明是()A. addT x,T y B. T addx,y C. T addT x,y D. T addT x,T y 答案: D 名师归纳总结 - - - - - - -第 2 页,共 10
11、页精选学习资料 - - - - - - - - - 解析:实现两个相同类型数加法结果应当和操作数具有相同类型;进行加法运算后结果也是和参数具有相同类型,需要返回值;A无返回值时要用void,B 形参无类型, C形参 y没有类型,所以挑选 D项;15. 以下不是描述类的成员函数的是()A. 构造函数 B. 析构函数 C. 友元函数 D. 拷贝构造函数 答案: C 解析:友元函数虽然不是成员函数但是可以拜访类全部成员;构造函数、析构函数和拷贝构造函数 复制构造函数 都是类的特别函数用于对象的创建和撤销,所以挑选 C项;16. 继承机制的作用是()A. 信息隐匿 B. 数据封装 C. 定义新类 D.
12、 数据抽象 答案: C 解析:面对对象设计中的类的特点:抽象、封装、继承和多态等,继承用于对类的扩展,所以挑选 C项;17. 已知: p是一个指向类 A数据成员 m的指针, A1是类 A的一个对象;假如要给m赋值为 5,正确的是()A. A1.p=5; B. A1-p=5; C. A1.*p=5; D. *A1.p=5; 答案: C 解析: A中 p是指针即地址,错误;B选项中 A1不是指针不能使用指向运算符-, 错误;“*” 比“. ” 级别要高,所以 D选项 *A1.p=5 相当于 *A1.p=5; 错误;另外涉及到指向成员函数 时留意以下几点:指向成员函数的指针必需于其赋值的函数类型匹配
13、的三个方面:1 参数类型和个数;2 返回类型; 3 它所属的类类型;成员函数指针的声明:指向 short 型的 Screen类的成员的指针定义如下: short Screen:* ps_Screen; ps_Screen 可以用 _height 的地址初始化如下:short Screen:*ps_Screen=&Screen:_height; 类成员的指针必需总是通过特定的对象或指向改类型的对象的指针来拜访;是通过使用两个指 针对类对象和引用的 .* ,以及针对指向类对象的指针的-* ;向成员操作符的指针 18. 假如采纳动态多态性,要调用虚函数的是()A. 基类对象指针 B. 对象名 C.
14、基类对象 D. 派生类名 答案: A 解析:基类指针或者基类的引用调用虚函数都会产生动态多态性19. 如有以下定义,就说法错误选项()int a=100,*p=&a; A. 声明变量 p,其中 *表示 p是一个指针变量 B. 变量 p经初始化,获得变量 a的地址 C. 变量 p只可以指向一个整型变量 D. 变量 p的值为 100 答案: D 解析:指针变量犹如其他变量一样,在使用之前必需先声明;声明指针变量的格式为:*; 其中, 是指针变量所指向对象的类型,它可以是C+语言预定义的类型,也可以是用户自定义类型; 是用户自定义的标识符;符号 *表示 是指针变量;而不是一般变量; * 表示指针,
15、p是变量, p指向一个整型的变量,值为 a的地址值, *p=100;20. C+语言建立类族是通过()A. 类的嵌套 B. 类的继承 C. 虚函数 D. 抽象类 答案: B 解析:类族即同一个类派生出来的类,各个类是兄弟或父子关系;二、填空题(本大题共 20小题,每道题 1分,共 20分)请在每道题的空格中填上正确答 案;错填、不填均无分;1. 假设 int a=1,b=2;就表达式 +a/b*b-的值为 _;答案: 2 解析前缀或表示先使变量值变化,再使用,这和后缀恰恰相反;但是编译名师归纳总结 - - - - - - -第 3 页,共 10 页精选学习资料 - - - - - - - -
16、- cout+a/b*b-时,先 +a/b 值为 1,后 1*b- ,先取 b 2,结果为 2,再让 b 1;2. 复制构造函数使用 _作为形式参数;答案:对象的引用解析复制构造函数使用对象的引用来初始化一个新对象 , 防止暂时产生对象;3. 通过 C+语言中的 _机制,可以从现存类中构建其子类;答案:继承解析继承概念,从现有的类生成新类,原有的类称为父类或基类,新类又称子类或派生类或衍生类,它是对基类的扩充;4. 静态成员函数、友元函数、构造函数和析构函数中,不属于成员函数的是 _;答案:友元函数解析友元函数不是类成员,但可以拜访类成员;类的封装性保证了数据的安全,但引入友元,虽然拜访类是便
17、利了,但的确破坏类拜访的安全性;5. 在下面的类定义中,私有成员有 _;class Location int X,Y; protected: int zeroX,zerxY; int SetZerointzeroX, intzeroY; private: int length,height; public: void initint initX,int initY; int GetX; int GetY; ; 答案: X,Y,length,height 6. 在 C+程序设计中,建立继承关系倒挂的树应使用 _继承;答案:单解析一个基类可以派生多个子类,一个子类可以再派生出多个子类,这样就形成了
18、一个倒立 的树;7. C+支持的两种多态性分别是_多态性和运行多态性;答案:静态或编译解析多态性包括静态(编译时)的和动态(运行时)的动态性;8. C+中语句 const char * const p=“ hello ” ;所定义的指针p和它所指的内容都不能被_;答案:修改解析使用 const 修改的内容不能修改,这里同时修饰地址和值,表示地址和值都不变;9. 在 C+中,定义虚函数的关键字是 _;答案: virtual 修饰的函数,就称为虚函数;解析在一般函数前面用 virtual10. 采纳私有派生方式,基类的 public 成员在私有派生类中是 _成员;答案:私有11. 对赋值运算符进行
19、重载时,应声明为_函数;答案:类成员解析运算符重载的方法有友元或者成员函数两种途径,但是赋值运算符只能使用成员函数的 方法来实现;12. 在 C+中有两种参数传递方式即值传递和_传递;答案:引用解析函数参数传递有传值和传引用两种;13. 预处理命令以 _符号开头;答案: operater 解析文件包含、预处理和编译都是以开头;14. 在构造函数和析构函数中调用虚函数时采纳_;答案:静态联编解析在析构或构造函数调用虚函数发生静态多态性;15. C+是通过引用运算符_来定义一个引用的;答案: & 解析引用是 C不具有使用方法,它表示变量的别名,在函数中使用很频繁,由于调用形式同 传值调用,但修改形
20、参实参也会相应转变的特点;16. 假如要把类 B的成员函数 void fun说明为类 A的友元函数,就应在类中加入语句_;答案: friend void B:fun; 解析声明成员函数作为另外一个类的友元函数时,使用类作用域运算符:;17. 假如要把 PI 声明为值为 3.14159 类型为双精度实数的符号常量,该声明语句是 _;答案: const double PI3.14159; 或者 const double PI 3.14159; 解析使用 const 声明符号常量,常量和常量值可以用括号也可以赋值号;18. 在 C四个流对象中,_用于标准屏幕输出;答案: cout 名师归纳总结 -
21、- - - - - -第 4 页,共 10 页精选学习资料 - - - - - - - - - 解析 cin 、 cout 、cerr 和 clog 中 cin 用于输入, cout 用于输出, cerr 、clog 错误处理;19. 执行以下代码 int a=32; double c=32; cout.setfios:hex; couthex:a=a,c=cendl; cout.unsetfios:hex; 程序的输出结果为 _;答案: hex:a=20,c=32 解析用十六进制只能输出整型数据,而不能将其它类型数据转换成十六进制的数据输出;所 以 double 类型不变仍旧是 32( do
22、uble 类型);20. 已知有 20个元素 int 类型向量 V1,如用 V1初始化为 V2向量,语句是 _;答案: ector V2V1; 解析采纳向量初始化另一个向量的形式:vector name1name; 三、改错题(本大题共 5小题,每道题 4分,共 20分)1. #include class A private: int x; public: Aint ix=i; Ax=0; friend int minA&,A&; ; int minA & a,A &b return a.xb.x.a.x:b.x; void main A a3,b5; couta.mina,bendl; 答案
23、: couta.mina,bendl;友元函数不是类成员,所以对象a不能使用 a.mina,b这种方法; min就是一个一般的友元函数;修改 coutmina,bendl; 2. #include class shape public: virtual int areareturn 0; ; class rectangle:public shape public: int a, b; void setLength int x, int y a=x;b=y; int area return a*b; ; void main rectangle r; r.setLength3,5; shape s
24、1,*s2=&r; cout r.area endl; s2=s1; cout s2.areaendl; 答案: shape s1,*s2=r;指针使用错误;s是指针使用它指向对象的成员有两种方法,有下面两行可知,使用的是引用;修改改为 shape &s=r; 3. 下面的类定义中有一处错误,请用下横线标出错误所在行并给出修改看法;#include template class A private: T x,y,s; public: AT a,T b x=a,y=b;s=x+y; void show coutx+y=sendl; 名师归纳总结 - - - - - - -第 5 页,共 10 页
25、精选学习资料 - - - - - - - - - ; void main A add10,100; add.show; 答案:修改 A add10,100; 解析 A add10,100; 类模板的使用,参数实例化后生成模板类;用类模板定义对象时要指定参数类型;4. 生成具有 n个元素的动态数组;#include void main int n; cinn; int an ; a0 =2; couta 0endl; 答案: int a n; 生成具有 n个元素的动态数组,要使用new,所以 int a n ; 错误;修改 int *a=new intn; 5. #include class A
26、 int i; public: virtual void fun=0; Aint a i=a; ; class B:public A int j; public: void fun coutB:fun n; Bint m,int n=0:Am,jn ; void main A *pa; B b7; pa=&b; 答案: Bint m,int n=0:Am,jn 由于基类是抽象类,不能被实例化,所以在派生类中不能 调用初始化基类对象;所以 Bint m,int n=0:Am,jn 错误,删去 Am;修改 Bint m,int n=0:jn 四、完成程序题 本大题共 5小题,每道题 4分,共 20
27、分 1. 在下面程序横线处填上适当字句,以使该程序执行结果为:50 4 34 21 10 0 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 =an-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; fa,5;fd,6; for int i=0;i5;i+ cout a i ; cout endl; for i=0;i6;i+ cout di ; cout
28、endl; 答案: T a ,int n,T t=0; 解析不同的数据类型的调用,使用了模板;f 函数增加 t 变量,由于实参类型不同,所以t 的第 6 页,共 10 页名师归纳总结 - - - - - - -精选学习资料 - - - - - - - - - 类型应当是 T类型的;2. 完成下面类中成员函数的定义;#include #include class Arr protected: float *p; int n;/ 数组大小(元素个数)public: Arrint sz=10 n=sz; p=new float n; Arrvoid _ int Getnvoid const retu
29、rn n; float & operator int i _ void Print; ; void Arr:Print int i; fori=0;iGetn;i+ if i%10=0 cout endl; coutsetw6p i ; coutendl; void main Arr a20; for int i=0;ia.Getn;i+ ai =i* 2; a.Print; 答案: delete p;, return pi ; 解析在析构函数中释放对象空间;其次个是对运算符的重载,函数返回类型是实型,形参 i ,取得下标为 i 的元素的值;3. 下面是一个输入半径,输出其面积和周长的 #in
30、clude _; _; void main double rad; coutrad; double l=2.0*pi*rad; double s=pi*rad*rad; cout n The long is:lendl; coutThe area is:sendl; C+程序,在下划线处填上正确的语句;答案: using namespace std,#define pi 3.14159 解析进行输入或输出要引入iostream, 所以 using namespace std;从标点看没有分号,所以使用宏定义, #define pi 3.14159;4. 在下划线处填上缺少的部分;#includ
31、e class Samp public: void Setijint a,int bi=a,j=b; Samp coutDestroying.iendl; 名师归纳总结 - - - - - - -第 7 页,共 10 页精选学习资料 - - - - - - - - - int GetMutireturn i*j; protected: int i; int j; ; int main Samp *p; p=new Samp5; if.p coutAllocation error n; return 1; forint j=0;j5;j+ pj .Setijj,j; forint k=0;k5;
32、k+ coutMuti k is:pk ._endl; _ return 0; 答案: GetMuti , delete p; 解析调用只有一个有返回值的成员函数,释放对象数组所占的空间;5. 请在下面程序的横线处填上适当内容,以使程序完整, 并使程序的输出为: 11,10 13,12 #include class A int a; public: Aint i=0a=i; int Getareturn a; void showcoutaendl; ; class B A a; int b; public: Bint i,int j_ void showcouta.Geta,bendl; ;
33、void main B b 2 =B10,11,B12,13; forint i=0;i2;i+ _ 答案: :aj,bi, b i .show; 解析在构造函数中对数据成员初始化,从结果先输出 输出成员,调用 show成员;a,后 b,所以对 a j , b=i; 在循环中五、程序分析题 本大题共 2小题,每道题 5分, 共 10分 1. 给出下面程序输出结果;#include class Base private: int Y; public: n; Baseint y=0 Y=y;coutBasey Base coutBase n; void print cout Y ; ; class
34、 Derived:public Base private: int Z; public: Derived int y, int z:Basey Z=z; coutDerivedy,z n; 名师归纳总结 - - - - - - -第 8 页,共 10 页精选学习资料 - - - - - - - - - Derived cout Derivedn; void print Base:print; coutZendl; ; void main Derived d10,20; d.print; 答案: Base10 Derived10,20 10 20 Derived Base 解析派生类对象,先调用
35、基类构造函数输出 Base10 ,后调用派生类构造函数输出 Derived10,20,后执行 d.print, 调用派生类的 print,再调用 Base:print 输出 10,后返回 输出 z的值 20;后派生类析构,再基类析构;2. 给出下面程序输出结果;#include class test int x; public: testint i=0:xi virtual void fun1 cout test:xxendl; ; class ft:public test int y; public: void fun1cout ft:y=yendl; ftint i=2:testi,yi
36、; void main ft ft13; void test:*p; p=test:fun1; ft1.*p; 答案: ft:y=3 解析指向函数的指针的使用,p指向 fun1 函数,( ft1.*p)实际就是调用ft1 对象的fun1 ()函数;六、程序设计题(本大题共 1小题,共 10分)1. 求 nn=3 个同学的最高分和最低分及姓名,已有 student 类的实现部分;#include #include class student char name 10; int deg; public: studentchar na =,int d=0; char * getname; frien
37、d int comparestudent &s1,student &s2; int getdeg; ; void main student 类声明和 main函数,完成student st =student王强 ,74,student李刚 ,68,student张雪 ,84; int i=0,min=0,max=0; fori=1;i3;i+ ifcomparestmax ,st i =-1 max=i; ifcomparestmin,st i =1 min=i; cout 最高分: st max.getdeg姓名 :st max.getnameendl; 第 9 页,共 10 页cout 最低分 :*st+min.getdeg姓名 :stmax.getnames2.deg return 1; else ifs1.deg=s2.deg return 0; else return -1; int student:getdeg return deg;_ 名师归纳总结 - - - - - - -第 10 页,共 10 页