一、组 合二、继承和派生三、派生类的声明和对象定义_第1页
一、组 合二、继承和派生三、派生类的声明和对象定义_第2页
一、组 合二、继承和派生三、派生类的声明和对象定义_第3页
一、组 合二、继承和派生三、派生类的声明和对象定义_第4页
一、组 合二、继承和派生三、派生类的声明和对象定义_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

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

文档简介

1、C/C+程序设计程序设计1C/C+程序设计程序设计2一、组一、组 合合1. 组合的概念组合的概念 C+中组合是指结构和类的声明嵌入结构变量或对象作中组合是指结构和类的声明嵌入结构变量或对象作为其成员的现象。嵌入的对象成员亦称为成员对象,包容这为其成员的现象。嵌入的对象成员亦称为成员对象,包容这个成员对象的类可称为组合类或包容类。个成员对象的类可称为组合类或包容类。 当构造一个组合类的对象时,系统首先为每一个数据成当构造一个组合类的对象时,系统首先为每一个数据成员分配内存空间,仅当其中的成员对象获得完备的内存时才员分配内存空间,仅当其中的成员对象获得完备的内存时才导致组合类实例的诞生。导致组合类

2、实例的诞生。 编译器先调用嵌入对象的构造函数,然后调用组合类的编译器先调用嵌入对象的构造函数,然后调用组合类的构造函数。构造函数。 C/C+程序设计程序设计3 嵌入对象所隶属的类或嵌入类对应既定的事物,组合类嵌入对象所隶属的类或嵌入类对应既定的事物,组合类对应某种新生的事物。对应某种新生的事物。 C+中一个重要的思想是先构造既定的对象,然后构造中一个重要的思想是先构造既定的对象,然后构造新生的对象。新生的对象。 这也适应继承的情况,先构造基类再构造派生类。但析这也适应继承的情况,先构造基类再构造派生类。但析构的次序与构造相反,先诞生的对象后撤离内存空间。构的次序与构造相反,先诞生的对象后撤离内

3、存空间。 对象的构造和析构遵循堆栈空间先进后出的原理。对象的构造和析构遵循堆栈空间先进后出的原理。 C/C+程序设计程序设计42. 引用型成员和引用型成员和const成员成员 类中允许存在引用型数据成员和类中允许存在引用型数据成员和const数据成员。引用数据成员。引用应依附于另一个独立的变量,等待及时的初始化。应依附于另一个独立的变量,等待及时的初始化。Const数数据成员是仅仅初始化一次其值便不再改变的数据成员。据成员是仅仅初始化一次其值便不再改变的数据成员。 对于存在对于存在const型的不变成员或引用型成员,系统提供型的不变成员或引用型成员,系统提供的缺省的赋值运算符函数不起作用。引用

4、型成员和不变成员的缺省的赋值运算符函数不起作用。引用型成员和不变成员只能借助冒号语法初始化。只能借助冒号语法初始化。C/C+程序设计程序设计5 当基于内存数据共享而设置引用型成员的时候,应注意当基于内存数据共享而设置引用型成员的时候,应注意引用型成员应关联到一个具有独立的生存期长或等长的同类引用型成员应关联到一个具有独立的生存期长或等长的同类型变量。型变量。 具有具有const成员的对象预埋一个不变的成员,这样的类成员的对象预埋一个不变的成员,这样的类是一个奇怪的类,因此编编程时应仔细加以处理。是一个奇怪的类,因此编编程时应仔细加以处理。 下面的例子为简单见嵌入一个内置下面的例子为简单见嵌入一

5、个内置int类型的引用型成类型的引用型成员和不变成员,通过该例说明构造函数初始化列表的语法格员和不变成员,通过该例说明构造函数初始化列表的语法格式。式。 C/C+程序设计程序设计6例例 CType内含内含int类型的引用型成员和类型的引用型成员和const成员成员#include static int numc=0;class CType public: CType (int x=1,int y=2); CType:CType (); private: int n; const int c; public: int& r; CType:CType() printf (%d.n=%d,r

6、=%d CType:CType();, numc-,n,r); C/C+程序设计程序设计7CType:CType (int x,int y) :r(y), c(x) n=x; printf (%d. n=%d,r=%d CType (int,int);, +numc,n,r); CType g; void main() printf (Enter into main()n);CType x (3,4); printf (x.r=%dn,x.r); printf (Go outof main() n);C/C+程序设计程序设计8 /程序运行输出结果:程序运行输出结果: 1. n=1,r=2 CT

7、ype(int,int);Enter into main() 2. n=3,r=4 CType(int,int);x.r=4 2. n=3,r=4199100 CType:CType();Go outof main() 1. n=1,r=-858993460 CType:CType(); 此题输出一个不可靠的结果。原因在于:此题输出一个不可靠的结果。原因在于: y是一个函数入口堆栈空间的局部变量,是一个函数入口堆栈空间的局部变量,r是一个生存期是一个生存期由对象控制的引用型成员。由对象控制的引用型成员。 将引用型成员关联到生存期短的局部变量是危险的。将引用型成员关联到生存期短的局部变量是危险的

8、。C/C+程序设计程序设计93. 嵌入对象的初始化嵌入对象的初始化 嵌入对象所属类最好存在显式或隐含的可访问的缺省构嵌入对象所属类最好存在显式或隐含的可访问的缺省构造函数,从而可被编译器自动隐含调用。下面的规则描述嵌造函数,从而可被编译器自动隐含调用。下面的规则描述嵌入对象显式的初始化:入对象显式的初始化: a.组合类的构造函数显式调用嵌入对象自身的带参构组合类的构造函数显式调用嵌入对象自身的带参构造函数,这一调用是通过冒号初始化语法进行的。造函数,这一调用是通过冒号初始化语法进行的。 b. 嵌入对象按照其在组合类中的声明次序调用自身的嵌入对象按照其在组合类中的声明次序调用自身的构造函数,而不

9、是冒号语法列表中出现的次序。构造函数,而不是冒号语法列表中出现的次序。 c. 嵌入对象的构造函数对于组合类是可访问的,可访嵌入对象的构造函数对于组合类是可访问的,可访问的含义是或者嵌入对象的构造函数是公共的,或者组合类问的含义是或者嵌入对象的构造函数是公共的,或者组合类声明为嵌入类的友员类等。声明为嵌入类的友员类等。C/C+程序设计程序设计10例例 嵌入类和组合类的对象生灭嵌入类和组合类的对象生灭 #include static int num=0; class CEmbed public: int n; CEmbed (int ,int ); private: int& m_r; ;

10、 CEmbed:CEmbed (int x, int y) :m_r (n) n =x; printf (%d.n=%d, CEmbed (int,int) ;,+num, n); C/C+程序设计程序设计11 class CContain public:CEmbed a; CContain (int x=1,int y=2); private: const CEmbed b; ; CContain:CContain(int x,int y):b(y,y),a(x,x) printf (%d.a=%d, b=%d, CContain (int,int); n,+num, a.n,b.n); v

11、oid main() CContain z (3,4); /输出输出: 1. n=3, CEmbed(int,int); 2. n=4, CEmbed(int,int); 3.a=3,b=4, CContain(int,int);C/C+程序设计程序设计124. 冒号初始化语法冒号初始化语法 冒号初始化是对象定义时调用构造函数进行初始化的一冒号初始化是对象定义时调用构造函数进行初始化的一种方式种方式 。构造函数冒号初始化语法的一般格式为:。构造函数冒号初始化语法的一般格式为: 类名类名:类名类名(形参列表形参列表):引用型成员引用型成员(左值左值), 嵌入对象嵌入对象(实参列表实参列表),co

12、nst型成员型成员(右值右值),. 其它成员初始化其它成员初始化; 例如:例如: CEmbed (int x, int y): m_r (n) . CContain (int x,int y):a (x,x),b (y,y) .C/C+程序设计程序设计13 该语法的格式是在类的构造函数表题头后紧跟冒号该语法的格式是在类的构造函数表题头后紧跟冒号“:”,冒号之后是成员对象的构造函数初始化调用列表,各,冒号之后是成员对象的构造函数初始化调用列表,各列表分项之间以逗号分隔,但不构成先后求值的语义。列表分项之间以逗号分隔,但不构成先后求值的语义。 每一个嵌入成员对象采用函数对象名语法显式调用自身每一个

13、嵌入成员对象采用函数对象名语法显式调用自身的构造函数,对于简单变量也采用构造函数的形式,不采用的构造函数,对于简单变量也采用构造函数的形式,不采用等号形式的初始化。等号形式的初始化。 冒号之后的列表全部省略时对应编译器隐含调用成员对冒号之后的列表全部省略时对应编译器隐含调用成员对象可访问的缺省构造函数,这是编译器的默认设置。象可访问的缺省构造函数,这是编译器的默认设置。 构造函数中形参作用域始于冒号处止于最后一个右花括构造函数中形参作用域始于冒号处止于最后一个右花括号。号。 因此可以采用形参或其它的全局名称初始化嵌入对象、因此可以采用形参或其它的全局名称初始化嵌入对象、引用型成员或引用型成员或

14、const型数据成员。型数据成员。C/C+程序设计程序设计14 冒号初始化语法原本是为成员对象,引用型成员或冒号初始化语法原本是为成员对象,引用型成员或const数据成员设置的,但对于其它的成员变量也可以从构数据成员设置的,但对于其它的成员变量也可以从构造函数体迁移至冒号后,造函数体迁移至冒号后,如将:如将: CEmbed:CEmbed (int x, int y) : m_r(n) n=x; 变为:变为: CEmbed:CEmbed (int x, int y) : m_r(m) , n(x) 变量成员模拟构造函数变量成员模拟构造函数n(x)形式进行初始赋值。形式进行初始赋值。 m_r(n)

15、建立引用名和变量名的关联,建立引用名和变量名的关联,m_r是相对独立是相对独立的成员变量的成员变量n的别名。的别名。C/C+程序设计程序设计15二、继承和派生二、继承和派生1. 继承的概念继承的概念 继承是将已有的数据结构和算法加以接纳融为自身的一继承是将已有的数据结构和算法加以接纳融为自身的一部分,派生是将新的成果连结于原来的知识体系中。继承和部分,派生是将新的成果连结于原来的知识体系中。继承和派生是承上启下的一个联系过程,原来的数据结构和算法对派生是承上启下的一个联系过程,原来的数据结构和算法对应基类,连结于基类的新的数据结构和算法构成派生类,由应基类,连结于基类的新的数据结构和算法构成派

16、生类,由此形成继承树层次体系。此形成继承树层次体系。 继承是面向对象理论程序设计中一种重要的机制,继承继承是面向对象理论程序设计中一种重要的机制,继承面向事物动态的发展,也是人认识自然的一个写照。人首先面向事物动态的发展,也是人认识自然的一个写照。人首先直面的是简单的自然现象,把这些简单现象以文字记录下来直面的是简单的自然现象,把这些简单现象以文字记录下来就形成基本规律的总结。就形成基本规律的总结。C/C+程序设计程序设计16 对于程序员而言是建立一个基本的类。随着对自然现象对于程序员而言是建立一个基本的类。随着对自然现象的深入研究和广泛的积累,各种学科流派相应的应运而生。的深入研究和广泛的积

17、累,各种学科流派相应的应运而生。对于跟踪模拟这些流派动态发展的程序员而言,相应建立各对于跟踪模拟这些流派动态发展的程序员而言,相应建立各种各样的派生类,而无须另起炉灶。种各样的派生类,而无须另起炉灶。 知识的每一积累,对应类的一个扩展。古老的经验沉积知识的每一积累,对应类的一个扩展。古老的经验沉积在基类的数据结构和算法中,时髦的思潮注册在最近派生的在基类的数据结构和算法中,时髦的思潮注册在最近派生的类中。编译器优先利用最近成果的思想,优先使用派生类中类中。编译器优先利用最近成果的思想,优先使用派生类中的资源信息。这是面向对象理论为程序员提供的一种总体策的资源信息。这是面向对象理论为程序员提供的

18、一种总体策划和具体实施纲领。划和具体实施纲领。 这其中的优点是程序的开发和课题的突破可以同步协调这其中的优点是程序的开发和课题的突破可以同步协调的前进,而不必从零出发。的前进,而不必从零出发。C/C+程序设计程序设计17 基于历史的原因和书写的习惯,继承树层次体系将基类基于历史的原因和书写的习惯,继承树层次体系将基类画在上面,派生类则画在基类的下面。画在上面,派生类则画在基类的下面。 基类也有称为父类的,派生类亦有称为子类的。基类也有称为父类的,派生类亦有称为子类的。 父类和子类的称谓容易构成误解。因此本书不用或废弃父类和子类的称谓容易构成误解。因此本书不用或废弃模糊的父类和子类的称谓。模糊的

19、父类和子类的称谓。 C+语言允许继承和派生出现多对一、一对多的关系。语言允许继承和派生出现多对一、一对多的关系。 一个基类可以拥有多个派生类,这样的基类在程序设计一个基类可以拥有多个派生类,这样的基类在程序设计中的地位举足轻重,一个派生类可以同时拥有多个基类。如中的地位举足轻重,一个派生类可以同时拥有多个基类。如果一个派生类上逆时只有一个基类,称为单继承层次体系。果一个派生类上逆时只有一个基类,称为单继承层次体系。 如果一个派生类上逆时存在两个以上的基类,称为多继如果一个派生类上逆时存在两个以上的基类,称为多继承层次体系。承层次体系。 MFC类库是单继承体系。类库是单继承体系。iostream

20、类是多继类是多继承体系。承体系。C/C+程序设计程序设计18 CObjectCCmdTarget CWinAppCUserDocCDocumentCWinThread CWndCUserApp CViewCFrameWnd CDialogCUserViewCUserDialogCMainFrame 图图 MFC关键类的层次体系关键类的层次体系C/C+程序设计程序设计192. 间接基类和间接派生类间接基类和间接派生类 直接基类就是直接出现于类声明的基类表中的类。一个直接基类就是直接出现于类声明的基类表中的类。一个类都可以候选为基类,也可以作为派生类连结到另外一个既类都可以候选为基类,也可以作为派

21、生类连结到另外一个既定的类上,一个类既是另外一个类的基类本身又是上层类的定的类上,一个类既是另外一个类的基类本身又是上层类的派生类,由此形成复杂的类层次体系。派生类,由此形成复杂的类层次体系。 如如CWnd上有直接基类上有直接基类CCmdTarget,间接基类,间接基类CObject,下有直接派生类,下有直接派生类 CView,更等待用户间接派生的,更等待用户间接派生的类类CUserView。 C+ 语言不允许上面的语言不允许上面的(间接间接)基类成为基类成为(间接间接)派生类的派生类的派生类,也就是禁止数据结构中环的出现。这样继承和派生派生类,也就是禁止数据结构中环的出现。这样继承和派生就是

22、一个有向无环图。就是一个有向无环图。 C/C+程序设计程序设计20三、派生类的声明和对象定义三、派生类的声明和对象定义 对于一个特定的演化断面,设若干基类已经适当的构对于一个特定的演化断面,设若干基类已经适当的构建,则新类追加于这些基类的声明格式分为两种形式:建,则新类追加于这些基类的声明格式分为两种形式: 一种是单继承,一种是多继承一种是单继承,一种是多继承 这里给出单继承方式的声明格式:这里给出单继承方式的声明格式: class CDerived:继承方式:继承方式 CBase CDerived 类的成员声明语句类的成员声明语句; ; class 派生类名:继承方式派生类名:继承方式 直接

23、基类名直接基类名 派生类的成员声明语句派生类的成员声明语句; ;C/C+程序设计程序设计21 其中派生类名其中派生类名CDerived是用户新引入的类名,是用户新引入的类名,CBase是已经建立的类名,作为派生类的直接基类名,冒号表现一是已经建立的类名,作为派生类的直接基类名,冒号表现一种承前启后的方式。种承前启后的方式。 通过这种方式用户定义的类可插入到已经存在的类族体通过这种方式用户定义的类可插入到已经存在的类族体系。派生类的成员包括继承的成员和新增加的成员,成员的系。派生类的成员包括继承的成员和新增加的成员,成员的访问属性只有三种,优先由类声明内的访问属性只有三种,优先由类声明内的 pr

24、ivate,public,protected明显确定,继承的成员可由继承方式隐含确定。明显确定,继承的成员可由继承方式隐含确定。 继承方式由关键字继承方式由关键字private,public,protected给出。给出。C/C+程序设计程序设计22单继承略微具体的格式为:单继承略微具体的格式为:class CBase public: float m_t1; void f3(); protected:int m_t2; ;class CDerived: public /* protected , private */ CBase /类声明内的类声明内的private,public,protected屏蔽继承方式屏蔽继承方式 /对访问控制的影响对访问控制的影响 public: 公共成员声明语句公共成员声明语句; CBase: m_t2; 基类名基类名:基类非私有的成员名基类非私有的成员名2; protected: 保护成员声明语句保护成员声明语句; C/C+程序设计程序设计23 CBase: m_t1; 基类名基类名:基类非私有的成员名基类非私有的成员名1;private: 私有成员声明语句私有成员声明语句;CB

温馨提示

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

评论

0/150

提交评论