收藏 分销(赏)

类与对象(c++).ppt

上传人:xrp****65 文档编号:13336138 上传时间:2026-03-03 格式:PPT 页数:44 大小:252KB 下载积分:10 金币
下载 相关 举报
类与对象(c++).ppt_第1页
第1页 / 共44页
类与对象(c++).ppt_第2页
第2页 / 共44页


点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第7章 类与对象,71 类、对象及数据封装,72 构造函数、析构函数、成员函数、静态成员与友元,教学目标,:,1,掌握类及对象的概念、类与对象的关系、类与对象的差异,2,掌握构造函数、析构函数的作用及定义,3,了解静态成员、友元等概念。,教学重点:,(,1,),类和对象概念和定义;,(,2,)构造函数和析构函数解析。,教学难点:,构造函数、析构函数,第7章 类与对象,7.1 类的定义,7.1.1 类的定义,7.1.2 类成员的访问控制,7.1.3 类的成员函数,7.1.4 对象,7.1.1,类的定义,类的引入:,类是一种由用户定义的复杂数据类型,它是将不同类型的数据及相关的操作封装在一起的集合体.,描述客观事物时,必须用不同的数据类型来描述事物各个不同的方面。如一种商品:,商品名称(用字符串描述);该商品数量(用整型数描述),该商品单价(用浮点数描述),该商品总价(用浮点数描述)。,这里用了属于三种不同数据类型的四个数据成员来描述一种商品。,7.1.1 类的定义,类的定义的一般格式:,/说明部分,class ,public:,protected:,private:,;,/实现部分,7.1.1 类的定义,类的表述:,class Goods,private:,char name21;,int,amount;,float price,float,tValue,;,public:,setPrice,(,int,p);,;/,最后的分号不可少,这是一条说明语句,关键字,class,是数据类型说明符,指出下面说明的是类。标识符,Goods,是商品这个类的类型名。花括号中是构成类体的系列成员,关键字,public,是一种访问限定符。,7.1.1 类的定义,类定义语法格式:,class,类名,private:,成员表1;,public:,成员表2;,protected:,成员表3;,;/注意:所有说明都以分号结束,其中“,class,类名”称为类头。花括号中的部分称为类体,类体中定义了类成员表,包含数据和函数.,7.1.1 类的定义,成员函数:,class Goods,private:,char name21;,int,amount;,float price;,float,tValue,;,public:,void,registerGoods,(char,int,float);/,输入数据,void,countTotal,(void);/,计算商品总价值,void,getName,(char);/,读取商品名,int getAmount,(void);/,读取商品数量,float,getPrice,(void);/,读取商品单价,float,getTvalue,(void);/,读取商品总价值,7.1.1 类的定义,封装:,类把数据(事物的属性)和函数(事物的行为操作)封装为一个整体。,接口:,通常数据成员被说明成私有的,函数成员被说明成公有的;从外部对数据成员进行操作,只能通过公有函数来完成,从而使数据受到了良好的保护,不易受副作用的影响。公有函数集定义了类的接口。,成员函数可以直接访问类定义中的任一成员,可以处理数据成员,也可调用成员函数。,注意:,类是一种数据类型,定义时系统不为类分配存储空间,所以不能对类的数据成员初始化。类中的任何数据成员也不能使用关键字,extern、auto,或,register,限定其存储类型,。,7.1.2 类成员的访问控制,访问限定符:,public(,公共的)说明的成员能从外部进行访问。,private(,私有的)和,protected(,保护的)说明的成员不能从外部进行访问。,每种说明符可在类体中使用多次。,访问限定符的作用域是从该说明符出现开始到下一个说明符之前或类体结束之前结束。,如果在类体起始点无访问说明符,系统默认定义为私有,(,private)。,访问限定符,private、protected,体现了类具有封装性。,7.1.3类的成员函数,成员函数定义:,成员涵数用来描述事物的行为.成员涵数的说明必须在类体中进行,但定义既可以在类体中进行,也可以在类体外进行.,(1)通常在类定义中,成员函数仅作声明。函数定义通常在类的说明之后进行,其格式如下:,返回值类型 类名:函数名(参数表),/函数体,其中运算符“:”称为作用域运算符,它指出该函数是属于哪一个类的成员函数。,(2)另一种方式是对成员涵数进行说明后,紧接着进行成员涵数的定义.,class Goods,private:,char name21;,int,amount;,float price,float,tValue,;,public:,float,getPrice,();,float,getTvalue,();,void,setPrice,(,int,p)price=p;,;,float Goods:,getPrice,()return(Price);,float Goods:,getTvalue,()return(,tValue,);,7.1.3类的成员函数,7.1.4 对象的定义,定义对象:,对象是类的实例(,instance)。,定义一种数据类型只是告诉编译系统该数据类型的构造,并没有分配内存。类只是一个样板,以此样板可以在内存中开辟出同样结构的实例对象。,一个对象必须属于一个已知的类.,7.1.4 对象的定义,定义对象的格式如下:,();,其中:,类名:为对象所属的类的名称;,对象名:合法的,C+,标识符,可以一次定义多个对象.,参数表:为初始化对象时所需要的参数.,例如:,Goods car;,这个定义创建了,Goods,类的一个对象,car,,同时为它分配了属于它自己的存储空间,用来存放数据和对这些数据实施操作的成员函数(代码),。,对象存储:,数据区,代码区,对象,1,对象,数据区,代码区,对象,数据区,代码区,图7.1 各对象完全独立地安排内存的方案,图7.1是系统为每一个对象分配了全套的内存。数据区安放数据成员,代码区安放成员函数。,注意:区别同一个类的各个不同的对象的属性是由数据成员决定的,不同对象的数据成员的内容是不一样的;而行为(操作)是用函数来描述的,这些操作的代码对所有对象都是一样的。,7.1.4 对象的定义,数据区,对象,1,数据区,对象,数据区,对象,公共代码区,图7.2,各对象的代码区共用的方案,图,7.2,仅为每个对象分配一个数据区,代码区(存放成员函数的区域)为各对象类共用。,图,7.1,对应的是在类说明中定义函数,而图,7.2,对应的是在类说明外部定义函数。,7.1.4 对象的定义,7.1.4对象的定义,对象的成员就是用来创建该对象的类所定义的成员,包括数据成员和成员涵数,创建对象之后,就可以使用.和-来访问对象的数据成员和成员涵数,一般格式如下:,.数据成员名,.成员涵数名(参数表),或者,-成员涵数名(参数表),对象使用规则:,只要在对象名后加点号(点操作符),再加数据成员或成员函数名就可以了。但是这些成员必须是公有的成员,只有公有成员才能在对象的外面对它进行访问。,【例7.1,】,中对象,car,的4个数据成员全是私有的,如写:,car.name;car.amount;,car.price;car.,tValue,;,是错误的,必须用对象,car,所带的公有函数进行访问,。,7.1.4 对象的定义,7.2,构造函数和析构函数,7.2.1构造函数,7.2.2析构函数,7.2.3 拷贝构造函数,7.2.4 静态成员,7.2.5友元函数,7.2.1构造函数,数据成员多为私有的,要对它们进行初始化,必须用一个公有函数来进行。同时这个函数应该在且仅在定义对象时自动执行一次。这个函数被称为:构造函数(,constructor).,构造涵数的作用是:在对象被创建时用特定的值构造对象,将对象初始化为一种特定的状态,使该对象具有不同于其他对象的特征.,构造涵数由系统自动调用.,7.2.1构造函数,构造函数特征:,1.函数名与类名相同。,2.构造函数无函数返回类型说明。注意是什么也不写,也不可写,void!,3.,在程序运行时,当新的对象被建立时,该对象所属的类的构造函数自动被调用,在该对象生存期中也只调用这一次。,4.构造函数可以重载。严格地讲,说明中可以有多个构造函数,它们由不同的参数表区分,系统在自动调用时按一般函数重载的规则选一个执行。,7.2.1构造函数,5.构造函数可以在类中定义,也可以在类外定义。,6.如果类说明中没有给出构造函数,则,C+,编译器自动给出一个默认的构造函数:,类名(,void),但只要我们定义了一个构造函数,系统就不会自动生成默认的构造函数。,只要构造函数是无参的或各参数均是有默认值的,,C+,编译器都认为是默认的构造函数,并且默认的构造函数只能有一个。,7.2.1 构造函数,Goods,的构造函数:,三参数:,Goods(char*n,int,a,float p),strcpy,(name,n);amount=a;price=p;,tValue,=price*amount;,两参数:货名和单价,,Goods(char*n,float p),strcpy,(name,n);price=p;amount=0;,tValue,=0.0;,默认的构造函数:,Goods(),name0=0;price=0.0;amount=0;,tValue,=0.0;,这三个构造函数同时被说明(重载)。,7.2.1构造函数,构造函数应用:,Goods car1(“,夏利2000”,30,98000.0);,调用了,Goods,中的第一个构造函数,等效于:,Goods car1=Goods(“,夏利2000”,30,98000.0);,Goods car2(“,桑塔那2000”,164000.0);,调用的是第二个构造函数,参数为两个。,Goods car3;,定义时调用不带参数的构造函数,但是定义对象时不能加括号。例如:,Goods car4();,car4(),是不带参数的函数,它的返回值是类,Goods,的对象。,7.2.2析构函数,析构函数(,destructor),特征:,当一个对象的生命周期结束时,,C+,会自动调用析构函数(,destructor),对该对象进行善后工作,,1.构函数名与类名相同,但在前面加上字符,如,Goods()。,2.,析构函数无函数返回类型,与构造函数在这方面是一样的。但析构函数不带任何参数。,3.一个类有一个也只有一个析构函数,这与构造函数不同。析构函数可以默认。,4.对象注销时,系统自动调用析构函数。,7.2.3 拷贝构造函数,拷贝构造函数的引入:,同一个类的对象在内存中有完全相同的结构,如果作为一个整体进行复制是完全可行的。这个复制过程只需要复制数据成员,而成员函数是共用的(只有一份代码)。在建立对象时可用同一类的另一个对象来初始化该对象,这时所用的构造函数称为拷贝构造函数(,Copy Constructor)。,故:拷贝构造涵数是用一个已知的对象来初始化一个正在创建的同类对象.,7.2.3 拷贝构造函数,拷贝构造函数的一般格式:,:(,const,类名&),涵数体,特征:,是一种构造涵数,与类名同名,不指定返回值类型;,只有一个参数,且该参数是同类对象的引用;,每一个类都必须有一个拷贝构造涵数,若类中没有定义拷贝构造涵数,则系统自动生成一个公有的拷贝构造涵数.,7.2.3 拷贝构造函数,例如:,Goods (const Goods&,cgd,),strcpy,(name,cgd,.name);,price=,cgd,.price;,amount=,cgd,.amount;,tValue,=,cgd,.,tValue,;,7.2.3 拷贝构造函数,实拷贝构造涵数的调用实例:,Goods car1(“,夏利2000”,30,98000.00);,/调用三个参数的构造函数,Goods car2=car1;/,调用拷贝构造函数,Goods car3(car1);,/,调用拷贝构造函数,,car1,为实参,这样三个对象的初始化结果完全一样。,注意:,在类定义中如果没有显式给出构造函数时,并不是不用构造函数,而是由系统自动调用默认的构造函数或默认的拷贝构造函数。如果有程序设计者定义的构造函数(包括拷贝构造函数),则按函数重载的规律,调用合适的构造函数。,7.2.4 静态数据成员,静态数据成员定义与使用:,在类定义中,用关键字,static,修饰的数据成员为静态数据成员。,该类所有对象共享由系统为静态成员分配的一个存储空间,而这个存储空间是在编译时分配的,在定义对象时不再为静态成员分配空间。,静态数据是该类所有对象所共有的,可提供同一类的所有对象之间信息交换的捷径。,7.2.4 静态数据成员,静态数据成员定义与使用:,静态数据成员属于整个类,使用时可用以下格式:,类名:静态数据成员名 /在类的外部使用时,注意:,(1)静态数据成员在类中声明,但不能在其中定义。,(2)静态数据成员的初始化不能在构造函数中进行。,7.2.4 静态数据成员,【例7.3】,用静态数据成员计算由同一类建立的对象的数量,执行程序后输出:,对象数量=1 /,a0,构造函数产生,对象数量=2 /,a1,构造函数产生,对象数量=3 /,a2,构造函数产生,对象数量=2 /,a2,析构函数产生,对象数量=1 /,a1,析构函数产生,对象数量=0 /,a0,析构函数产生,7.,2.4,静态成员函数,静态成员函数的引入:,当一个函数不需要访问类中除静态数据成员之外的数据时,我们可以将其定义为静态成员函数。,一般情况下,静态成员函数只能访问类中的静态数据成员。静态成员函数是被一个类中所有对象共享的成员函数,不属于哪个特定的对象。,7.,2.4,静态成员函数,静态成员函数的使用:,将成员函数说明为静态,使该成员函数与该类的不同对象无关。静态成员函数的调用,在对象之外可以采用下面的方式:,类名,:,函数名,(,对象名,参数表,);,或者,任一类对象名,:,函数名,(,对象名,参数表,);,静态函数成员多为公有的。,7.,2.4,静态成员函数,静态成员函数的使用实例:,在下面的程序中,将使用类,Car,为自己的每一个对象提供了对象,ID,号。创建或销毁对象时,将有一静态数据成员记录程序中的对象数。执行结果是显示对象,ID,及对象数。,7.,2.4 静态成员函数,静态成员函数的使用实例,:,#,include,class Car,private:,static int counter;/,静态数据成员,int,id;,public:,Car,(),;/,构造函数,Car,(),;/,析构函数,static void display,(),;/,静态成员函数,void,displayID,(),;,;,7.,2.4,静态成员函数,静态成员函数的使用实例:,int Car:counter=0;/,定义静态数据成员,Car:Car,(),counter+;id=counter;,Car:Car,(),counter-;,cout,Object number id being destroyed;,void Car:display,(),/static function,cout,Number of objects created is=counter,endl,;,void Car:,displayID,(),cout,Object ID is id,endl,;,7.,2.4,静态成员函数,静态成员函数的使用实例:,int main,(),Car a1;,Car:display,(),;,Car a2,a3;,Car:display,(),;,a1.displayID,(),;,a2.displayID,(),;,a3.displayID,(),;,return 0;,在,C+,中,友元(,friend),函数允许在类外访问该类中的任何成员,就象成员函数一样。友元函数用关键字,friend,说明。,由于类的封装性,只有类的成员涵数才能访问类的私有成员,而外部涵数只能访问类的公有成员,但有时需要在类的外部访问类的私有成员,以减少使用类的成员涵数访问私有成员而带来的参数传递、类型检查、安全性检查的时间开销。,7,.2.5,友元函数,7,.2.5,友元函数,友元函数是一种定义在类外面的普通函数,它需要在类体内进行说明,为区别友元与类成员函数,在说明友元函数时前面加关键字,friend。,友元函数不是成员函数,但是它可以访问类私有成员。,普通函数通过在类中的友元声明成为该类的友元函数。,例如,:,class Goods,public:,void,getPrice,();,friend void,displayAll,(Goods g);/,友元函数的声明,;,void display(Goods g)/,友元函数没有,:,运算符,/,一些代码,7.,2.5,友元函数,注意:,1.,友元函数不是类的成员函数,在友员函数体中访问对象的成员,必须用对象名加运算符“,.”,加对象成员名。但友元函数可以访问类中的所有成员,一般函数只能访问类中的共有成员。,2.,友元函数不受中类的访问权限关键字限制,可以把它放在类的公有、私有、保护部分,但结果一样。,3.,某类的友元函数的作用域并非该类作用域。如果该友元函数是另一类的成员函数,则其作用域为另一类的作用域,否则与一般函数相同。,7.,2.5,友元函数,友元类:整个类可以是另一个类的友元。友元类的每个成员函数都是另一个类的友元函数,都可访问另一个类中的保护或私有数据成员。,定义方法如下:,class B;/,前向声明,class A ,friend B;/,声明,B,为,A,的友元类,;,7.,2.5,友元函数,小结:,1、掌握类及对象的概念、类与对象的关系、类与对象的差异。,2、掌握构造函数、析构函数的作用及定义,思考题:,1、构造函数和析构函数有什么作用?,2、什么是拷贝构造函数,拷贝构造函数何时被调用?,作业题:,1、设计一个用与人事管理的“人员”类。,
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 百科休闲 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服