《类及其对象的封装精选PPT.ppt》由会员分享,可在线阅读,更多相关《类及其对象的封装精选PPT.ppt(61页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、类及其对象的封装类及其对象的封装1第1页,此课件共61页哦内容提要内容提要类的构成及定义类的构成及定义对象对象对象的初始化对象的初始化静态成员静态成员this指针指针类对象作为成员类对象作为成员对象数组对象数组第2页,此课件共61页哦3.1 类的构成及定义类的构成及定义类是一种新的数据类型,它比结构更复杂。类是一种新的数据类型,它比结构更复杂。它是将不同类型的数据和与这些相关的操它是将不同类型的数据和与这些相关的操作封装在一起的集合体。作封装在一起的集合体。第3页,此课件共61页哦使用函数和类编程的本质不同:使用函数和类编程的本质不同:类是类是OOP的精华,利用它可以实现数据的的精华,利用它可
2、以实现数据的封装、隐蔽、继承和派生。封装、隐蔽、继承和派生。函数是将逻辑上相关的语句与数据封装,用函数是将逻辑上相关的语句与数据封装,用于完成特定的功能。于完成特定的功能。类则是逻辑上相关的函数与数据的封装,它类则是逻辑上相关的函数与数据的封装,它是对所要处理的问题的描述。是对所要处理的问题的描述。利用类可以编写出大型复杂的程序,其模块利用类可以编写出大型复杂的程序,其模块化程度比化程度比C语言中采用函数的方式更高。语言中采用函数的方式更高。第4页,此课件共61页哦1、类的定义语法、类的定义语法类的定义格式一般分为说明部分和实现部分。类的定义格式一般分为说明部分和实现部分。说明部分用来说明该类
3、中的成员,包括数说明部分用来说明该类中的成员,包括数据成员和成员函数的说明。成员函数是用据成员和成员函数的说明。成员函数是用来对数据成员进行操作的,又称为方法。来对数据成员进行操作的,又称为方法。实现部分是用来对成员函数的定义。概括实现部分是用来对成员函数的定义。概括来说,说明部分将告诉使用者来说,说明部分将告诉使用者“干什么干什么”,而实现部分是告诉使用者,而实现部分是告诉使用者“怎么干怎么干”。可见,使用者关心的往往是说明部分,而可见,使用者关心的往往是说明部分,而实现部分是一些不必关心的信息。实现部分是一些不必关心的信息。第5页,此课件共61页哦类的定义格式类的定义格式类是一种用户自定义
4、的数据类型,它的一般定义格式如下:类是一种用户自定义的数据类型,它的一般定义格式如下:class public:;protected:;private:;/该部分也可以放在类的内部该部分也可以放在类的内部 其中,其中,class是定义类的关键字。是定义类的关键字。是一个标识符,用于惟一标识一是一个标识符,用于惟一标识一个类。一对大括号内是类的说明部分,说明该类的所有成员。个类。一对大括号内是类的说明部分,说明该类的所有成员。第6页,此课件共61页哦公有成员、私有成员和保护成员公有成员、私有成员和保护成员类的成员包括数据成员和成员函数两部分。类的成员从访类的成员包括数据成员和成员函数两部分。类的
5、成员从访问权限上分有以下三类:公有的(问权限上分有以下三类:公有的(public)、私有的)、私有的(private)和保护的()和保护的(protected),其中默认为),其中默认为private权限。权限。公有成员:提供了类的外部接口,可以被程序中的任何公有成员:提供了类的外部接口,可以被程序中的任何代码访问;代码访问;私有成员:只能被类本身的成员函数及友元类的成员私有成员:只能被类本身的成员函数及友元类的成员函数访问,其他类的成员函数,包括其派生类的成员函数访问,其他类的成员函数,包括其派生类的成员函数都不能访问它们;函数都不能访问它们;保护成员:与私有成员类似,只是除了类本身的成员保
6、护成员:与私有成员类似,只是除了类本身的成员函数和说明为友元类的成员函数可以访问保护成员外,函数和说明为友元类的成员函数可以访问保护成员外,该类的派生类的成员也可以访问。该类的派生类的成员也可以访问。第7页,此课件共61页哦例例3.1 一个关于日期的类的说明部分一个关于日期的类的说明部分 class Tdatepublic:void SetDate(int y,int m,int d);int IsLeapYear();void print();private:int year,month,day;这个类中定义了三个成员函数:这个类中定义了三个成员函数:SetDate用来设置日期,用来设置日期
7、,IsLeapYear函数用来判断润年,返回函数用来判断润年,返回1表示是润年,表示是润年,print函函数用来输出显示。数用来输出显示。第8页,此课件共61页哦日期类的实现部分日期类的实现部分void Tdate:SetDate(int y,int m,int d)year=y;month=m;day=d;int Tdate:IsLeapYear()return(year%4=0&year%100!=0)|(year%400=0);void Tdate:print()coutyear“.”month“.”dayendl;第9页,此课件共61页哦说明:说明:日期类的实现部分中,对类内说明的三个
8、成日期类的实现部分中,对类内说明的三个成员函数进行了定义,即具体给除了函数功员函数进行了定义,即具体给除了函数功能的实现。在类外对类成员函数的定义必能的实现。在类外对类成员函数的定义必须使用运算符须使用运算符“:”,称为作用域运算符,称为作用域运算符(也称作用域分辨符)。它是用来表示某(也称作用域分辨符)。它是用来表示某个成员函数属于那个类的,如果未给出类个成员函数属于那个类的,如果未给出类名,该函数则是一个普通函数。名,该函数则是一个普通函数。第10页,此课件共61页哦例例3.2 上例的定义部分也可放在类内上例的定义部分也可放在类内class Tdatepublic:void SetDate
9、(int y,int m,int d)year=y;month=m;day=d;int IsLeapYear()return(year%4=0&year%100!=0)|(year%400=0);void print()coutyear”.”month”.”dayendl;private:int year,month,day;第11页,此课件共61页哦2、定义类时应注意的事项、定义类时应注意的事项(1)在类内不允许对所定义的数据成员进行初始化)在类内不允许对所定义的数据成员进行初始化因为类是一个数据类型,其定义后并没有存储空间,因此,数据因为类是一个数据类型,其定义后并没有存储空间,因此,数据
10、成员就不能进行初始化(但静态数据成员可以在类外进行初始化)成员就不能进行初始化(但静态数据成员可以在类外进行初始化)。例如,前面讲过的例如,前面讲过的Tdate类中,下面的定义是错误的。类中,下面的定义是错误的。Class Tdatepublic:private:int year=1998,month=4,day=9;/这里,不允许对数据成员进行初始化这里,不允许对数据成员进行初始化;第12页,此课件共61页哦2、定义类时应注意的事项、定义类时应注意的事项(2)类中的数据成员的类型可以是任意的,包括整)类中的数据成员的类型可以是任意的,包括整型、浮点型、字符型、数组、指针和引用等。也型、浮点型
11、、字符型、数组、指针和引用等。也可以是对象。即另一个类的对象,可以作为该类可以是对象。即另一个类的对象,可以作为该类的成员,但自身类的对象是不可以的。的成员,但自身类的对象是不可以的。(3)一般地,在类内先说明公有成员,它们是用户关)一般地,在类内先说明公有成员,它们是用户关心的,后面说明私有成员。心的,后面说明私有成员。(4)一般将类定义的说明部分或者整个定义部分(包)一般将类定义的说明部分或者整个定义部分(包含实现部分)放在一个头文件中。例如可把含实现部分)放在一个头文件中。例如可把Tdate类的定义放在头文件类的定义放在头文件tdate.h中,后面引用起来比中,后面引用起来比较方便。较方
12、便。(5)在类的说明部分之后必须加分号)在类的说明部分之后必须加分号”;”。第13页,此课件共61页哦3.2 对象对象类型和变量之间存在着一定的联系,类是模板,而变类型和变量之间存在着一定的联系,类是模板,而变量则是这种具有这种模板的一个实体。同样的有了量则是这种具有这种模板的一个实体。同样的有了“类类”类型就有其对应的变量实体,这就是对象。类型就有其对应的变量实体,这就是对象。对象是类的实例或实体,表面上看对象是某个对象是类的实例或实体,表面上看对象是某个“类类”类类型的变量,但对象又不是普通的变量,对象是一个数据型的变量,但对象又不是普通的变量,对象是一个数据和操作的封装体。封装的目的就是
13、阻止非法的访问,因和操作的封装体。封装的目的就是阻止非法的访问,因此对象实现了信息的隐藏,外部只能通过操作接口访问此对象实现了信息的隐藏,外部只能通过操作接口访问对象数据。对象是属于某个已知的类的,因此必须先定对象数据。对象是属于某个已知的类的,因此必须先定义类,然后才能定义对象。义类,然后才能定义对象。第14页,此课件共61页哦1、对象的定义格式、对象的定义格式 其中,其中,中可以有一个或多个对象名,对象名用逗号间隔。中可以有一个或多个对象名,对象名用逗号间隔。对象可以是一般的对象名,也可以是指向对象的指针名或引用名,对象可以是一般的对象名,也可以是指向对象的指针名或引用名,也可以是数组。也
14、可以是数组。例如:下面定义了类例如:下面定义了类Tdate的几个对象的几个对象 Tdate date1,date2,*pdate,date3,&rdate=date1;这里这里date1和和date2是普通类对象,是普通类对象,pdate是一个指向对象的是一个指向对象的一个指针变量,一个指针变量,date3定义了三个数组变量,每个变量都是定义了三个数组变量,每个变量都是Tdate类型,类型,rdate是对象是对象date1的一个引用,它是的一个引用,它是date1别名别名第15页,此课件共61页哦创建一个具体对象一般有两种方法:创建一个具体对象一般有两种方法:(1)在定义类的同时创建对象)在定
15、义类的同时创建对象class TimeClasspublic:void SetTime(int NewH,int NewM,int NewS);void ShowTime();protected:private:int Hour,Minute,Second;myWatch;第16页,此课件共61页哦(2)在使用时定义对象)在使用时定义对象class TimeClasspublic:void SetTime(int NewH,int NewM,int NewS);void ShowTime();protected:private:int Hour,Minute,Second;TimeClass
16、myWatch;第17页,此课件共61页哦2、访问对象成员、访问对象成员对象也有自己的成员,它就是该对象的类所定义的成员。即对象成员也有数据成员和对象也有自己的成员,它就是该对象的类所定义的成员。即对象成员也有数据成员和成员函数。成员函数。(1)访问对象成员)访问对象成员./用来访问数据成员用来访问数据成员或者或者.()/用来访问成员函数用来访问成员函数(2)用指针访问对象成员)用指针访问对象成员-/用来访问数据成员用来访问数据成员-()/用来访问成员函数用来访问成员函数或者或者(*)./用来访问数据成员用来访问数据成员(*).()/用来访问成员函数用来访问成员函数(3)用引用传递访问对象成员
17、)用引用传递访问对象成员./用来访问数据成员用来访问数据成员或者或者.()/用来访问成员函数用来访问成员函数第18页,此课件共61页哦注意:注意:上面只是访问对象成员的语法形式,对象中上面只是访问对象成员的语法形式,对象中的保护(的保护(protected)成员和私有)成员和私有(private)成员不允许被非成员函数直接)成员不允许被非成员函数直接访问,这称为类的封装性。访问,这称为类的封装性。“.”和和“:”的不同,的不同,“.”用于对象与成用于对象与成员之间,员之间,“:”用于类与其成员之间。用于类与其成员之间。第19页,此课件共61页哦例例3.3 将例将例3.1的类定义部分包含进来,的
18、类定义部分包含进来,成为一个完整的程序成为一个完整的程序#include “iostream.h”#include “tdate.h”void main()Tdate date1,date2;date1.SetDate(1996,8,5);date2.SetDate(1998,1,20);int leap=date1.IsLeapYear();coutleapendl;date1.print();date2.print();程序输出结果程序输出结果11996.8.5 1998.1.20其中,其中,1表示表示1996年是闰年。年是闰年。第20页,此课件共61页哦3.3 对象的初始化对象的初始化对
19、象的数据成员可以通过成员函数为其赋值。对象的数据成员可以通过成员函数为其赋值。而在对象定义时也要进行对象的初始化。而在对象定义时也要进行对象的初始化。C+是通过构造函数和析构函数进行对象是通过构造函数和析构函数进行对象初始化的。初始化的。第21页,此课件共61页哦1、构造函数和析构函数、构造函数和析构函数构造函数和析构函数都是类的成员函数,但它们是构造函数和析构函数都是类的成员函数,但它们是特殊的成员函数,不用调用便自动执行,而且这些特殊的成员函数,不用调用便自动执行,而且这些函数的名字与类的名字有关。函数的名字与类的名字有关。创建对象时都要调用构造函数(包括默认构造函数)。创建对象时都要调用
20、构造函数(包括默认构造函数)。构造函数的工作是建立对象的基本结构,进行数据初始构造函数的工作是建立对象的基本结构,进行数据初始化。执行构造函数体中的代码。化。执行构造函数体中的代码。当一个对象退出其作用域时,都要调用析构函数。析当一个对象退出其作用域时,都要调用析构函数。析构函数的工作是:执行析构函数中的代码,将对象占构函数的工作是:执行析构函数中的代码,将对象占据的存储空间归还系统,做公共及用户要求的善后工据的存储空间归还系统,做公共及用户要求的善后工作。作。第22页,此课件共61页哦构造函数和析构函数的特点:构造函数和析构函数的特点:都没有返回值说明,即定义构造函数和析构函数时不需指出都没
21、有返回值说明,即定义构造函数和析构函数时不需指出类型。类型。它们不能被继承。它们不能被继承。和大多数和大多数C+函数一样,构造函数可以有缺省参数。函数一样,构造函数可以有缺省参数。析构函数可以是虚的(析构函数可以是虚的(virtual),但构造函数不行。),但构造函数不行。不可取它们的地址。不可取它们的地址。不能用常规调用方法调用构造函数;当使用完全的限定名(带对不能用常规调用方法调用构造函数;当使用完全的限定名(带对象名、类名和函数名)时可以调用析构函数。象名、类名和函数名)时可以调用析构函数。当定义对象时,编译程序自动调用构造函数;当删除对象时,编当定义对象时,编译程序自动调用构造函数;当
22、删除对象时,编译程序自动地调用析构函数。译程序自动地调用析构函数。第23页,此课件共61页哦(1)构造函数)构造函数构构造造函函数数是是一一种种用用于于创创建建对对象象特特殊殊的的成成员员函函数数,当当创创建建对对象象时时,系系统统自自动动调调用用构构造造函函数数,不不能能在在程程序序中中直直接接调调用用。构构造造函函数数名名与与类类名名相相同同,一一个个类类可可以以拥拥有有多多个个构构造造函函数数(重重载载),构构造造函函数数可可以以有有任任意意类类型型的的参参数数,但但不不能能具具有有返回类型。返回类型。构造函数的作用是:为对象分配空间;对数据成员赋初值;构造函数的作用是:为对象分配空间;
23、对数据成员赋初值;请求其他资源。请求其他资源。使用构造函数的限制:不能被继承,不能说明为虚使用构造函数的限制:不能被继承,不能说明为虚函数,不能显式调用,不能取构造函数的地址。函数,不能显式调用,不能取构造函数的地址。第24页,此课件共61页哦默认构造函数:默认构造函数:如如果果一一个个类类没没有有定定义义构构造造函函数数,编编译译器器会会自自动动生生成成一一个个不不带带参参数数的的默默认认构构造造函函数数,其格式如下:其格式如下::()()在程序中定义一个对象而没有指明初始化在程序中定义一个对象而没有指明初始化时,编译器便按默认构造函数来初始化该时,编译器便按默认构造函数来初始化该对象。对象
24、。第25页,此课件共61页哦2、析构函数、析构函数当当一一个个对对象象消消失失,或或用用new创创建建的的对对象象用用delete删删除除时时,由由系系统统自自动动调调用用类类的的析析构构函函数数。析析构构函函数数名名字字为为符符号号“”加加类类名名,析析构构函函数数没没有有参参数数和和返返回回值值。一一个个类中只可能定义一个析构函数,所以析构函数不能重载。类中只可能定义一个析构函数,所以析构函数不能重载。析析构构函函数数是是用用于于取取消消对对象象成成员员函函数数,当当一一个个对对象象作作用用域域结束时,系统自动调用析构函数。结束时,系统自动调用析构函数。析构函数的作用是进行清除对象,释放内
25、存等。析构函数的作用是进行清除对象,释放内存等。当当对对象象超超出出其其定定义义范范围围时时(即即释释放放该该对对象象时时),编编译译器器自自动动调调用用析析构构函函数数。在在以以下下情情况况下下,析析构构函函数数也会被自动调用:也会被自动调用:第26页,此课件共61页哦在以下情况下,析构函数也会被自动调用:在以下情况下,析构函数也会被自动调用:(1)如如果果一一个个对对象象被被定定义义在在一一个个函函数数体体内内,则则当当这这个个函函数数结结束时,该对象的析构函数被自动调用。束时,该对象的析构函数被自动调用。(2)若一个对象是使用)若一个对象是使用new运算符动态创建的,在使用运算符动态创建
26、的,在使用delete运运算符释放它时,算符释放它时,delete将会自动调用析构函数。将会自动调用析构函数。如如同同默默认认构构造造函函数数一一样样,如如果果一一个个类类没没有有定定义义析析构构函函数数,编编译译器器会会自动生成一个默认析构函数,其格式如下:自动生成一个默认析构函数,其格式如下::()()默认析构函数是一个空函数。默认析构函数是一个空函数。第27页,此课件共61页哦例:下面重新定义一个日期类例:下面重新定义一个日期类TDate1,并将其,并将其放在放在tdate1.h文件中文件中 class TDate1public:TDate1(int y,int m,int d);TDa
27、te1();void Print();private:int year,month,day;TDate1:TDate1(int y,int m,int d)year=y;month=m;day=d;cout”Constructor called.n”;TDate1:TDate1()cout”Destructor call.n”;void TDate1:Print()coutyear”.”month”.”dayendl;第28页,此课件共61页哦例例3.4#include#include“tdate1.h”void main()TDate1 today(1997,4,20),tomorrow(1
28、998,3,6);/定义时直接初始化,由构造函数获得实参的值定义时直接初始化,由构造函数获得实参的值 cout”today is“;today.Print();cout”tomrrow is“;tomorrow.Print();第29页,此课件共61页哦例例3.4的运行结果的运行结果Constructor called.Constructor calledToday is 1997.4.20tomorrow is 1998.3.6Destructor call.Destructor call.第30页,此课件共61页哦3、构造函数和析构函数的执行顺序、构造函数和析构函数的执行顺序构造函数的执行
29、次序是先遇到哪个构造函数,构造函数的执行次序是先遇到哪个构造函数,就执行哪个。就执行哪个。析构函数的执行次序恰好和构造函数相反。析构函数的执行次序恰好和构造函数相反。例例3.5 第31页,此课件共61页哦4、缺省参数的构造函数、缺省参数的构造函数前面介绍的是带参数的构造函数,在定义对象时必前面介绍的是带参数的构造函数,在定义对象时必须给带参数的构造函数传递参数,否则构造函数将须给带参数的构造函数传递参数,否则构造函数将不被执行。但在有些构造函数的使用中,只有特别不被执行。但在有些构造函数的使用中,只有特别的情况需要传递参数,一般都使用缺省值。因为在的情况需要传递参数,一般都使用缺省值。因为在构
30、造函数中允许指定函数参数的缺省值,这被定义构造函数中允许指定函数参数的缺省值,这被定义的缺省值在函数调用者不确定参数时可以作为参数的缺省值在函数调用者不确定参数时可以作为参数来使用。来使用。缺省参数可以是一个或一个以上,若有一个以上的缺省缺省参数可以是一个或一个以上,若有一个以上的缺省参数,其用法和前面介绍的函数的缺省参数用法一样。参数,其用法和前面介绍的函数的缺省参数用法一样。第32页,此课件共61页哦例例:class set int elems100;int size;int card;public:set(int i=16);/含有缺省参数的构造函数含有缺省参数的构造函数 :;void
31、main()set s1(64);set s2(16);set s3(8);set s4;:S1对象的私有成员对象的私有成员size取值取值64S2对象的私有成员对象的私有成员size取值取值16S3对象的私有成员对象的私有成员size取值取值8S4对象的私有成员对象的私有成员size取值取值16第33页,此课件共61页哦5、多构造函数、多构造函数前面介绍的构造函数都是在一个类中只有一前面介绍的构造函数都是在一个类中只有一个的情况,但是,有时在一个类中可以有个的情况,但是,有时在一个类中可以有几个构造函数,每个都去适应不同的场合,几个构造函数,每个都去适应不同的场合,这些函数之间以它们所带参数
32、的个数或类这些函数之间以它们所带参数的个数或类型的不同区分。这种情况也称为重载构造型的不同区分。这种情况也称为重载构造函数。函数。另外,使用缺省参数的构造函数时,要注意另外,使用缺省参数的构造函数时,要注意避免二义性。避免二义性。第34页,此课件共61页哦例例:有一个类有一个类x,它有四个不同的构造函数:,它有四个不同的构造函数:class x /public:x();x(int);x(int,char);x(float,char);/;main()x a;/调用无参构造函数调用无参构造函数 x b(1);/调用一个参数的构造函数调用一个参数的构造函数 x c(1,c);/调用第三个构造函数调
33、用第三个构造函数 x d(3.5,d);/调用第四个构造函数调用第四个构造函数第35页,此课件共61页哦6、拷贝构造函数、拷贝构造函数拷贝构造函数是一种特殊的构造函数。首先,拷贝构造函数是一种特殊的构造函数。首先,它是一个构造函数,当创建一个新对象时,它是一个构造函数,当创建一个新对象时,系统自动调用它;其次,它的特殊功能是系统自动调用它;其次,它的特殊功能是将参数代表的对象逐域拷贝到新创建的对将参数代表的对象逐域拷贝到新创建的对象中。即象中。即用一个已有对象初始化一个正在用一个已有对象初始化一个正在建立的同类对象。建立的同类对象。拷贝构造函数的定义有两种形式:系统产拷贝构造函数的定义有两种形
34、式:系统产生和用户定义。生和用户定义。第36页,此课件共61页哦(1)系统产生)系统产生系统具有为类产生一个缺省的拷贝构造函数的功能,只要使用即可。系统具有为类产生一个缺省的拷贝构造函数的功能,只要使用即可。例例#include“iostream.h”class point int x,y;public:point(int vx,int vy)x=vx;y=vy;void print()coutx“yendl;/;void main()point p1(10,20);/定义一个定义一个point类对象类对象p1 point p2(p1);/定义一个定义一个point类对象类对象p2。调用的是系
35、统缺省的拷贝构造函数,将。调用的是系统缺省的拷贝构造函数,将p1对象对象的各个域的值都拷贝给了的各个域的值都拷贝给了p2对象相应的域;因此对象相应的域;因此p2对象的数据成员的值与对象的数据成员的值与p1对象的相同。对象的相同。p1.print();p2.print();第37页,此课件共61页哦(2)用户定义)用户定义可以在类定义中定义一个拷贝构造函数。可以在类定义中定义一个拷贝构造函数。当构造函数的参数为自身类的引用时,这当构造函数的参数为自身类的引用时,这个构造函数称为用户定义的拷贝构造函数。个构造函数称为用户定义的拷贝构造函数。格式为:格式为:类名类名:类名类名(const 类名类名&
36、对象名对象名)第38页,此课件共61页哦例例例例3.63.6:把用户定义的拷贝构造函数加入到上例中:把用户定义的拷贝构造函数加入到上例中:把用户定义的拷贝构造函数加入到上例中:把用户定义的拷贝构造函数加入到上例中#include“iostream.h”class point int x,y;public:point(int vx,int vy)x=vx;y=vy;point(const point&p)x=p.x;y=p.y;void print()coutx“yX=X;this-Y=Y;this-H=H;this-W=w;private:int X,Y,H,W;/类中成员数据类中成员数据第5
37、5页,此课件共61页哦 设计拷贝构造函数时,可以简化其函数设计拷贝构造函数时,可以简化其函数体设计体设计例如:例如:class Windowpublic:Window(Window&Win)X=Win.X;Y=Win.Y;H=Win.H;W=Win.W;/可简化为可简化为*this=Win;private:int X,Y,H,W;注意:此法不适合带有指针型成员数据的类。注意:此法不适合带有指针型成员数据的类。例例3.8 完整程序完整程序 第56页,此课件共61页哦 保证对象的每一个成员函数能够访问其保证对象的每一个成员函数能够访问其对应的成员数据对应的成员数据利用利用this指针能保证对象的每
38、一个成员函指针能保证对象的每一个成员函数能够访问其对应的成员数据,从而使数能够访问其对应的成员数据,从而使C+中的各个对象具有自己的数据成员空中的各个对象具有自己的数据成员空间,同时共用同一个成员函数代码的机制间,同时共用同一个成员函数代码的机制得以实现(因为每当成员函数被调用时,得以实现(因为每当成员函数被调用时,未加以强制说明的成员数据是由未加以强制说明的成员数据是由this指针指针指向的,而指向的,而this指针又自动指向该成员函指针又自动指向该成员函数所属的类的对象,当然此成员数据即为数所属的类的对象,当然此成员数据即为同一对象的成员数据)。同一对象的成员数据)。第57页,此课件共61
39、页哦例:例:Window winA,winB;winA.GetX()return X;或或 return this-X;或或 return winA.X;win B.Get()return X;或或 return this-X;或或 return winB.X;第58页,此课件共61页哦 在成员函数中检测出接受成员函数调用的对象是谁,在成员函数中检测出接受成员函数调用的对象是谁,在成员函数中检测出接受成员函数调用的对象是谁,在成员函数中检测出接受成员函数调用的对象是谁,由此可根据不同的对象实现不同的行为由此可根据不同的对象实现不同的行为由此可根据不同的对象实现不同的行为由此可根据不同的对象实现
40、不同的行为例例3.9:#include stdafx.h#include iostream.hclass Windowpublic:Window(int vx,int vy,int vh,int vw)X=vx;Y=vy;H=vh;W=vw;void CopyWindow(Window&WinObj)if(this!=&WinObj)/在程序内检测源对象和目标对象是否为同一个对象在程序内检测源对象和目标对象是否为同一个对象X=WinObj.X;Y=WinObj.Y;H=WinObj.H;W=WinObj.W;coutX Y H Wendl;private:int X,Y,H,W;void ma
41、in()Window WinA(10,10,300,300),WinB(20,20,200,200);WinA.CopyWindow(WinA);/因为自己拷贝自己,无意义因为自己拷贝自己,无意义WinA.CopyWindow(WinB);/拷贝的源对象应该为另一个对象拷贝的源对象应该为另一个对象第59页,此课件共61页哦3.6 类对象作为成员类对象作为成员C+中,类对象常常可以作为另一个类的中,类对象常常可以作为另一个类的成员。使用对象成员着重要注意的问题是成员。使用对象成员着重要注意的问题是一个类的内部初始化问题。一个类的内部初始化问题。例:例:p75例例第60页,此课件共61页哦3.7 对象数组对象数组C+中中,可可以以创创建建对对象象数数组组,对对象象数数组组是是指指每每一一个个数数组组元元素素都都是是对对象象的的数数组组。为为了了创建对象数组,构造函数的形式必须是:创建对象数组,构造函数的形式必须是:使用默认构造函数;使用默认构造函数;若若有有用用户户自自定定义义构构造造函函数数,则则必必须须含含有有一一个个不不带带参参数数或或具具有有一一个个带带默默认认参参数数的的构构造造函函数数,因因为对象数组被创建时无法对构造函数传递参数。为对象数组被创建时无法对构造函数传递参数。第61页,此课件共61页哦
限制150内