1++第四章类与对象C2主要内容面向对象的基本特点类和对象构造函数和析构函数类的组合结构体与联合体3面向对象目的:实现软件设计的产业化观点:自然界是由实体(对象)所组成程序设计方法:使用面向对象的观点来描述模仿并处理现实问题。要求:高度概括、分类、和抽象。面向对象的方法面向对象的主要特点抽象、封装、继承、多态4抽象抽象:对具体问题(对象)进行概括,抽出这一类对象的公共性质并加以描述的过程。首先注意的是问题的本质及描述,其次是实现过程或细节抽象包括:数据抽象和行为抽象-数据抽象:描述某类对象的属性或状态(对象相互区别的物理量)-行为抽象(功能抽象、代码抽象):描述某类对象的共同行为或功能特征抽象的实现:通过类的声明。5抽象示例例:时钟的描述数据抽象:inthour,intminute,intsecond行为抽象:showTime(),setTime()6封装封装:将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,即将数据与操作数据的函数进行有机结合,形成“类”,其中数据和函数都是类的成员。封装可以增强数据的安全性,并简化编程。用户不必了解具体的实现细节,而只需要通过外部接口,以特定的访问权限,来使用类的成员。7classClock{public:voidsetTime(intNewH,intNewM,intNewS);voidshowTime();private:inthour,minute,second;};抽象实现例:时钟的描述数据抽象:inthour,intminute,intsecond行为抽象:showTime(),setTime()时钟类public和private用于指定成员的不同访问权限。此处的分号不能省略!8继承与多态继承:C++提供了继承机制,允许程序员在保持原有类特性的基础上,进行更具体、更详细的说明。(详见第7章)多态:同一段程序能处理多种类型对象的能力。在C++中,多态性是通过强制多态(如类型转换)、重载多态(如函数重载、运算符重载)、类型参数化和包含多态(如虚函数、模板)。(详见第8章)9主要内容面向对象的基本特点类和对象构造函数和析构函数类的组合结构体与联合体10类和对象类是C++面向对象程序设计的核心!类与函数函数是结构化程序设计的基本模块,函数将逻辑上相关的数据与语句封装,用于完成特定的功能。类是面向对象程序设计的基本模块,类将逻辑上相关的数据与函数封装,是对问题的抽象描述。类的集成程度更高,更适合大型复杂程序的开发。类的使用:先定义后使用11类的定义类的定义class类的名称{public:公有成员(外部接口)private:私有成员protected:保护型成员};12类的定义注:在类中可以只声明函数原型,函数的实现(函数体)可以在类外面定义classClock{public:voidsetTime(intNewH,intNewM,intNewS);voidshowTime();private:inthour,minute,second;};Clockmyclock;Clocky;13访问权限类的成员:数据成员(描述问题的属性)和函数成员(描述问题的行为)类的成员的访问权限控制:public,private,protectedpublic(公有类型、外部接口):任何外部函数都可以访问公有类型的数据和函数private(私有类型):只能被本类中的函数成员访问,任何来自外部的访问都非法protected(保护类型):与私有类似,区别在于继承过程中的影响不同(见第7章)14classClock{private:inthour,minute,second;public:voidsetTime(intNewH,intNewM,intNewS);voidshowTime();};访问权限几点说明:一般情况下,类的数据成员都应该声明为私有类型一个类如果没有任何外部接口,则无法使用在定义类时,不同访问属性的成员可以按任意顺序出现,修饰访问权限的关键字也可以多次出现,但一个成员只能有一种访问属性!一般将公有类型的成员放在最前面,便于阅读。例:上述声明并没有为Clock分配内存,只是告诉编译器Clock是什么:包含哪些数据,有什么功能。15对象对象是类的实例,即具有该类型的变量对象的定义类的名称对象名例:对象所占的内存空间只用于存放数据成员,函数成员在内存中只占一份空间,即不会在每个对象中存储副本定义对象的过程也称为类的实例化Clockmyclock;Clocky;声明一个类后,便可将其作为新数据类型来声明变量(即对象)16对象成员的访问访问对象的成员的一般形式对象名.数据成员名对象名.函数成员名(参数列表)例:注:类的成员函数可以访问所有数据成员;外部函数只能访问公有成员。myclock.showTime();myclock.setTime(16,10,28);17成员函数类的成员函数的定义与普通函数的区别:前面要加上类的名称和两个连续冒号类的成员函数可以在类外部定义,但在类内部必须声明例:数据类型类的名称::函数名(形参列表){函数体;}voidClock::setTime(intnewH,intnewM,intnewS){hour=newH;minute=newM;second=newS;}18目的对象调用成员函数时,需用“.”操作符指定调用所针对的对象,这一对象就是本次调用的目的对象。在成员函数中,可以直接引用目的对象的所有数据成员,而无需使用“.”操作符。在成员函数中,引用其它对象的数据成员和函数成员时,必须使用“.”操作符。在类的成员函数中,既可以访问目的对象的私有成员,也可以访问当前类的其它对象的私有成员。19默认形参值与普通函数一样,成员函数也可以带默认形参值。注:成员函数的默认形参值只能在类的定义中设置,不能在类定义之外的函数定义中设置。带默认形参值的成员函数classClock{public:voidsetTime(intNewH=0,intNewM=0,intNewS=0);......};20内联成员函数内联成员函数的定义:隐式方式和显式方式隐式方式:将函数体直接放在类的定义中classClock{public:voidsetTime(intNewH=0,intNewM=0,intNewS=0);voidshowTime(){couthour“:”minute“:”secondendl;}......};21内联成员函数使用内联函数可以减少调用开销,提高效率,但只适合相当简单的函数;使用显式方式定义内联函数可以保持类定义的简洁内联成员函数的定义:隐式方式和显式方式显式方式:将函数体直接放在类的定义中classClock{public:voidsetTime(intNewH=0,intNewM=0,intNewS=0);voidshowTime();......};inlinevoidClock::showTime(){couthour“:”minute“:”secondendl;}22程序示例#includeiostreamusingnamespacestd;classClock//时钟类的声明{public://外部接口,公有成员函数voidsetTime(intNewH=0,intNewM=0,intNewS=0);voidshowTime();private://私有数据成员inthour,minute,second;};//成员函数的定义(时钟类成员函数的具体实现)voidClock::setTime(intNewH,intNewM,intNewS){hour=NewH;minute=NewM;second=NewS;}inlinevoidClock::showTime(){couthour:minute:secondendl;}23//主函数intmain(){ClockmyClock;//定义对象myClockcoutFirsttime:endl;myClock.setTime();//设置时间为默认值myClock.showTime();//显示时间coutSecondtime:endl;myClock.setTime(16,10,28);//设置时间为16:10:28myClock.showTime();//显示时间system(pause);return0;}程序示例ex_class_01.cpp24主要内容面向对象的基本特点类和对象构造函数和析构函数类的组合结构体与联合体25构造与析构函数构造函数:负责对象初始化类与对象的关系类似于基本数据类型与普通变量之间的关系不同对象之间的主要区别:名称与数据对象的初始化:定义对象时,设置数据成员的值析构函数:在特定对象使用结束后,经常需要进行一些清理工作,这部分工作就有析构函数负责构造函数与析构函数是对象的两个特殊的成员函数26构造函数构造函数构造函数的函数名与类的名称相同;构造函数没有返回值;构造函数在对象创建时会被系统自动调用。若没有构造函数,编译器会自动产生出构造函数(形参和函数体都为空,如:Clock(){})可以是内联函数、带默认形参值或函数重载对象创建的过程—申请内存空间(只存放数据成员)—初始化:调用构造函数27classClock{public:Clock(intx,inty,intz);//构造函数voidsetTime(intNewH=0,intNewM=0,intNewS=0);voidshowTime();private:inthour,minute,second;};//构造函数的定义Clock::Clock(intx,inty,intz){hour=x;minute=y;second=z;}......构造函数示例构造函数前不能加数据类型或void!28intmain{Clockc1(0,0,0);//声明对象并初始化c1.showTime();c1.setTime(16,10,28);Clockc2;//ERRORreturn0;}构造函数示例ex_class_02.cpp29classClock{public:voidClock(intx,inty,intz);//构造函数voidClock(){hour=0;minute=0;second=0;}//函数重载voidsetTime(intNewH=0,intNewM=0,intNewS=0);voidshowTime();private:inthour,minute,second;};......构造函数示例ex_class_03.cpp思考:如何显示时间16:30:0030复制构造函数复制构造函数:一类特殊的构造函数,用已有的对象去初始化新的对象。若没有定义复制构造函数,系统会在必要时自动生成一个,功能就是将已有对象的数据成员全部复制到新建立的对象中。class类名{public:类名(形参列表);//构造函数类名(类名&对象名);//复制构造函数;......};类名(类名&对象名)//复制构造函数的定义{函数体;}31示例classPoint//Point类的声明{public://外部接口Point(intx0=0,inty0=0){x=x0;y=y0;}//构造函数Point(Point&p);//复制构造函数intGetx(){returnx;}intGety(){returny;}private://私有数据intx,y;};Point::Point(Point&p)//复制构造函数的定义{x=p.x;x=p.y;cout复制构造函数被调用!endl;}......32复制构造函数普通构造函数在对象建立时被自动调用,而复制构造函数在以下三种情况下会被调用:(1)用一个对象去初始化