《类和对象 (3)优秀PPT.ppt》由会员分享,可在线阅读,更多相关《类和对象 (3)优秀PPT.ppt(47页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、类和对象第一页,本课件共有47页类构成了实现C+面向对象程序设计的基础,在C+语言面向对象程序设计中占据着核心地位。它把数据和作用在这些数据上的操作组合在一起,是封装的基本单元。对象是类的实例,类定义了属于该类的所有对象的共同特性。第二页,本课件共有47页8.1 类和对象从一般意义上讲,对象(Object)是现实世界中的客观事物。类是把具有相同属性的事物划分为一类,从而得出的抽象概念。类是一组性质相同的对象的程序描述,它由概括了一组对象共同性质的数据和函数组成。面向对象的程序设计中最基本的概念是对象,一般意义上的对象指的是一个实体的实例,在这个实体中包括了特定的数据和对这些数据进行操作的函数。
2、对象的核心概念就是通常所说的“封装性”(encapsulation)、“继承性”(inheritance)和“多态性”(polymorphism)。第三页,本课件共有47页8.1.1 类的定义类的定义类是一种用户自定义的数据类型,它的一般定义格式如下:class private:;protected:;public:;第四页,本课件共有47页其中,class是定义类的关键字。是一个标识符,用于惟一标识一个类。一对大括号内是类的说明部分,说明该类的所有成员。类的成员包括数据成员和成员函数两部分。类的成员从访问权限上分有以下三类:公有的(public)、私有的(private)和保护的(prote
3、cted),其中默认为private权限。说明为公有的成员可以被程序中的任何代码访问;说明为私有的成员只能被类本身的成员函数及友元类的成员函数访问,其他类的成员函数,包括其派生类的成员函数都不能访问它们;说明为保护的成员与私有成员类似,只是除了类本身的成员函数和说明为友元类的成员函数可以访问保护成员外,该类的派生类的成员也可以访问。第五页,本课件共有47页例8-1:includeclassSampleintx,y;public:Sample()x=y=0;Sample(inta,intb)x=a;y=b;Voiddisp()cout”x=”x”,y=”yendl;voidmain()Sampl
4、es1,s2(1,2);s1.disp();s2.disp();此程序的运行结果为:x=0,y=0 x=1,y=2第六页,本课件共有47页8.1.2 类的成员函数类的成员函数定义类的函数成员的格式如下:返回类型返回类型 类名类名:成员函数名(参数说明)成员函数名(参数说明)函数体函数体类的成员函数对类的数据成员进行操作,成员函数的定义体可以在类的定义体中,如例8-2所示。第七页,本课件共有47页例8-2:类中的成员函数在类定义中直接描述示例。classLocationpublic:voidinit(intx,inty)X=x;Y=y;private:intX,Y;public:intGetX(
5、)returnX;intGetY()returnX;第八页,本课件共有47页类的成员函数也可以另外定义,而在类定义时给出函数头。例8-2的成员函数可说明如下:voidLocation:init(intx,inty)X=x;Y=y;/将x,y的值分别赋给X,YintLocation:GetX()returnX;intLocation:GetY()returnY;第九页,本课件共有47页一个类的说明可分为定义性说明和引用性说明两种,引用性说明仅说明类名。例如:classLocation;引用性说明不能用于说明类的变量,但可说明指针,例如:classmyClassprivate:inti;mycla
6、ssmember;/错myclass*pointer;/对 注意:在类定义体外定义成员函数时,需在函数名前加上类域标记,因为类的成员变量和成员函数属于所在的类域,在域内使用时,可直接使用成员名字,而在域外使用时,需在成员名外加上类对象的名称。第十页,本课件共有47页8.1.3 类和结构类和结构结构是类的一种特例,在结构中也可以定义成员函数。定义结构时只要把关键字class 改为struct即可。classLocationprivate:intX,Y;public:voidinit(intx,inty)X=x;Y=y;intGetX()returnX;intGetY()returnY;第十一页,
7、本课件共有47页结构和类的唯一区别是:在未指定访问权限时,结构中的成员被默认为公有的而类中的成员被默认为私有的。在所有其他方面,类和结构等价。例如:structSintX;/公有的.classCintX;/私有的.尽管类和结构是等价的,但一般在描述数据时使用结构,在描述数据及对数据的操作时用类。第十二页,本课件共有47页由于类和结构是等价的,对类的五种操作对结构也同样适用:(1)对象之间可以相互赋值。LocationlocationA,locationB;locationA.init(5,6);locationB=locationA;locationB的数据成员和locationA的数据成员有
8、相同的值。(2)对象可以作为数组的元素。Locationarrayloc100;arrayloc是以结构Location为元素的数组。第十三页,本课件共有47页(3)可以说明指向对象的指针,但不能取私有数据成员的指针或成员函数的地址。Locationlocation;Location*pointLoc=&location;当pointLoc被加1后,它将指向下一个Location对象。(4)对象可以作为函数的参数,既可作值参(不影响实参),也可以作引用参数。voiddisplay(Location&location).;location就是引用参数。第十四页,本课件共有47页(5)一个对象可以
9、是另一个对象的成员。例 如:可 以 定 义 一 个Rectangle类,含 有 一 个Location结构类型的成员。H=h;W=w;Location*GetLoc()return&Loc;intGetH()returnH;intGetW()returnW;classRectangleLocationLoc;intH,W;public:voidinit(intx,inty,inth,intw)Loc.init(x,y);第十五页,本课件共有47页8.2 类对象为了使用类,还必须说明类的对象。在定义类时,系统是不会给类分配存储空间的,只有定义类对象时才会给对象分配相应的内存空间。8.2.1 对象
10、的定义格式对象的定义格式定义类对象的格式如下:;其中,是待定的对象所属的类的名字,即所定义的对象是该类的对象。中可以有一个或多个对象名,多个对象名用逗号分隔。在中,可以是一般的对象名,还可以是指向对象的指针名或引用名,也可以是对象数组名。第十六页,本课件共有47页8.2.2 对象成员的表示方法对象成员的表示方法一个对象的成员就是该对象的类所定义的成员。对象成员有数据成员和成员函数。一般对象的成员表示如下:.或者.()前者用于表示数据成员,后者用于表示成员函数。这里的“.”是一个运算符,该运算符的功能是表示对象的成员。第十七页,本课件共有47页指向对象的指针的成员表示如下:-或者-()同样,前者
11、用于表示数据成员,后者用于表示成员函数。这里的“-”是一个表示成员的运算符,它与前面介绍过的“.”运算符的区别是:“-”用来表示指向对象的指针的成员,而“.”用来表示一般对象的成员。对于数据成员和成员函数,以下两种表示方式是等价的:-与(*).第十八页,本课件共有47页8.3 构造函数和析构函数构造函数和析构函数都是类的成员函数,但它们是特殊的成员函数,不用调用便自动执行,而且这些函数的名字与类的名字有关。8.3.1 构造函数构造函数构造函数是一种用于创建对象特殊的成员函数,当创建对象时,系统自动调用构造函数,不能在程序中直接调用。构造函数名与类名相同,一个类可以拥有多个构造函数(重载),构造
12、函数可以有任意类型的参数,但不能具有返回类型。构造函数的作用是:为对象分配空间;对数据成员赋初值;请求其他资源。第十九页,本课件共有47页如果一个类没有定义构造函数,编译器会自动生成一个不带参数的默认构造函数,其格式如下::()()在程序中定义一个对象而没有指明初始化时,编译器便按默认构造函数来初始化该对象。第二十页,本课件共有47页8.3.2 析构函数析构函数当一个对象消失,或用new创建的对象用delete删除时,由系统自动调用类的析构函数。析构函数名字为符号“”加类名,析构函数没有参数和返回值。一个类中只可能定义一个析构函数,所以析构函数不能重载。析构函数是用于取消对象成员函数,当一个对
13、象作用域结束时,系统自动调用析构函数。析构函数的作用是进行清除对象,释放内存等。当对象超出其定义范围时(即释放该对象时),编译器自动调用析构函数。在以下情况下,析构函数也会被自动调用:第二十一页,本课件共有47页(1)如果一个对象被定义在一个函数体内,则当这个函数结束时,该对象的析构函数被自动调用。(2)若一个对象是使用new运算符动态创建的,在使用delete运算符释放它时,delete将会自动调用析构函数。如同默认构造函数一样,如果一个类没有定义析构函数,编译器会自动生成一个默认析构函数,其格式如下::()()默认析构函数是一个空函数。第二十二页,本课件共有47页8.3.3 带参数的构造函
14、数带参数的构造函数带参数的构造函数可以在创建对象时,用具体数值初始化数据成员和各种数据元素。注意:构造函数的参数个数和类型规定了声明一个对象时,为对这个对象进行初始化所需要的初始值的个数和类型。例如:LocationA(100,200);/OKLocationB(10);/errorLocationA;/error若有多个重载构造函数,系统自动寻找匹配。第二十三页,本课件共有47页8.3.4 重载构造函数重载构造函数构造函数可以像普通函数一样被重载,C+根据说明中的参数个数和类型选择合适的构造函数。若类 X 具有一个或多个构造函数,创建类 X 的对象时,C+会根据参数选择调用其中一个。构造函数
15、可以使用默认参数,但谨防二义性。使用构造函数的限制:不能被继承,不能说明为虚函数,不能显式调用,不能取构造函数的地址。第二十四页,本课件共有47页无论何时,创建对象时都要调用构造函数(包括默认构造函数)。构造函数的工作是建立对象的基本结构,进行数据初始化。即:初始化虚函数表;建立基类对象;建立非静态数据成员对象;安置虚基类对象信息;执行构造函数体中的代码。当一个对象退出其作用域时,都要调用析构函数。析构函数的工作是:执行析构函数中的代码,将对象占据的存储空间归还系统,做公共及用户要求的善后工作。第二十五页,本课件共有47页8.4 类的初始化1.C+允许以下允许以下3种数据初始化方法:种数据初始
16、化方法:(1)初始值表:适用于结构和数组的初始化。例如:structconfchar*month;intday;intyear;cpp=“Nov.”,12,1998,“Oct.”,8,1999,“April”,6,2000第二十六页,本课件共有47页(2)赋值表达式:适用于简单变量或指针类型的初始化。例如:inti=1;char*p=“No.1”;(3)表达式表:与方法(2)语义相同,风格不一样。例如:inti(1);char*p(“No.1”);构造函数的初始化主要采用表达式表的方法。第二十七页,本课件共有47页2.C+中,类的初始化分为两种情况:中,类的初始化分为两种情况:(1)对仅有公有
17、段成员,而没有构造函数或基类的类对象,用初始值表来表示。典型例子是结构。(2)带有构造函数的类的初始化。例如:classXpublic:X();X(inti);private:inti;main()Xone;/调用无参构造函数X:X()Xtwo(1);/调用构造函数X:X(int),/表达式表Xthree=1;/调用构造函数X:X(int),/赋值表达式第二十八页,本课件共有47页3.初初始始化化时时,构构造造函函数数可可用用两两种种方方式式把把值值赋赋给给成员成员:(1)接受该值作为参量,并在构造函数体内赋给其成员。例如:classXinta,b;/默认为private成员public:X(
18、inti,intj)a=i;b=j;第二十九页,本课件共有47页(2)使用函数体前的初值表(冒号语法)。例如:代替函数体内对一般成员赋值示例。classXinta,b;public:X(inti,intj):a(i),b(j);第三十页,本课件共有47页8.5 复杂的对象表示 1.类类型的常量类类型的常量基本类型常量直接由其书写形式表示它的值和类型,例如:1.2 12e3double 类型的常量 102 45int 类型的常量 a bchar 类型的常量形式上,类类型不存在像基本类型那样的常量,但有些类类型确实存在常量。例如,说明一个复数类 Complex,以下都是数学上的复数类常量:2+3i
19、23+0i 第三十一页,本课件共有47页说明复数类Complex:classComplexintRem;intImp;public:Complex(int)Rem=a;Imp=0;Complex(inta,intb)Rem=a;Imp=b;.;.Complexx=Complex(2,3);Complexy=Complex(23);.构造函数用于类型转换:带参数的构造函数将基本类型常量转换成Complex常量。(2,3)=2+3i23=23+0i第三十二页,本课件共有47页2.类对象作为成员类对象作为成员C+中,类对象常常可以作为另一个类的成员。3.对象的数组对象的数组C+中,可以创建对象数组。
20、为了创建对象数组,构造函数的形式必须是:(1)使用默认构造函数;(2)若有用户自定义构造函数,则必须含有一个不带参数或具有一个带默认参数的构造函数。第三十三页,本课件共有47页4.对象指针对象指针对象指针在C+中很重要,对象可以直接引用,也可以通过对象指针来引用。注意:当指针加1或减1时,它的增加或减少方式会使指针指向其基类型的下一元素或上一元素。5.对象参数传递到函数对象参数传递到函数对象可以作参数传递到函数:传值方式和传地址方式。第三十四页,本课件共有47页8.6 堆与拷贝构造函数8.6.1 堆对象堆对象1.C+程序的内存布局程序的内存布局C+程序的内存格局通常分为四个区:(1)全局数据区
21、(data area)存放全局变量、静态数据、常量。(2)代码区(code area)存放类成员函数、其他函数代码。(3)栈区(stack area)存放局部变量、函数参数、返回数据、返回地址。(4)堆区(heap area)。自由存储区。第三十五页,本课件共有47页2.堆对象堆对象堆对象是在程序运行时根据需要随时可以被创建或删除的对象,当创建堆对象时,堆中的一个存储单元从未分配状态变为已分配状态,当删除堆对象时,存储单元从分配状态又变为未分配状态,可供其他动态数据使用。第三十六页,本课件共有47页8.6.2 new 和和 delete与对基本数据类型操作一样,new 和 delete算符可以
22、用于创建和删除堆对象。语法:new T (初始值(初始值)创建一个创建一个T类型对象,返回值为对象首地址类型对象,返回值为对象首地址new T E 创建一个创建一个T类型对象数组,返回值为数组首地址类型对象数组,返回值为数组首地址delete 指针变量指针变量删除一个指针变量所指的对象删除一个指针变量所指的对象delete 指针变量指针变量删除一个指针变量所指的对象数组删除一个指针变量所指的对象数组其中 T 是类型,E 是算术表达式第三十七页,本课件共有47页8.6.3 拷贝构造函数拷贝构造函数1.拷贝构造函数的表示拷贝构造函数的表示当构造函数的参数为自身类的引用时,这个构造函数称为拷贝构造函
23、数。拷贝构造函数的功能是用一个已有对象初始化一个正在建立的同类对象。例如:classApublic:A(int);A(constA&,int=1);Aa(1);Ab(a,0);Ac=b;第三十八页,本课件共有47页2.拷贝构造函数的执行拷贝构造函数的执行(1)用已有对象初始化创建对象。例8-19(2)当对象作函数参数时,因为要用实参初始化形参,也要调用拷贝构造函数。(3)函数返回值为类类型时,情况也类似。例8-22 第三十九页,本课件共有47页8.7 this指针当一个成员函数被调用时,自动向它传递一个隐含的参数,该参数是一个指向这个函数成员所在的对象的指针。成员函数中可以用this关键字来引
24、用该指针。this指针的类型就是成员函数所属的类的类型。当调用成员函数时,它被初始化为被调用函数所在的类实例的地址。例8-23注意:this指针只能在类的成员函数中使用,它指向该成员函数被调用的对象。this指针一般用于返回当前对象自身。this指针大量用于运算符重载成员函数设计中。静态成员函数没有this指针。因为类只有一个静态成员函数实例,所以使用this指针没有什么意义。在静态成员函数中使用this指针会引起编译错误。第四十页,本课件共有47页8.8 引用8.8.1 引用标识符引用标识符&中用&可派生出一个引用类型,即产生同一变量的另一个名字。引用在中非常普遍,主要用途是为用户定义类型指
25、定操作,还可用于函数参数的传递,对引用型参数的操作,就是对实际参数的操作。例如:main()intnum=50;int&ref=num;ref+=10;printf(num=%d,num);此程序的运行结果为:num=60注意:若引用的是const变量,则编译器产生一个同值的临时变量,引用的是该临时变量。第四十一页,本课件共有47页8.8.2 const和和volatile const 和volatile是类型修饰符。在变量说明语句中,const 用于冻结一个变量,使其在程序中不能被修改。在用const 说明变量时,必须对该变量进行初始化。用volatile修饰的变量,虽然在一段程序中没有明显
26、被改动,单这个变量的值也会因为程序外部的原因(如中断等)而改变。第四十二页,本课件共有47页8.9 常类型8.9.1 常引用常引用如果在说明引用时用const修饰,则被说明的引用为常引用。常引用所引用的对象不能被更新。如果用常引用做形参,便不会意外地发生对实参的更改。常引用的说明形式如下:const&;例如:const int&n;其中,n是一个常引用,它所引用的对象不会被更新。如果出现:n=123;则是非法的。常引用作形参,在函数中不能更新它所引用的对象,因此对应的实参不会被破坏。第四十三页,本课件共有47页8.9.2 常对象常对象常对象是指对象常量,定义格式如下:const;或者const
27、 ;在定义常对象时必须进行初始化,而且不能被更新。只有常成员函数才能操作常对象,没有使用const关键词说明的成员函数不能用来操作常对象。第四十四页,本课件共有47页8.9.3 常对象成员常对象成员常对象成员包括常成员函数和常数据成员。1.常成员函数常成员函数使用const关键词说明的函数为常成员函数,常成员函数说明格式如下:()const;第四十五页,本课件共有47页对于常对象成员需要注意以下几点:(1)const是函数类型的一个组成部分,因此在实现部分也要带const关键词。(2)常成员函数不更新对象的数据成员,也不能调用该类中没有用const修饰的成员函数。(3)如果将一个对象说明为常对象,则通过该常对象只能调用它的常成员函数,而不能调用其他成员函数。(4)const关键词可以参与区分重载函数。例如,如果在类中有说明:void print();void print()const;则这是对print的有效重载。第四十六页,本课件共有47页2.常数据成员常数据成员就像一般数据一样,类的成员数据也可以是常量和常引用,使用const说明的数据成员为常数据成员。如果在一个类中说明了常数据成员,那么构造函数就只能通过初始化列表对该数据成员进行初始化。第四十七页,本课件共有47页
限制150内