ImageVerifierCode 换一换
格式:DOCX , 页数:26 ,大小:52.08KB ,
资源ID:9736636      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/9736636.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(C++复习资料修改.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

C++复习资料修改.docx

1、C+复习资料修改一、 问答题 (每小题 分,共 分)1 C+的类库主要有哪2种?答:主要有Borland的OWL(Object Windows Library)和Microsoft 的MFC。2 简单叙述类的确定与划分的基本方法答:将目标任务中具有共性的成分确定为一个类;可以按照以下步骤进行分析:第一,要判断该事物是否有一个以上的实例;第二,要判断类的实例中有没有绝对的不同点,如果没有,则它同样可能被确定为一个类。3 什么是抽象类?抽象类能否用来创建对象?抽象类的作用是什么? 答: 含有纯虚函数的类是抽象类。抽象类不能声明对象实例。只能声明指针或作为基类派生子类。4 什么是虚函数?什么是纯虚函

2、数?什么是多态类? 虚函数是保留字virtual定义的成员函数,基类的虚函数在派生类仍是虚函数。纯虚函数是在类中声明但没有定义的虚函数,其形式为:virtual返回类型 函数名(参数表) = 0; 含有虚函数的类是多态类,5 试论述类的静态数据成员与类的一般数据成员的不同点。如何初始化类的静态数据成员?如何初始化类的常数据成员?答:类的静态数据成员在生成对象以前已经存在,类的一般数据成员只有在利用类生成对象时才生成。类的静态数据成员一般在定义类的界面之外(后)采用赋值法初始化类的常数据成员在构造函数的圆括号()之后采用初始化列表法初始化6 类的非静态数据成员与静态成员、成员函数在存储分配上有什

3、么不同?类的非静态数据成员各个对象的存储各自分配,而所有同类对象的静态成员、成员函数代码共用,在存储分配上是一个存储。静态成员在生成对象之前已经存在。7 什么是静态类型与动态类型?答:声明指针或引用时所指定的基类型称为该指针或引用的静态类型。程序运行时指针或引用实际指向或引用的对象所属的类型称为该指针或引用的动态类型。静态类型用于编译程序检查类型的合法性,动态类型是静态类型的子类型,被运行系统用于动态绑定。8 什么是静态绑定? 什么是动态绑定? 如何实现运行时的多态?将函数调用与其相应的函数体实现代码相关联的过程称为绑定。静态绑定又称为早期绑定,意味着调用哪个版本的函数在程序编译时已确定。静态

4、绑定具有执行效率高、占用内存少等优点,但缺乏灵活性。动态绑定又称为晚期绑定,意味着调用哪个版本的函数在程序运行时才确定。C+语言的动态绑定通过继承与虚函数实现,具体可以声明一个含有纯虚函数的抽象基类或含有虚函数的基类和由此(抽象)基类公有派生的几个子类,纯虚函数在不同子类中有不同的具体实现(一般都被定义为公有函数)。一般是先声明一个祖先类指针、然后将祖先类或其派生类对象的地址赋值给这个祖先类指针,再通过指针来调用虚函数实现动态绑定:即指针指向哪个对象就执行该对象所属类型的虚函数;当然也可以定义函数的参数为祖先类的引用、当调用函数时通过将祖先类对象或其派生类对象作为实际参数传递给函数的引用参数来

5、实现成员函数调用的动态绑定;动态绑定具有允许程序有更大灵活性,提高程序可重用性、可扩充性等优点,但降低了程序执行效率和程序的可理解性。 .9 在什么时候执行构造函数?什么时候执行析构函数?答:类在生成对象的时候执行构造函数;当对象生命期结束的时候执行析构函数。10 请叙述构造子类对象时构造函数的执行顺序 答: 在生成子类对象时构造函数的执行顺序是:先父后子,先虚后实,先左后右,多路虚只长一次;父类的构造函数执行完毕后,内嵌对象的构造函数按照声明顺序执行,最后执行子类的构造函数。11 实现动态联编方式的三个前提是什么? 答: 第一,声明一个含有纯虚函数的抽象基类或含有虚函数的基类和由此(抽象)基

6、类公有派生的几个子类,纯虚函数在不同子类中有不同的具体实现(一般都被定义为公有函数);第二,类之间应当满足赋值兼容性规则;第三,通过成员函数调用或通过指针引用来调用虚函数。12 程序员在什么情况下必须设计构造函数?在什么情况下必须设计析构函数?答:当类含有指针成员(一般构造函数中有动态内存分配语句new,或当数据成员较多、含有数组成员)时必须设计构造函数和析构函数(析构函数中含有delete语句去释放new分配的内存)。13 序员在什么情况下必须设计(复制)COPY构造函数?当对象需要占用堆资源时(具体就是对象含有指针成员时),需要在类中显式定义复制构造函数,对资源进行深复制。14 友元函数是

7、类的成员函数吗?友元函数能否直接访问声明该函数为友元的类的私有成员?答: 友元函数不是类的成员函数;友元函数可以通过对象直接访问声明该函数为友元的类的私有成员。15 面向对象的三大特性是什么?答: 三大特性是: 封装性, 继承性, 多态性.16 请说明概括(泛化)和特化的含义:概括(泛化):从某些具有共性的对象或类中提取抽象出高一层的类;在分类的基础上进行。特化:继承高层次的类,并添加一些属性和方法,在构造子类时使用。17 请说明是么是深拷贝?什么是浅拷贝?如何实现深拷贝?当对象占有资源时(对象之外的内存),在用一个已知的对象去初始化另一个对象时,只是复制对象本身,而两个对象共用对象之外的资源

8、,这种情况叫浅拷贝;如果对对象之外的资源也进行拷贝(即两个对象分别占有不同的资源)就叫深拷贝。实现深拷贝需要定义拷贝构造函数,并在拷贝构造函数中使用NEW运算分配资源等。18 类摸版与抽象类的相同点与主要区别是什么?答: 类属类分为:类摸版与抽象类。它们的相同点是都不能拿来直接生成对象,主要区别是类摸版是用来对类属参数用类型参数实例化后生成具体的类,然后可以生成对象;而抽象类主要是用来继承的,用于实现动态绑定。包容数据结构用类摸版(参数化类)机制实现,类摸版实现的类属类是无约束类属类。C+语言的受约束类必须采用抽象类、继承与动态绑定实现,如多态数据结构就是受约束类属类。19 什么是包容数据结构

9、?如果一个数据结构(如:堆栈,链表等)中可以存放多种(无关的)类型的对象,这个数据结构被称为包容数据结构。包容数据结构可以存放完全无关的类的对象。包容数据结构用类摸版(参数化类)机制实现。20 什么是无约束类属类?类摸版的实际参数类型不要求有共同祖先,类模版中的操作与类属参数之间基本上没有关联。类摸版实现的类属类是无约束类属类。C+的模版机制无法支持受约束类。21 什么是多态数据结构(受约束类属类,异质数据结构)?如果一个数据结构(如:堆栈,链表等)中可以存放多种类型的对象,但这些类型必须是从共同的基类派生出来的类。多态数据结构用虚函数、抽象类与继承机制实现。22 类摸版的界面和它的类属成员函

10、数一定要放在一个文件吗?是,必须放在一个文件,因为编译程序并不为类属类的定义生成任何代码,仅当类属类实例化时才产生真正代码。未实例化的类属类(类模版)定义没有加入目标文件(.OBJ)中,当建立的可重用类库(.LIB)中包含类属类时会出现程序连接错误。23 假如已经定义了一个堆栈类摸版:templateclass STACKpublic:private:struct NODEELEMENT_TYPE element;NODE *link;NODE *top;在主程序中有下列语句, STACK int_stack;当执行该语句时生成对象int_stack要分为几个步骤?答:首先实例化摸版STACK

11、 生成一个具体的类,类名为STACK ,然后利用该类创建一个整数类型堆栈的对象实例int_stack。24 下面程序的运行结果。 #include template T Max(T x ,T y ) return (xy)?x : y ;void main ( ) int x1 , y1 ; float x2 , y2 ; double x3 , y3 ; cout ”请输入2个整形数据 , 用空格分隔: ”x1y1; cout”The max of x1 , y1 is :”max(x1 , y1)endl ; cout ”请输入2个实型数据 , 用空格分隔: ”x2y2 ; cout”Th

12、e max of x2 , y2 is :”max(x2 , y2)endl ; cout ”请输入2个双精度型数据 , 用空格分隔: ”x3y 3; cout”The max of x3 , y3 is :”max(x3 , y3)endl ; 25 全局对象,全局静态对象,局部静态对象的构造函数分别在在什么时候被调用?答:全局对象,全局静态对象的构造函数在main()函数执行之前被调用;局部静态对象的构造函数在程序第一次执行到相应的生命语句时才被调用。静态对象只被初始化一次。26 使用常成员函数时要注意几点?答:注意以下几点:(1)const是函数类型的一个组成部分,因此在函数的实现部分也

13、要使用关键字const。(2)常成员函数不能修改对象的数据成员,也不能调用该类中没有用关键字const修饰的成员函数。(3)关键字const参与区分函数重载。(4)通过常对象只能调用它的常成员函数,而不能调用其他成员函数。二、请指出下列程序中的错误语句,并在语句旁边写出错误原因。( 分)1#includevoid main()int f=6;int *a=&f;const int *p=a;*p=11; /p为指向常量的指针,试图用*p去修改p所指向空间的值不行。f=7; *a=8; /以上两句对,这里只是固定*p,并不固定p、f和*acout*p=*pendlendl;int d=7;/p可

14、以指向别处,如下:p=&d;cout*p=*pendlendl;/并不固定f和*aint e=13;int * const pp=&e;/const靠近pp,只是指针pp被固定,*pp所指空间的内容可以被修改。pp=&f; /pp不能被修改,试图修改pp为错句,即指针pp只能指向变量e(固定的空间地址)cout*p=*pendl;couta=aendl;2#includevoid main() char x5=abcdefghij; /错误,数组赋值下标越界。array bounds overflow char *xx=&(abcdefghij); coutxendl; x=baiyun;/错

15、误,数组名是常量;left operand must be l-value coutxendl;三 根据以下代码画出一个类的继承关系图( 分);#include#includeclass Aprivate:int A_private;protected:int A_protected;public:A(int rr1=0,int rr2=0)coutthis is class As construe.endl; A_private=rr1;A_protected=rr2;void get_rot()coutA_private A_protectedendl;class B: public A

16、private: int B_private; protected: int B_protected; public:B(int p1=0,int p2=0,int p3=0,int p4=0):A(p1,p2)coutthis is class Bs construe.endl;B_private=p3;B_protected=p4; ;class C: virtual public B/类B为虚基类 private: int C_private; protected:int C_protected; public: C(int p1=0,int p2=0,int p3=0,int p4=0

17、,int p5=0, int p6=0):B(p1,p2,p3,p4) C_private=p5; C_protected=p6; coutthis is class Cs construe.endl; ; int getC_private() return C_private;int getC_protected() return C_protected;class D: virtual public B/B类为虚基类 protected: int D_protected; public: D (int p1=0,int p2=0,int p3=0,int p4=0,int p5=0):B(

18、p1,p2,p3,p4)D_protected=p5; coutthis is class Ds construe.endl; int getD_protected() return D_protected;class E: public C, public D private: int E_pivate; public: E(int p1=0,int p2=0,int p3=0,int p4=0,int p5=0,int p6=0,int p7=0,int p8=0):C(p1,p2,p3,p4,p5,p6) ,D(p1,p2,p3,p4,p7) E_pivate=p8;coutthis i

19、s class Es construe.endl; ; ;三、请画图并用文字说明画线部分语句执行的过程。( 分)#includeclass coord int x,y; public: coord()x=0;y=0; coord(int i,int j)x=i;y=j; coord(const coord &obj)x=obj.x;y=obj.y;cout”Copy Constucting was called./n”; void get_xy(int &i,int&j)i=x;j=y; coord operator+(coord ob2); ; coord coord:operator+(c

20、oord ob2) coord temp; temp.x=x+ob2.X; / x+ob2.X的x为左操作数的属性域,通过 this 指针找/到对象的属性域。 temp.y=y+ob2.y; /道理同上一行。 return temp; / 产生一个无名临时对象作为函数的返回值后,遇到 /析构对象temp,退出+函数。main() coord o1(10,10),o2(15,23),o3; int x,y; o3=o1十o2;/调用operator+()进行两对象相加 ,返回无名临时对象,仍是coord对象;因而可以赋值给o3, 但要调用拷贝构造函数,构造o3后,然后释放临时无名对象。 /同理,

21、语句o3=ol+o2+o3;也是合法的 o3.get_xy(x,y); /调用对象o3的成员函数,(x,y)为引用实参,把main()中的两个变量 int x,y的地址传给对象o3的成员函数,实现把对象的属性值通过int x,y带出。 /用(o1十o2).geL_xy(x,y);也是合法的,通过临时对象实现。 cout(o1+o2)X:x,Y:yn; return 0; 四、根据下列代码,指出子类B所含的成员及成员的访问控制属性( 分)。1、class AB所含数据成员A:a 不可访问A:b 保护B:d 私有B:e 保护private: int a;protected:int b;public

22、:A(int a1=0,int b1=0)a=a1;b=b1B所含成员函数A:getA_a() 公有A:getA_b() 公有B:B() 公有B:getB_d() 公有B:getA_e() 公有int getA_a()return a; int getA_b()return b; ;class B : public Aprivate:int d;protected: int e;public:B(int d1=0,int e1=0, int a1=0,int b1=0): A(a1, b1)d=d1;e=e1int getB_d()return d; int getA_e()return e;

23、 ; 2、class Aprivate: int a;protected: int b;public: A(int a1=0,int b1=0)a=a1;b=b1int getA_a()return a; int getA_b()return b; ;class B : private Aprivate: int d;protected: int e;public: B(int d1=0,int e1=0)d=d1;e=e1int getB_d()return d; int getA_e()return e; ;五、请分步骤写出main()中赋值语句: ob=input();执行的过程中构造函

24、数与析构函数执行的顺序,并对后边有/的语句加上语句说明。#include#include#includechar temp1=I Love You !;class samp char *s;public: samp()s=NULL;cout默认构造函数被调用。endl; samp(char ss) /含有字符串成员的类的构造函数必须这样写,因为字符串不能直接赋值。 int l=strlen(ss); s=new charl+1;/+1是为了在字符串尾增加一个结束标志0。 strcpy(s,ss); cout构造函数被调用。endl; samp()if(s) delete s; coutfree

25、ing char *s n;samp & operator=(samp &ob1) cout赋值号=被调用endl; delete s;/防止产生内存垃圾。 int l=strlen(ob1.s); s=new charl+1; strcpy(s,ob1.s); return *this; ; samp(samp &ob1)/拷贝构造函数,当用对象初始化对象时调用。 cout拷贝构造函数被调用endl;int l=strlen(ob1.s);/计算字符串大小 s=new charl+1;/分配一个字符数组,首地址付给s,+1是为了存储字符串结束标志0, strcpy(s,ob1.s);/是头文

26、件的函数,/功能是把ob1.s所指字符串拷贝到指针s所指空间。 /有关字符数组的拷贝必须用strcpy,或自己写一段循环程序完成。 ;void show() if (s=NULL)cout对象数据域为空endl;s=NULL; else cout对象的数组成元sn;/类的成员函数,把字符串首地址放到输出流,输出字符串,遇到0结束。 void set(char *str);/类 samp 的成员函数,目的是分配字串空间并从键盘读入字符串。;void samp:set(char *str)/分配字串空间并从键盘读入字符串 s=new charstrlen(str)+1;/分配字串空间,+1为存放字

27、符串结束标志0 if(!s)/如果s=0,则!s为非零即为真,也即上一句存储分配不成功。 coutAllocation error. n;/显示存储分配失败。 exit(1); / exit(1)包含在头文件内。表示返回到操作系统。 strcpy(s,str);/是头文件的函数,功能是把指针str所指字符串拷贝到指针s所指空间。 samp input()/返回samp型对象的普通函数(不是类的成员函数)。 char s80;/分配一个大小为80个字节的字符数组,s是数组名,不是类的成员。 samp temp;/默认构造函数被调用,产生一个samp类对象 temp,其作用域是局部的。 coutE

28、nter a string:;/cout为的函数,s;/cin为的函数,为流符号,此句作用是把通过键盘输入 /的字符串放入指针常量s(s是数组名,不是类的成员)所指的一片存储, /注意这里不是把一个字符串付给另一个字符串。 temp.set(s);/调用对象temp的成员函数;samp:set(char *str),实参是s /功能是把(字符串)地址常量s所指字符串拷贝到对象成员指针s所指空间。 return temp;/返回对象temp的拷贝、一个临时无名对象,而不是temp本身。 /然后释放temp. /注意:是程序块的唯一出口,对象 temp的生命期结束, /自动调用析构函数释放对象 temp所占用存储,并把存储还给系统。int main() samp ob;/调用类samp的构造函数,生成对象ob coutob.show=endl; o

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1