2022年C++试题及答案复习过程.pdf

上传人:C****o 文档编号:12785539 上传时间:2022-04-26 格式:PDF 页数:11 大小:103.43KB
返回 下载 相关 举报
2022年C++试题及答案复习过程.pdf_第1页
第1页 / 共11页
2022年C++试题及答案复习过程.pdf_第2页
第2页 / 共11页
点击查看更多>>
资源描述

《2022年C++试题及答案复习过程.pdf》由会员分享,可在线阅读,更多相关《2022年C++试题及答案复习过程.pdf(11页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、C+试 题 及 答 案( 五 )精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 1 页,共 11 页 - - - - - - - - - - C+ 程序设计模拟试卷( 五) 一、单项选择题 ( 本大题共 20小题,每小题 1分,共 20分) 在每小题列出的四个备选项中只有一个是符合题目要求的,请将其代码填写在题后的括号内。错选、多选或未选均无分。1. 静态成员函数没有()A. 返回值B. this 指针C. 指针参数D. 返回类型答案: B 解析:静态成员函数是普通的函数前加入static,它具有函数的所

2、有的特征:返回类型、形参,所以使用静态成员函数,指针可以作为形参,也具有返回值。静态成员是类具有的属性,不是对象的特征,而this 表示的是隐藏的对象的指针,因此静态成员函数没有this 指针。静态成员函数当在类外定义时,要注意不能使用static关键字作为前缀。由于静态成员函数在类中只有一个拷贝(副本),因此它访问对象的成员时要受到一些限制:静态成员函数可以直接访问类中说明的静态成员,但不能直接访问类中说明的非静态成员;若要访问非静态成员时,必须通过参数传递的方式得到相应的对象,再通过对象来访问。2. 在类的定义中,用于为对象分配内存空间,对类的数据成员进行初始化并执行其他内部管理操作的函数

3、是()A. 友元函数B. 虚函数C. 构造函数D. 析构函数答案: C 解析:定义构造函数作用就是初始化对象,而析构函数释放对象空间。虚函数用于完成多态性,友元增加访问方便性。3. 所有在函数中定义的变量,都是()A. 全局变量B. 局部变量C. 静态变量D. 寄存器变量答案: B 解析:变量存储类可分为两类:全局变量和局部变量。(1)全局变量:在函数外部定义的变量称为全局变量,其作用域为:从定义变量的位置开始到源程序结束。全局变量增加了函数之间数据联系的渠道,全局变量作用域内的函数,均可使用、修改该全局变量的值,但是使用全局变量降低了程序的可理解性,软件工程学提倡尽量避免使用全局变量。(2)

4、局部变量:在函数内部定义的变量称为局部变量,其作用域为:从定义变量的位置开始到函数结束。局部变量包含自动变量(auto )静态变量( static)以及函数参数。auto 变量意味着变量的存储空间的分配与释放是自动进行的。说明符auto 可以省略。函数中的局部变量存放在栈空间。在函数开始运行时,局部变量被分配内存单元,函数结束时,局部变量释放内存单元。因此,任两个函数中的局部变量可以同名,因其占有不同的内存单元而不影响使用。这有利于实现软件开发的模块化。static变量是定义在函数体内的变量,存放在静态存储区,不用栈空间存储,其值并不随存储空间的释放而消失。4. 假定 AB为一个类,则执行“A

5、B a(2), b3,*p 4; ”语句时调用该类构造函数的次数为()A. 3 B. 4 C. 5 D. 9 答案: B 解析: a(2) 调用 1次带参数的构造函数,b3调用 3次无参数的构造函数,指针没有给它分配空间,没有调用构造函数。所以共调用构造函数的次数为4。5. 如果表达式 +a中的“ +”是作为成员函数重载的运算符,若采用运算符函数调用格式,则可表示为()A. a.operator+(1) B. operator+(a) C. operator+(a,1) D. a.operator+() 答案: D 解析:运算符的重载,前缀先让变量变化。调用a,等价为 a.operator+(

6、),注意无参的形式。后缀的话a+, 等价于 a.operator(0),带形参,形参名可省。6. 已知 f1 和f2 是同一类的两个成员函数,但f1 不能直接调用 f2 ,这说明()A. f1 和f2 都是静态函数B. f1 不是静态函数, f2 是静态函数C. f1 是静态函数, f2 不是静态函数精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 2 页,共 11 页 - - - - - - - - - - D. f1 和f2 都不是静态函数答案: C 解析:普通成员函数可以调用静态函数,相反静态函数不能

7、调用普通成员函数,这与普通函数与常成员函数相同。因此选择C项。7. 一个函数功能不太复杂,但要求被频繁调用,则应把它定义为()A. 内联函数B. 重载函数C. 递归函数D. 嵌套函数答案: A 解析:内联函数特征代码少,频繁调用,执行效率高。重载函数解决统一接口的问题;递归是子程序调用,程序调用要耗费很多空间和时间,循环/ 迭代都比递归有效率得多,递归只是从形式上,逻辑比较简洁。嵌套函数即反复调用,速度较慢。所以选择A 项。8. 解决定义二义性问题的方法有()A. 只能使用作用域分辨运算符B. 使用作用域分辨运算符或成员名限定C. 使用作用域分辨运算符或虚基类D. 使用成员名限定或赋值兼容规则

8、答案: B 解析:解决二义性问题主要要两种方法:(1) 赋值兼容规则;(2) 虚基类。9. 在main函数中可以用 p.a 的形式访问派生类对象p的基类成员 a,其中 a是()A. 私有继承的公有成员B. 公有继承的私有成员C. 公有继承的保护成员D. 公有继承的公有成员答案: D 解析:公有成员可以在类外访问,保护类型成员可以在派生类中访问,但不能在类外访问,在 main函数中访问,说明a是公有成员。只有公有继承时a才能是公有的,所以D项正确。10. 在C+ 中不返回任何类型的函数应该说明为()A. int B. char C. void D. double 答案: C 解析:无形参或无返回

9、值都可以用void 来声明, int char double分别是整型、字符型和实型。11. 若Sample类中的一个成员函数说明如下:void set(Sample& a),则 Sample& a的含义是()A. 指向类 Sample的名为 a的指针B. a是类 Sample的对象引用,用来作函数Set()的形参C. 将a的地址赋给变量 Set D. 变量 Sample与a按位与的结果作为函数Set的参数答案: B 解析:成员函数使用对象的引用作为形参。该函数的功能是将已知对象的所有数据成员的值拷贝给相应对象的所有数据成员,不会建立临时对象,这里是对象的引用所以选择B 。12. 要实现动态联

10、编必须()A. 通过成员名限定来调用虚函数B. 通过对象名来调用虚函数C. 通过派生类对象来调用虚函数D. 通过对象指针或引用来调用虚函数答案: D 解析:通过基类指针或基类引用来调用虚函数实现动态多态性,静态多态性通过重载来实现的。所以选择 D项。13. 在派生类中定义虚函数时,可以与基类中相应的虚函数不同的是()A. 参数类型B. 参数个数C. 函数名称D. 函数体答案: D 解析:虚函数在基类和派生类,具有相同的返回类型、形参类型和形参个数,而函数体可以根据不同的派生类或基类实现不同的操作,即不同函数体。14. 实现两个相同类型数加法的函数模板的声明是()A. add(T x,T y)

11、B. T add(x,y) C. T add(T x,y) D. T add(T x,T y) 答案: D 精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 3 页,共 11 页 - - - - - - - - - - 解析:实现两个相同类型数加法结果应该和操作数具有相同类型。进行加法运算后结果也是和参数具有相同类型,需要返回值。A无返回值时要用void,B 形参无类型, C 形参 y没有类型,所以选择 D 项。15. 下列不是描述类的成员函数的是()A. 构造函数B. 析构函数C. 友元函数D. 拷贝构造

12、函数答案: C 解析:友元函数虽然不是成员函数但是可以访问类所有成员。构造函数、析构函数和拷贝构造函数 ( 复制构造函数 ) 都是类的特殊函数用于对象的创建和撤销,所以选择C项。16. 继承机制的作用是()A. 信息隐藏B. 数据封装C. 定义新类D. 数据抽象答案: 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 解析:

13、A中 p是指针即地址,错误;B 选项中 A1不是指针不能使用指向运算符-, 错误;“ *”比“ . ”级别要高,所以D选项 *A1.p=5 相当于 (*A1).p=5;错误。另外涉及到指向成员函数时注意以下几点:指向成员函数的指针必须于其赋值的函数类型匹配的三个方面:(1) 参数类型和个数;(2) 返回类型; (3) 它所属的类类型。成员函数指针的声明:指向short 型的 Screen类的成员的指针定义如下: short Screen:* ps_Screen; ps_Screen 可以用 _height 的地址初始化如下:short Screen:*ps_Screen=&Screen:_he

14、ight; 类成员的指针必须总是通过特定的对象或指向改类型的对象的指针来访问。是通过使用两个指向成员操作符的指针( 针对类对象和引用的.* ,以及针对指向类对象的指针的-*) 。18. 如果采用动态多态性,要调用虚函数的是()A. 基类对象指针B. 对象名C. 基类对象D. 派生类名答案: A 解析:基类指针或者基类的引用调用虚函数都会产生动态多态性19. 若有以下定义,则说法错误的是()int a=100,*p=&a; A. 声明变量 p,其中 *表示 p是一个指针变量B. 变量 p经初始化,获得变量a的地址C. 变量 p只可以指向一个整型变量D. 变量 p的值为 100 答案: D 解析:

15、指针变量如同其他变量一样,在使用之前必须先声明。声明指针变量的格式为:*; 其中, 是指针变量所指向对象的类型,它可以是C+语言预定义的类型,也可以是用户自定义类型。 是用户自定义的标识符。符号*表示 是指针变量。而不是普通变量。 * 表示指针, p是变量, p指向一个整型的变量,值为a的地址值, *p=100。20. C+语言建立类族是通过()A. 类的嵌套B. 类的继承C. 虚函数D. 抽象类答案: B 解析:类族即同一个类派生出来的类,各个类是兄弟或父子关系。二、填空题(本大题共20小题,每小题 1分,共 20分)请在每小题的空格中填上正确答案。错填、不填均无分。1. 假设 int a=

16、1,b=2;则表达式 (+a/b)*b-的值为 _。答案: 2 解析前缀或表示先使变量值变化,再使用,这和后缀恰恰相反。但是编译精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 4 页,共 11 页 - - - - - - - - - - cout(+a/b)*b-时,先 +a/b 值为 1,后 1*b- ,先取 b2,结果为 2,再让 b1。2. 复制构造函数使用_作为形式参数。答案:对象的引用解析复制构造函数使用对象的引用来初始化一个新对象, 避免临时产生对象。3. 通过 C+语言中的 _机制,可以从现

17、存类中构建其子类。答案:继承解析继承概念,从现有的类生成新类,原有的类称为父类或基类,新类又称子类或派生类或衍生类,它是对基类的扩充。4. 静态成员函数、友元函数、构造函数和析构函数中,不属于成员函数的是_。答案:友元函数解析友元函数不是类成员,但可以访问类成员。类的封装性保证了数据的安全,但引入友元,虽然访问类是方便了,但确实破坏类访问的安全性。5. 在下面的类定义中,私有成员有_。class Location int X,Y; protected: int zeroX,zerxY; int SetZero(intzeroX, intzeroY); private: int length,h

18、eight; public: void init(int initX,int initY); int GetX(); int GetY(); ; 答案: X,Y,length,height 6. 在C+程序设计中,建立继承关系倒挂的树应使用_继承。答案:单解析一个基类可以派生多个子类,一个子类可以再派生出多个子类,这样就形成了一个倒立的树。7. C+支持的两种多态性分别是_多态性和运行多态性。答案:静态或编译解析多态性包括静态(编译时)的和动态(运行时)的动态性。8. C+中语句 const char * const p=“hello ”;所定义的指针p和它所指的内容都不能被_。答案:修改解析

19、使用 const 修改的内容不能修改,这里同时修饰地址和值,表示地址和值都不变。9. 在C+中,定义虚函数的关键字是_。答案: virtual 解析在普通函数前面用virtual修饰的函数,就称为虚函数。10. 采用私有派生方式,基类的public 成员在私有派生类中是_成员。答案:私有11. 对赋值运算符进行重载时,应声明为_函数。答案:类成员解析运算符重载的方法有友元或者成员函数两种途径,但是赋值运算符只能使用成员函数的方法来实现。12. 在C+ 中有两种参数传递方式即值传递和_传递。答案:引用解析函数参数传递有传值和传引用两种。13. 预处理命令以 _符号开头。答案: operater

20、解析文件包含、预处理和编译都是以开头。14. 在构造函数和析构函数中调用虚函数时采用_。答案:静态联编解析在析构或构造函数调用虚函数发生静态多态性。15. C+是通过引用运算符_来定义一个引用的。答案: & 解析引用是 C不具有使用方法,它表示变量的别名,在函数中使用很频繁,因为调用形式同传值调用,但修改形参实参也会相应改变的特征。16. 如果要把类 B的成员函数 void fun()说明为类 A的友元函数,则应在类中加入语句_。答案: friend void B:fun(); 解析声明成员函数作为另外一个类的友元函数时,使用类作用域运算符:。17. 如果要把 PI声明为值为 3.14159

21、类型为双精度实数的符号常量,该声明语句是_。答案: )const double PI(3.14159);或者 const double PI3.14159; 解析使用 const 声明符号常量,常量和常量值可以用括号也可以赋值号。18. 在C四个流对象中,_用于标准屏幕输出。答案: cout 精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 5 页,共 11 页 - - - - - - - - - - 解析 cin 、cout 、cerr 和clog 中cin 用于输入, cout 用于输出, cerr 、

22、clog 错误处理。19. 执行下列代码int a=32; double c=32; cout.setf(ios:hex); couthex:a=a,c=cendl; cout.unsetf(ios:hex); 程序的输出结果为_。答案: hex:a=20,c=32 解析用十六进制只能输出整型数据,而不能将其它类型数据转换成十六进制的数据输出。所以double 类型不变仍然是32(double 类型)。20. 已知有 20个元素 int 类型向量 V1,若用 V1初始化为 V2向量,语句是 _。答案: ector V2(V1); 解析采用向量初始化另一个向量的形式:vector name1(n

23、ame); 三、改错题(本大题共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) 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

24、)endl; 2. #include class shape public: virtual int area()return 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.setLength(3,5); shape s1,*s2=&r; cout r.area() endl; s2=s1; cout s2.area()endl; 答案: shape s1,

25、*s2=r;指针使用错误。s是指针使用它指向对象的成员有两种方法,有下面两行可知,使用的是引用。修改改为 shape &s=r; 3. 下面的类定义中有一处错误,请用下横线标出错误所在行并给出修改意见。#include template class A private: T x,y,s; public: A(T a,T b) x=a,y=b;s=x+y; void show() coutx+y=sendl; 精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 6 页,共 11 页 - - - - - - -

26、- - - ; void main() A add(10,100); add.show(); 答案:修改 A add(10,100); 解析 A add(10,100);类模板的使用,参数实例化后生成模板类。用类模板定义对象时要指定参数类型。4. 生成具有 n个元素的动态数组。#include void main() int n; cinn; int an ; a0=2; couta 0endl; 答案: int an; 生成具有 n个元素的动态数组,要使用new,所以 int an; 错误。修改 int *a=new intn; 5. #include class A int i; publ

27、ic: virtual void fun()=0; A(int a) i=a; ; class B:public A int 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; 答案: 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) 四、完成程序题 (

28、 本大题共 5小题,每小题 4分,共 20分) 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=ai , a i =an-1-i, a n-1-i=t; void main () int a5=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 a i ; cout endl

29、; for (i=0;i6;i+) cout di ; cout endl; 答案: T a ,int n,T t=0; 解析不同的数据类型的调用,使用了模板。f 函数增加 t 变量,因为实参类型不同,所以t 的精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 7 页,共 11 页 - - - - - - - - - - 类型应该是 T类型的。2. 完成下面类中成员函数的定义。#include #include class Arr protected: float *p; int n;/数组大小(元素个数)

30、public: Arr(int sz=10) n=sz; p=new floatn; Arr(void) _ int Getn(void) const return n; float & operator (int i) _ void Print(); ; void Arr:Print() 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+) ai =i* 2; a.Print(); 答案: de

31、lete p;,return pi ; 解析在析构函数中释放对象空间。第二个是对运算符的重载,函数返回类型是实型,形参i ,取得下标为 i 的元素的值。3. 下面是一个输入半径,输出其面积和周长的C+ 程序,在下划线处填上正确的语句。#include _; _; 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; 答案: using namespace std,#define pi 3.14159 解

32、析进行输入或输出要引入iostream, 所以 using namespace std;从标点看没有分号,所以使用宏定义, #define pi 3.14159。4. 在下划线处填上缺少的部分。#include class Samp public: void Setij(int a,int b)i=a,j=b; Samp() coutDestroying.iendl; 精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 8 页,共 11 页 - - - - - - - - - - int GetMuti()r

33、eturn i*j; protected: int i; int j; ; int main() Samp *p; p=new Samp 5; if(!p) coutAllocation errorn; return 1; for(int j=0;j5;j+) pj .Setij(j,j); for(int k=0;k5;k+) coutMuti k is:pk._endl; _ return 0; 答案: GetMuti() ,delete p; 解析调用只有一个有返回值的成员函数,释放对象数组所占的空间。5. 请在下面程序的横线处填上适当内容,以使程序完整, 并使程序的输出为: 11,10

34、 13,12 #include class A int a; public: A(int i=0)a=i; int Geta()return a; void show()coutaendl; ; class B A 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+) _ 答案: :a(j),b(i),bi .show(); 解析在构造函数中对数据成员初始化,从结果先输出a,后 b,所以对 aj ,b=i

35、; 在循环中输出成员,调用 show成员。五、程序分析题 ( 本大题共 2小题,每小题 5分, 共10分) 1. 给出下面程序输出结果。#include class Base private: int Y; public: Base(int y=0) Y=y;coutBase(y)n; Base() coutBase()n; void print() cout Y ; ; class Derived:public Base private: int Z; public: Derived (int y, int z):Base(y) Z=z; coutDerived(y,z)n; 精品资料 -

36、- - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 9 页,共 11 页 - - - - - - - - - - Derived() coutDerived()n; void print() Base:print(); coutZendl; ; void main() Derived d(10,20); d.print(); 答案: Base(10) Derived(10,20) 10 20 Derived() Base() 解析派生类对象,先调用基类构造函数输出Base(10) ,后调用派生类构造函数输出Derived(

37、10,20),后执行 d.print(),调用派生类的 print,再调用 Base:print()输出 10,后返回输出 z的值 20。后派生类析构,再基类析构。2. 给出下面程序输出结果。#include class test int x; public: test(int i=0):x(i) virtual void fun1() cout test:xxendl; ; class ft:public test int y; public: void fun1()cout ft:y=yendl; ft(int i=2):test(i),y(i) ; void main() ft ft1(

38、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 student char name 10; int deg; public: student(char na =,int d=0); char *

39、getname(); friend int compare(student &s1,student &s2); int getdeg(); ; void main() student st =student(王强 ,74),student(李刚 ,68),student(张雪 ,84); int i=0,min=0,max=0; for(i=1;i3;i+) if(compare(stmax,st i )=-1) max=i; if(compare(stmin,st i )=1) min=i; cout 最高分: st max.getdeg()姓名 :st max .getname()endl; cout 最低分 :(*(st+min).getdeg()姓名 :stmax.getname()s2.deg) return 1; else if(s1.deg=s2.deg) return 0; else return -1; int student:getdeg() return deg;_ 精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 11 页,共 11 页 - - - - - - - - - -

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 高考资料

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

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁