C++考试试题重点_第1页
C++考试试题重点_第2页
C++考试试题重点_第3页
C++考试试题重点_第4页
C++考试试题重点_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、一、概念题1类和对象有什么区别和联系?类是一种复杂的数据类型,它是将不同类型的数据和与这些数据相关的操作封装在一起 的集合体。类是对某一类对象的抽象,而对象是某一种类的实例。2什么是类的实现?将类所有未编写函数体的成员函数在类体外全部编写出来。3. this指针的概念是什么?类中所有的成员函数(静态成员函数除外)都隐含了第一个参数,这个隐含的第一个参 数就是 this指针,在成员函数的实现代码中,所有涉及对类的数据成员的操作都隐含为对this指针所指对象的操作。 4.为什么要引入构造函数和析构函数?构造函数的作用是为类对象的数据成员赋初值,构造函数在定义类对象时由系统自动调用;在 一个对象死亡

2、或者说退出生存期时,系统会自动调用析构函数,因此可以在析构函数定义中,设置语句释放该对象所占用的一些资源。5 .什么时候需要自定义拷贝构造函数?若程序员没有定义拷贝构造函数,则编译器自动生成一个缺 省的拷贝构造函数,它可能会产生什么问题?当有用一个已经存在对象创建一个同类型的新对象的需求时。当对象含有指针数据成员,并用它初始化同类型的另一个对象时,默认的拷贝构造函数只能将该对象的数据成员复制给另一个对象,而不能将该对象中指针所指向的内存单元也复制过去。 这样,就可能出现 同一内存单元释放两次,导致程序运行出错。6 .什么是堆对象?创建和回收堆对象的方法是什么?堆区用来存放在程序运行期间,根据需

3、要随时建立的变量(对象),建立在堆区的对象称为堆对象,当堆对象不再使用时,应予以删除,回收所占用的动态内存。创建和回收堆对象的方 法是使用new和delete运算符。7 .为什么需要静态数据成员?静态数据成员的定义和初始化方法是什么?定义静态数据成员是为了同一个类的不同对象之间共享公共数据成员; 用关键字static 可以把数据成员定义成静态数据成员;在定义的类被使用前,要对其中的静态数据成员进行初始化,初始化时不必添加关键字static。&什么是静态成员函数?静态成员函数和非静态成员函数有什么区别?用关键字static可以把这成员函数定义成静态成员函数。(1)静态成员函数只能访问类的

4、静态数据成员,不能访问类的非静态数据成员。因为静态成员函数是类 的成员,不涉及具体的对象,访问静态成员函数常用类名引导。非静态成员函数可以访问类的静态数据成员,也可以访问非静态数据成员。因为类的静态成员总 是存在的。静态成员函数和非静态成员函数,最主要的差别是非静态成员函数隐含了第一个参数this指针,静 态成员函数不含this指针。9 .结构struct和类class有什么异同?struct和class都可以定义类,但是缺省访问权限说明时,struct的成员是公有的,而class的成 员是私有的。在C+中,struct可被class代替。10 .比较类的三种继承方式 public '

5、 protected、private之间的区别。采用public公有派生,基类成员的访问权限在派生类中保持不变,即基类所有的公有或保护成员在派生类中仍为公有或保护成员。public派生最常用,可以在派生类的成员函数中访问基类的非私有成员,可通过派生类的对象直接访问基类的公有成员。采用private私有派生,基类所有的公有和保护成员在派生类中都成为私有成员,只允许在派生类 的成员函数中访问基类的非私有成员。private派生很少使用。采用protected保护派生,基类所有的公有和保护成员在派生类中都成为保护成员,只允许在派生类的 成员函数和该派生类的派生类的成员函数中访问基类的非私有成员。11

6、 派生类构造函数和析构函数执行的次序是怎样的?派生类构造函数的执行次序:首先,调用基类构造函数,调用顺序按照它们被继 承时声明的基类名顺序执行;其次,调用内嵌对象构造函数,调用次序为各个对象在派生类内声明的顺序;最后,执行派生类构造函数体中的内容。派生类析构函数执行过程与构造函数执行过程相反。即当派生类对象的生存期结束时,首先调 用派生类的析构函数,然后调用内嵌对象的析构函数,再调用基类的析构函数。12 .什么叫虚基类?有什么作用?在多重继承中,如果多条继承路径上有一个公共的基类,则在这些路径的汇合点上的派生类会 产生来自不同路径的公共基类的多个拷贝,如果用virtual把公共基类定义成虚基类

7、,则只会保留公共基类的一个拷贝。引进虚基类的目的是为了解决二义性问题,使得公共基类在它的派生类对象中只产生一个基类子对象。13 .什么是多态性,在曲中是如何实现多态的?多态是指同样的消息被不同类型的对象接收时导致完全不同的行为,是对类的特定成员函数的再抽象。C+支持的多态有多种类型,重载(包括函数重载和运算符重载)和虚函数是其 中主要的方式。14 .什么是抽象类,其有何作用?抽象类的派生类是否一定要给出纯虚函数的实现?含有纯虚函数的类称为抽象类。抽象类的主要作用是通过它为一个类族建立一个公共的 接口,使它们能够更有效地发挥多态特性。抽象类声明了一组派生类共同操作接口的通用语 义,而接口的完整实

8、现,即纯虚函数的函数体,要由派生类自己给出, 抽象类只能作为基类 被继承使用。抽象类的派生类不一定要给出纯虚函数的实现,没有给出纯虚函数的实现的派生类仍然还是抽象类。15 .在C+中能否声明虚构造函数,为什么?能否声明虚析构函数,有什么作用?在C+中不能声明虚构造函数。多态是不同的对象对同一消息有不同的行为特性,虚函数作为运行过程中多态的基础,主要是针对对象的,而构造函数是在对象产生之前运行的,因此虚构 造函数是没有童义的。在C+中可以声明虚析构函数。析构函数的功能是在该类对象消亡之前进行一些必要的清理工 作,如果一个类的析构函数是虚函数,那么,由它派生而来的所有子类的析构函数也是虚函数。析构

9、函数设置为虚函数之后,在使用指针引用时可以动态联编,实现运行时的多态,保证使用基类的指针就能够调用适当的析构函数对不同的对象进行清理工作。二、填空题1. 拷贝构造函数使用作为参数初始化创建中的对象。2. 在C+中,对于构造函数和析构函数来 说,是可以重载的,而 是不可以重载的。3. B类中包含一个A类的成员a,则生成B类的对象时构造函数的调用顺序为。4,类的每一个成员函数(静态成员函数除外)都有一个隐含的参数,叫做。假设类名为A,则该参数的类型为。5. 类的静态成员分为 和。6. 声明友元的关键字是。7. 如果类A继承了 B,则类A称为,类B称为。&派生类对基类的继承有三种方式: 、和

10、。9 如果只想保留公共基类的一个拷贝,就必须使用关键字 把这个公共基类定义为 虚基类。10 . 派生类的成员有两种来源,即 和。11 . 要想访问基类的private成 员变量,只能通过基类提供的 进行间接访问。12 .重载运算符应仍保持其原有的操作数个数、结合性和 。13 .对于双目运算符,若重载为类的成员函数,有 个参数;若重载为友元函数,则有个参数。14 .后缀“+”重载为类的成员函数(设类名为A)的形式为,重载为类的友元函数(设 类名为A)的形式为。15 .设有一时间类Time,现欲用成员函数方法重载运算符+,实现一个时间与一个整数的相加运算,所得结果为一个新时间,则成员函数的声明语句

11、为 。16 . C+语言支持的两种多态性分别 是编译时的多态性和 的多态性。17 .联编有两种方式,即和。18 .抽象类必须至少包含一个 。21 . Windows系统中消息的主要类型有、和。22 .当用户在窗口中按下鼠标左键时,Windows系统就会自动发送 消息给该窗口,如果程序要对此消息作出反应,则程序中应包含类似 函数。23 . OnDraw()函数有一个指向类的指针参数,通过该参数可以直接向视图输出。24 .应用程序将任何东西画到设 备中之前,必须明确索取一个。25 .对话框分为 和两种。26 .对话框的初始化工作一般在 和 中完成。27 . MFC中公用对话框有、和。28 . 视图

12、派生类可以选择类作其基类,可以实现文本编辑功能。29 .对于文档类,数据成员的初始化工作是在 函数中完成的。30 .如果修改了文档类中的数据,并要求重新显示,要用 或 发出重画消息,引起对OnDraw()的调用。31 .当执行cout语句输出endl数据项时,将使C+显示输出屏幕上的光标从当前位置移动到 的开始位 置。32 .假定x和y为整型,其值分别为 16和5,则a/y和double(x)/y的值分别为 和33 . strlen( "apple")的值为。34 . C+程序运行时的内在空间可以分为全局数据区,堆区,栈区和 区。35 .假定a是一个一维指针数组,则a+i所

13、指对象的地址比a大 字节。36 .如果一个派生类只有一个唯一的基类,则这样的继承称为。37 .假定AA是一个类,“ AA * abc()c on st; ”是该类中的一个成员函数的原型,在该函数体中 向*this 或其成员赋值。38 .假定用户没有给一个名为AB的类定义构造函数,则系统为其定义的构造函数为39 .假定用户为类AB定义了一个构造函数“ AB(int aa)a=aa; ,该构造函数实现对数据的初始化。40 .作为类的成员函数重载地个运算符时,参数表中只有一个参数,说明该运算符有 个操作数。41 . C+有两种联编方式,其中在程序编译时的联编叫做 联编42 .虚函数可以是另一类的 函

14、数43 .定义虚函数需要用 关键字44 .将函数“void vf()”定义为纯虚数的格式是virtual void vf()45 .拥有纯虚函数的类就是,该类不能产生类的实例46 .派生类没有重载基类的纯虚函数,则此派生类也是 47 .有如下程序#in elude <iostream.h>class CSAI_A(public:virtual void fun( )cout«"A";class CSAI_B:public CSAI_A(public:virtual void fun( )CSAI_A:fu n();cout«"B&q

15、uot;;void mai n()48 CSAI_A *p=new CSAI_B;p->fu n();delete p;)执行这个程序的输出结果是()答案:49 .有如下程序#in clude<iostream.h>const int T=8;void mai n()(int i,s=0;for(i=1 ;iv=T;i+)s+=i*i;cout«s«"cout«e ndl;)运行结果:50 .有如下程序in t ff(i nt x,i nt y)int乙cout«x«'+,«y«'

16、=,;cin> >z;if(x+y=z) retur n 1;else return 0;)函数功能:51 .有如下程序char *f(char *s)int n=strle n( s);char * r=new char n+1;for(i nt i=0;i <n ;i+)if(si>='a' && si<='z,)ri=si-'a'+'A:else ri=si;rn ='0: return r;)函数功能:52 . C+虚函数有两种调用方式,分别是 和多态调用方式53 .当运算符重载为成员

17、函数时,对象本身就是,不在参数表中显示地出现。54 .若以成员函数形式,为类 CSAI重载“double ”运算符,则该运算符重载函数的原则是55 .在表达式“ x+=y”中,“ +=”是作为非成员函数重载的运算符,若是使用显式的函数调用 代替直接使用运算符“ +=" ,这个表达式还可以表示为56 .将运算符“ >>”重载为类CSAI的友元函数的格式是:friend instream& operator »57 . this指针 破坏类的封装性。58 .通过指向基类的指针调用派生类对象的函数时,采用 调用。59 .下面是对按从小到大排列的有序数组an中进

18、行二分查找x的算法,若查找成功返回该元素的下标,否则返回1。int Binn arySearch(i nt aJ nt n J nt x)(int low=0,high=n-1;定义并初始化区间下界和上界变量in t mid;定义保存中点元素下标的变量while(low<=high)mid=(low+high)/2;jf(x=amid) else if(x<amid)high=mid-1;else)return -1;)60 .请补充完整如下的类定义:#in clude<stri ng.h>class Achar *a;public:A()a=O;定义无参构造函数,使

19、A的值为空A(char *aa)a= ;进行动态存储分配strcpy(a,aa);用aa所指字符串初始化a所指向的动态存储空间) ;定义析构函数,删除a所指向的动态存储空间;三、编程题1创建一个Employee类,该类中有字符数组表示姓名、街道地址、市、省和邮政编码。把表示构造函数、ChangeName函数、Display函数的函数原型放在类定义中, 构造函数初始化每个成员,Display函数把完整的对象数据打印出来。其中的数据成员是保护的,函数是公共的。2. 设计并测试类Point,其数据成员是直角坐标系的点坐标。友元函数distanee用来计算两点间的距离。3. 定义一个Rectangle

20、类,有宽width、长length等属性,重载其构造函数Rectangle >Recta ngle(i nt width , int len gth)。4. 编写一个程序,设计一个Cdate类,它应该满足下面的条件。用这样的格式输出日期:日月-年。 输出在当前日期上加两天后的日期。设置日期。5. 按照下面函数原型语句编写一个递归函数求出并返回数组a中n个元素的平方和。int f(int a,int n)6. 根据下面类中Sum函数成员的原型和注释写出它的类外定义。class AAint *a;int n;int MS;public:void Ini tAA(i nt aa,i nt nn

21、 ,i nt ms) if(nn> ms)cout«"Error!"«e ndl;exit(1);MS=ms;a=n ew in tMS;for(i nt i=0;i< n;i+)ai=aai;int Sum(); 求出并返回数组a中前n个元素之和);7. 定义一个基类有姓名、性别、年龄,再由基类派生出教师类和学生类,教师类增加工号、职称和工 资,学生类增加学号、班级、专业和入学成绩。&下歹IJ Shape类是一个表示形状的抽象类,area。为求图形面积的函数,total。则是一个 通用的用以求不同形状的图形面积总和的函数。形类(Re

22、ctangle ),并给出具体的求面积函数。class Shapepublic:请从Shape类派生三角形类(Triang、矩virtual float area()=0;float total(Shape *s,i nt n)float sum=0.0;for(i nt i=0;i< n;i+) sum+=si_>area(); return sum;9. .声明一个Shape类(形状)基类,它有两个派生类:Circle (圆)和Square (正方形),要求如下。(1)根据给出的圆心坐标计算圆的面积。根据给出的正方形中心坐标和一个顶点坐标计算该正方形的面积。提示:Shape类的

23、数据成员包括中心的坐标, Circle类和Square类由Shape类派生, Circle类新增一个数据成员,即圆的半径,Square类新增两个数据成员, 即顶点坐标。明该对话框对象已不存在了。二、填空题1引用2. 构造函数析构函数3. A() , B()4. this, A *5静态数据成员静态成员函数6. friend7. 派生类基类8. public、protected、private9. virtual10. 基类派生类自身11. 成员函数12. 运行时13. 静态联编,动态联编14. public vehicle public vehicle15. 基类A中的成员函数.派生类B中的成

24、员函数.16. C类B类17. 抽象函数18. 优先级2.1219. A operator +(i nt) friend A operator +(A &,i nt)20. Time Time:operator +(i nt)21. .输入消息、控制消息、系统消息、用户消息22. WM_LBOTTONDOWNOnLButtonDown23. CDC24. 设备环境25. 模态对话框非模态对话框26. 构造函数Onln让Dialog。函数27. CColorDialog、CFileDialog、CFindReplaceDialog、CFontDialog、CPrintDialog28.

25、CeditView29. OnNewDocument()30. Invalidate。或 lnvalidateRect()31. 下一行32. 3 和 3.233. 534. 代码35. 4X36. 单继承37. 不能够38. AB()39. a40. 241. 静态42. 友元43. virtual44. =045. 抽象类46. 抽象类47. AB48. 1 5 14 30 55 91 140 20449. 输入2个整数相加的结果,结果正确返回1,否则返回050. 将字符串中的小写字母转换为大写51. 非多态调用52. 第一操作数53. operatro double。54. operat

26、or +=(x,y)55. (istream & ,CSAI &)56. 不能57. 多态58. return mid low=mid+159. new charstrle n(aa)+1 A()delete a;三、编程题1.#in elude <iostream.h>#in elude <stri ng.h>class Employee( protected:char n ame20;char address100;char city20;char provi nce20;char zipcode10;public:Employee(char *nm

27、 ,char *addr5char *city, char *prov, char *zip); void Chan geName(char * n ewName);char * Display(char * buffer););Employee:Employee(char *nm, char *adr, char *cit, char *prov, char *zip) strcpy( name ,nm);strcpy(address5adr);strcpy(city,cit);strcpy(prov in ce,prov);strcpy(zipcode,zip);void Employee

28、:Cha ngeName(char * n ewName) (strcpy (n ame, n ewName);)char * Employee:Display(char *buffer)(strcpy(buffer, n ame);strcat(buffer, address); return buffer;)2.#in elude <iostream.h>#in elude <math.h>class Point(private:float x, y; public:Poin t(float xx, float yy)x=xx; y=yy;float GetX()

29、return x;float GetY() return y;friend float distance(Point&, Point&););float dista nce(Poi nt& a, Poi nt& b)(float dx = a.x - b.x;float dy = a.y - b.y;coutvv”用友元函数distance。.显示两点的坐标:ncout«a.x«H, H«a.y«H n«b.x«H, n«b.y«e ndl; retur n sqrt(dx*dx+d

30、y*dy);)void mai n()(float d;Point p1(10.5, 20.5), p2(2.5, 6.5);d=dista nce(p1, p2);cout«"两点的距离:d = "«d«e ndl;ci n.get();)3.#in clude<iostream.h>class Recta nglepublic:Recta ngle();Recta ngle(i nt width,i nt len gth);-Recta ngle()int GetWidth()co nstreturn m_width;int G

31、etLength()return mength;private:int m_width;int mje ngth;);Recta ngle:Recta ngle()(m_width=5;m_len gth=10;)Recta ngle:Recta ngle(i nt width,i nt Ie ngth)(m_width=width;m_len gth=le ngth;)int mai n()(Recta ngle recti;cout«"rect1 width : "«rect1 .GetWidth()«endl;cout«nrec

32、t1 length : n«rect1 .GetLength()«endl; int a5b;cout«"Enter a widthcin> >a;cout«HnEnter a length :";cin> >b;Recta ngle rect2(a,b);cout«"nrect2 width : H«rect2.GetWidth()«endl; cout«"rect2 length : ,«rect2.GetLength()«en

33、dl; return 0;)4.#in clude<iostream.h>class Cdate(int year,m on th,day;int y1,m1,d1;public:void setdate(i nt y,i nt m,i nt d)year=y ;mon th=m;day=d;void show()coutvv”当前日期:"«day«',-"«month«',-,'«year«endl;coutvv”两天后日期:u«d1«,-H«y1

34、 «endl;void datetwo() 加一天后的年月日d1 =day;y1 =year;m1 = mon th;for(i nt i=0;i<2;i+)d1+;switch(dl)case 29:if(!(mo nth=2 &&( year%4OO=O|year%4=O&&year%1 OO!=O) ml = 3;d1=1 ;break;case 30:if(mo nth=2 &&( year%4OO=O|year%4=O&& year%1OO!=O) m1 = 3;d1=1;break;case 31 :i

35、f( mon th=4|m on th=6|m on th=9|m on th=11) m1=m1+1 ;d1 =1 ;break;case 32 m1= m1+1 ;d 1= 1 ;if(mo nth=12)y1 = y1 +1 ;m1=1 ;break;);void mai n()(Cdate d;int y,m,d1;coutvv”请输入年月日:“;cin»y> >m»d1;d.setdate(y,m,d1); 加一天d.setdate(y,m,d1); 再加一天d.datetwo();d.show();)5 .程序如下:int f(int a,int n

36、)if(n=1)return a0*a0;else return an-1*a n-1+f(a, n-1);)6 .程序如下:int AA:Sum()int sum=0;for(i nt i=0;i <n ;i+) sum+=ai;return sum ;)7 .#in clude<iostream.h>#in clude<stri ng.h>#i nclude<ioma nip.h>定义一个基类姓名性别年龄class baseprotected:char name20;char sex3;int age;class teache匚public bas

37、e基类派生出教师类工号职称"工资基类派生出学生类学号班级专业入学成绩int sno;char zc20;double wages;class stude nt :public base int sno;char bj1O;char zy10;double score;): & class Shape public:virtual float area()=0;): float total(Shape *s,i nt n) (float sum=0.0;for(i nt i=0;i <n ;i+) sum+=si_>area(); return sum;)class

38、 Trian gle:public Shape( public:Tria ngle(double h,double w)H=h;W=w; double area() con streturn H*W*0.5; private:double H,W;): class Recta ngle:public Shape( public:Recta ngle(double h,double w)H=h;W=w; double area()co nstreturn H*W; private:double H,W;): 9.#include<iostream.h> class Shapepubl

39、ic:virtual double GetArea()=0;class Circlepublic Shape(double radius;public:Circle(double r):radius(r)double GetArea()return 3.1416*radius*radius;class Squarepublic Recta ngle(public:Square(double I):Recta ngle(l,l);int mai n()(Recta ngle r(3.5,4.0);Circle c(2.0);Square s(5.0);cout«r.GetArea()&

40、#171;e ndl;cout«c.GetArea()«e ndl; cout«s.GetArea()«e ndl; return 0;一、选择题1类的实例化是指(C)°A、定义类 B、指明具体类C、创建类的对象 D、调用类的成员2、 关于类和对象的说法不正确的是A、对象是类的一个实例C、一个对象只属于一个具体酸)B )。B、一个类只能有一个对象D、类与对象的关系和数据类型与变量的关系相似A、内置雨敷凌垂脚蒯是将该函数的目标代码插入每个调用该函数的地方B、内置函数在编译时是将该函数的目标代码插入每个调用该函数的地方C、类的内置函数必须在类体内定

41、义D、类的内置函数必须在类体外通过加关键字inline定义4、对于任意一个类,析构函数的个数最多为(A ) °A、1B、2C、和构造函数个数一样D、任意多个5、在下面的类定义中,错误的语句是(D )0class samplepublic :sample (int val) ; (1) sample(); / ( 2)private:int a=2.5 ; / (3)sample ( ) ; / (4);A、(2) ( 3) (4)B、(1) (2) ( 3) C > (2) D、(3)6、有关构造函数的说法不正确的是(A、构造函数名字和类的名字一样 何函数类型D、构造函数有且只

42、有一个D )。构造函数在定义类变量时自动执行C、构造函数无任7、 不属于成员函数的是(B )A、静态成员函数B、友无函数C、构造函数D、析构函数8、已知类A是类B的友元,类B是类C的友元,则(A、类A一定是类C的友元C、类C的成员函数可以访问类 B的对象的任何成员D)。B、C一定是类A的友元D、A的成员函数可以访问类B的对象的任何成员9、在建立类对象时(A )°A、只为每个对象分配用于保存数据成员的内存于保存函数员的内存只为每个对象分配用C、为所有对象的数据成员和函数成员分配一个共享的内存员和函数成员同时分配不同的内存为每个对象的数据成10、下列说法错误的是(B)°A、封装是将一组数据和这组数据有关的操作组装在一起要确定接口封装使对象间不需C、封装要求对象应具有明确的功能以像一个部件一样用在各种程序中11、要禁止修改指针P本身,也要禁止修改 P所指向的数据,这样的指针座窸加(r 封装使得一个对象可A、const char *p= "abed" ; B、char const *p= "abed" ; C、char *const p= "abed ;const char *const p= "abed”;12、下面有关

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论