1、C+C+语言程序设计语言程序设计普通高等教育普通高等教育“十一五十一五”国家级规划教国家级规划教材材国家精品课教材国家精品课教材 尹云飞尹云飞博士博士 硕导硕导2第第4章章 类与对象类与对象l面向对象的思想面向对象的思想lOOP的基本特点的基本特点l类概念和声明类概念和声明l对象对象l构造函数构造函数l析构函数析构函数l内联成员函数内联成员函数l拷贝构造函数拷贝构造函数l类的组合类的组合l结构体与联合体结构体与联合体l深度探索深度探索3抽象抽象l抽象是指对具体问题(对象)进行概括,抽象是指对具体问题(对象)进行概括,抽出一类对象的公共性质并加以描述的抽出一类对象的公共性质并加以描述的过程。过程
2、。l例如,例如,p99面向对象程序设计的基本特点4封装封装l封装是将抽象的到的数据和行为(或功封装是将抽象的到的数据和行为(或功能)相结合,形成一个有机的整体,也能)相结合,形成一个有机的整体,也就是将数据与操作数据的函数代码进行就是将数据与操作数据的函数代码进行有机的结合,形成类,其中的数据和函有机的结合,形成类,其中的数据和函数都是类的成员。数都是类的成员。l例如,例如,p99面向对象程序设计的基本特点5继承继承lC+语言中提供了类的继承机制,允许语言中提供了类的继承机制,允许程序员在保持原有类特性的基础上,进程序员在保持原有类特性的基础上,进行更具体、更详细的说明。行更具体、更详细的说明
3、。面向对象程序设计的基本特点6多态多态l多态是指一段程序能够处理多种类型对多态是指一段程序能够处理多种类型对象的能力。象的能力。l在在C+语言中,这种多态性可以通过强语言中,这种多态性可以通过强制多态、重载多态、参数化多态(即模制多态、重载多态、参数化多态(即模板)、包含多态(即虚函数)来体现。板)、包含多态(即虚函数)来体现。面向对象程序设计的基本特点7类的定义类的定义l类定义格式:类定义格式:class 类名称类名称public:外部接口外部接口protected:保护型成员保护型成员private:私有成员私有成员类和对象在面向对象程序设计中,程序模块是由类构在面向对象程序设计中,程序模
4、块是由类构成的。类是对逻辑上相关的函数与数据的封成的。类是对逻辑上相关的函数与数据的封装,它是对问题的抽象描述。装,它是对问题的抽象描述。8类成员的访问控制类成员的访问控制l共有类型,共有类型,public:定义了类的外部接口:定义了类的外部接口l私有类型,私有类型,private:只能被本类的成员函:只能被本类的成员函数访问,来自外部的任何访问都是非法的数访问,来自外部的任何访问都是非法的l保护类型,保护类型,protected:和:和private相似,但相似,但可以被继承可以被继承l例如例如p103类和对象9对象对象l格式:格式:类名类名 对象名对象名;例如:例如:Clock myClo
5、ck;l对象所占据的内存空间只是用于存放对象所占据的内存空间只是用于存放数据成员,函数成员不在每一个对象数据成员,函数成员不在每一个对象中存储副本,每个函数的代码在内存中存储副本,每个函数的代码在内存中只占据一份空间中只占据一份空间类和对象10类的成员函数类的成员函数l成员函数的实现成员函数的实现返回值类型返回值类型 类名类名:函数成员名函数成员名(参数表参数表)函数体函数体l例如例如p104类和对象11类的成员函数类的成员函数l成员函数调用中的目的对象:使用成员函数调用中的目的对象:使用.操作符操作符指出调用所针对的对象,称为本次调用的目指出调用所针对的对象,称为本次调用的目的对象的对象l带
6、默认形参值的成员函数:例如带默认形参值的成员函数:例如p105l内联成员函数,例如内联成员函数,例如p105l例例4-1,p106类和对象12构造函数构造函数l构造函数的作用就是在对象被创建时利用特构造函数的作用就是在对象被创建时利用特定的值构造对象,将对象初始化为一个特定定的值构造对象,将对象初始化为一个特定的状态。的状态。l构造函数在对象被创建的时候自动被调用构造函数在对象被创建的时候自动被调用l例如例如p108构造函数和析构函数13复制构造函数复制构造函数l又称拷贝构造函数,它是一种特殊的构造函数,具又称拷贝构造函数,它是一种特殊的构造函数,具有一般构造函数的所有特性,其形参是本类的对象
7、有一般构造函数的所有特性,其形参是本类的对象的引用。的引用。l拷贝构造函数的作用是使一个已经存在的对象去初拷贝构造函数的作用是使一个已经存在的对象去初始化同类的一个新对象始化同类的一个新对象l若果程序员没有定义类的拷贝构造函数,系统就会若果程序员没有定义类的拷贝构造函数,系统就会在必要的时候自动生成一个隐含的拷贝构造函数在必要的时候自动生成一个隐含的拷贝构造函数构造函数和析构函数14复制构造函数复制构造函数l例如例如p110l拷贝构造函数在三种情况下被调用拷贝构造函数在三种情况下被调用l例例4-2,p112构造函数和析构函数:当用类的一个对象去初始化该类的另一个当用类的一个对象去初始化该类的另
8、一个对象时对象时如果函数的形参是类的对象,调用函数时,如果函数的形参是类的对象,调用函数时,进行形参和实参结合时进行形参和实参结合时如果函数的返回值是类的对象,函数执行如果函数的返回值是类的对象,函数执行完成返回调用者时完成返回调用者时15析构函数析构函数l析构函数用来完成对象被删除前的一析构函数用来完成对象被删除前的一些清理工作。析构函数是在对象的生些清理工作。析构函数是在对象的生存期即将结束的时刻被自动调用的。存期即将结束的时刻被自动调用的。l析构函数没有形参、是析构函数没有形参、是public成员成员l例如例如p114构造函数和析构函数16组合组合l类的组合就是一个类内嵌其他类的对象作为
9、成员,类的组合就是一个类内嵌其他类的对象作为成员,它们之间的关系是一种包含与被包含的关系。它们之间的关系是一种包含与被包含的关系。l当创建类的对象时,如果这个类具有内嵌对象成员,当创建类的对象时,如果这个类具有内嵌对象成员,那么各个内嵌对象将首先被自动创建那么各个内嵌对象将首先被自动创建l在创建对象时既要对本类的基本类型数据成员进行在创建对象时既要对本类的基本类型数据成员进行初始化又要对内嵌对象成员进行初始化初始化又要对内嵌对象成员进行初始化类的组合17组合组合l组合类构造函数格式组合类构造函数格式类名类名:类名类名(形参表形参表):内嵌对象内嵌对象1(形参形参表表):内嵌对象内嵌对象2(形参
10、表形参表).l例例4-4,p120类的组合18前向引用声明前向引用声明l即引用一个尚未定义的类即引用一个尚未定义的类l例如例如p120-122类的组合19UML简介简介lUML(Unified Modeling Language)统一建模语言是统一建模语言是OMG于于1997年推行的年推行的l2003年年6月,月,OGM通过了通过了UML2.0UML图形标识20UML类图类图l类和对象:在类和对象:在UML中用一个三段的矩中用一个三段的矩形表示一个类,如图形表示一个类,如图4-4;用一个矩形;用一个矩形表示一个对象表示一个对象l几种图形标识:(几种图形标识:(1)依赖关系是一个)依赖关系是一个
11、事物的变化可能会影响到使用它的另事物的变化可能会影响到使用它的另一个事物。图一个事物。图4-6,p126UML图形标识21UML类图类图l几种图形标识:(几种图形标识:(2)关联关系是一个类的)关联关系是一个类的对象和另一个类的对象之间相互作用的连接,对象和另一个类的对象之间相互作用的连接,例例1对多。图对多。图4-7,p126l(3)包含关系是聚合和组合的总称。聚合)包含关系是聚合和组合的总称。聚合是整体与部分关系,例如是整体与部分关系,例如“包含包含”、“组组成成”;组合是部分与整体共存。图;组合是部分与整体共存。图4-8,p127UML图形标识22UML类图类图l几种图形标识:(几种图形
12、标识:(4)继承关系使用三)继承关系使用三角形标识。例如图角形标识。例如图4-10,p128l注释:用带有折角的矩形表示,例注释:用带有折角的矩形表示,例4-6,p128UML图形标识23结构体结构体l结构体是一种特殊形态的类是对结构体是一种特殊形态的类是对C语言结构体的语言结构体的兼容兼容l结构体与类具有不同的默认访问控制属性:在结构体与类具有不同的默认访问控制属性:在结构体中对于未指定人和访问控制属性的成员结构体中对于未指定人和访问控制属性的成员其类型为公有类型;而类则为私有类型其类型为公有类型;而类则为私有类型l全部是数据成员的结构可以被直接赋值,例全部是数据成员的结构可以被直接赋值,例
13、4-7结构体和联合体24联合体联合体l是指全部数据成员共享同一组内存单元是指全部数据成员共享同一组内存单元l例如例如p131l一般只用联合体来存储私有的数据,不为他一般只用联合体来存储私有的数据,不为他定义函数成员定义函数成员l联合体可以不声明名称,其成员的名字可以联合体可以不声明名称,其成员的名字可以直接访问例如直接访问例如132,例,例4-8结构体和联合体:联合体的各个对象成员不能有自定义的构联合体的各个对象成员不能有自定义的构造函数、析构函数、重载赋值运算符造函数、析构函数、重载赋值运算符联合体不能继承、不支持包含多态性联合体不能继承、不支持包含多态性25用构造函数定义类型转换用构造函数
14、定义类型转换l构造函数可以实现类型转换构造函数可以实现类型转换,例如例如Line(Point(1),Point(4).getLen();l也可以写成也可以写成Line(1,4).getLen();这是隐式转这是隐式转换换l只允许显示执行类型转换:通过在构造函数只允许显示执行类型转换:通过在构造函数前面加前面加explicit实现实现深度探索26对象作为函数参数和返回值对象作为函数参数和返回值l对象作为函数参数会调用拷贝构造函数对象作为函数参数会调用拷贝构造函数l不同的编译器会对这种调用进行优化以减少临不同的编译器会对这种调用进行优化以减少临时对象生成时对象生成l对象作为函数的返回值也会调用拷贝构造函数对象作为函数的返回值也会调用拷贝构造函数l不同的编译器也会对生成的临时对象进行优化不同的编译器也会对生成的临时对象进行优化深度探索