课件2013届期末笔试范围2类和对象_第1页
课件2013届期末笔试范围2类和对象_第2页
课件2013届期末笔试范围2类和对象_第3页
课件2013届期末笔试范围2类和对象_第4页
课件2013届期末笔试范围2类和对象_第5页
已阅读5页,还剩100页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、C+C+程序设计程序设计2 2类和对象类和对象n 面向对象程序设计面向对象程序设计n 类与对象概述类与对象概述n 类类n 类的声明类的声明n 类的定义类的定义n 对象对象n 对象的声明与成员访问对象的声明与成员访问n 实例化对象实例化对象n 对象的存储对象的存储n thisthis指针指针* * * * * * * *n 类和对象的简单应用举例类和对象的简单应用举例提纲提纲面向过程面向过程 VS. 面向对象程序设计面向对象程序设计面向过程程序设计面向过程程序设计n研究过程研究过程n是一种数学思维或计是一种数学思维或计算机思维方法,与人算机思维方法,与人们认识世界的方法不们认识世界的方法不同。同

2、。n主要是理解算法的处主要是理解算法的处理思想和过程。理思想和过程。面向对象程序设计面向对象程序设计n研究对象研究对象n是建立在认识方法学基是建立在认识方法学基础上的一项技术科学,础上的一项技术科学,比较自然地模拟了人类比较自然地模拟了人类认识客观世界的方式;认识客观世界的方式;n主要是理解主要是理解“构件或组构件或组件件”及其及其“组装组装”的思的思想和过程。想和过程。面向过程程序设计面向过程程序设计n 传统的程序设计方法传统的程序设计方法- -面向过程程序设计的步骤为:面向过程程序设计的步骤为:n 对具体应用问题进行详细的功能分析,然后将问题分解成对具体应用问题进行详细的功能分析,然后将问

3、题分解成若干个可实现的功能模块;若干个可实现的功能模块;n 根据功能块的功能来设计一系列与功能相适宜的数据,即根据功能块的功能来设计一系列与功能相适宜的数据,即设计设计“数据结构数据结构”; n 编写一些过程或函数实现对这些数据所进行的操作;编写一些过程或函数实现对这些数据所进行的操作; n 最终的应用程序就是由这些过程或函数以及数据结构所组最终的应用程序就是由这些过程或函数以及数据结构所组成。成。n 下面,我们举一个实例来进一步讨论面向过程的程下面,我们举一个实例来进一步讨论面向过程的程序设计方法。序设计方法。n考虑一个银行系统。该系统允许顾客开设考虑一个银行系统。该系统允许顾客开设不同类型

4、的银行账户,其中包括现金账户不同类型的银行账户,其中包括现金账户、支票账户和贷款账户,同时允许顾客存、支票账户和贷款账户,同时允许顾客存款、取款和转账。款、取款和转账。n n 根据面向过程的思想,首先将银行系统进根据面向过程的思想,首先将银行系统进行功能分析,然后分解成三个模块分别负行功能分析,然后分解成三个模块分别负责存款、取款和转账三项工作。假设这三责存款、取款和转账三项工作。假设这三个过程是个过程是 MakeDeposit、WithDraw和和Transfer。 第二步就是对客户建立一个数据结构:第二步就是对客户建立一个数据结构: struct account char name; /*

5、姓名姓名*/ unsigned long accounted; / *账号账号* / float balance; / *余额余额* / float interestYTD; /*年利息年利息* / char accountType; /*账户类型账户类型(现金、支票和贷款现金、支票和贷款) * /; 第三步就是对所需要的操作进行代码编制。第三步就是对所需要的操作进行代码编制。void MakeDeposit( float amount) float WithDraw(float amount) void Transfer(float amount , unsigned long BankAc

6、count) q 面向过程程序设计的特点:面向过程程序设计的特点:q 显著特点是数据结构和数据处理过程处于分离状态,这显著特点是数据结构和数据处理过程处于分离状态,这会带来很多弊病:会带来很多弊病:q 一、和现实需求不吻合:一、和现实需求不吻合:q 任何一个现实实体任何一个现实实体(对象对象)应该都具有自己的职能,应该都具有自己的职能,比如飞机可以飞行,银行可以存款、取款;食堂应该可以比如飞机可以飞行,银行可以存款、取款;食堂应该可以卖饭等,而这些功能与具体的客观实体卖饭等,而这些功能与具体的客观实体(对象对象)是密不可分是密不可分的。的。q 面向过程的程序设计方法就将对象分成了两部分:面向过

7、程的程序设计方法就将对象分成了两部分:一部分就是一部分就是“数据数据”,表示了一个对象的属性;另外一部,表示了一个对象的属性;另外一部分就是分就是“过程或函数过程或函数”,表示了对象具有的功能。这种分,表示了对象具有的功能。这种分离显然会带来许多的弊病。比如:离显然会带来许多的弊病。比如:n 顾客与他们的银行帐户没有一定的联系。因为此时顾客对计算顾客与他们的银行帐户没有一定的联系。因为此时顾客对计算机来说,只不过是一串字符或数字,它根本不知道那个数字代机来说,只不过是一串字符或数字,它根本不知道那个数字代表银行帐户,更不用说哪个帐户是谁的,帐户的内容是什么。表银行帐户,更不用说哪个帐户是谁的,

8、帐户的内容是什么。这显然和实际的情况不符合的。这显然和实际的情况不符合的。n 这说明面向过程程序设计中,无论是飞机或银行这说明面向过程程序设计中,无论是飞机或银行 在计算机中在计算机中都是一些类似的数字,即一个对象进入计算机后全部程序员无都是一些类似的数字,即一个对象进入计算机后全部程序员无条件的分解成一堆数据,然后通过程序员编制的一个叫条件的分解成一堆数据,然后通过程序员编制的一个叫“程序程序”的东西进行重建恢复。的东西进行重建恢复。n 另外考虑数据结构发生改变会产生什么样的结果:另外考虑数据结构发生改变会产生什么样的结果:n 比如比如Account_typeAccount_type数据项,

9、原来只有现金、支票和贷款数据项,原来只有现金、支票和贷款三种取值,程序只能识别这三种取值。由于帐户类型的不同,三种取值,程序只能识别这三种取值。由于帐户类型的不同,编写存款等过程时,将以不同的操作代码与之对应,即对于现编写存款等过程时,将以不同的操作代码与之对应,即对于现金、支票和贷款这三种不同类型的帐户,其取款过程都是不同金、支票和贷款这三种不同类型的帐户,其取款过程都是不同的。的。 n 如果要增加一种帐户类型如果要增加一种帐户类型“退休帐户退休帐户”,原来的程序肯定,原来的程序肯定会出错。因为原来的程序只考虑了以上三种帐户的情况,会出错。因为原来的程序只考虑了以上三种帐户的情况,也就是说每

10、增加一种类型的帐户就必须修改重新修改程序也就是说每增加一种类型的帐户就必须修改重新修改程序代码,可见其维护成本是相当大的。代码,可见其维护成本是相当大的。n 以上简单地分析了面向过程在程序的直观性和维护性方以上简单地分析了面向过程在程序的直观性和维护性方面的缺陷。面的缺陷。n 面向过程程序设计方法,把问题被着作一系面向过程程序设计方法,把问题被着作一系列将被完成的任务,如读、计算和打印等,许多函数用于列将被完成的任务,如读、计算和打印等,许多函数用于完成这些任务。问题的焦点集中于函数。下图显示了一个完成这些任务。问题的焦点集中于函数。下图显示了一个典型的面向过程的程序结构。典型的面向过程的程序

11、结构。下图显示了一个典型的面向过程的程序结构下图显示了一个典型的面向过程的程序结构面向对象程序设计面向对象程序设计面向对象程序设计方法的主要出发点是把数据看作程序开发中的基本元面向对象程序设计方法的主要出发点是把数据看作程序开发中的基本元素,并且不允许它在系统中自由流动,将数据和操作这些数据的函数素,并且不允许它在系统中自由流动,将数据和操作这些数据的函数紧紧结合在紧紧结合在 一起。一起。面向对象程序设计是将应用问题分解为一系列客观实体面向对象程序设计是将应用问题分解为一系列客观实体(对象对象),然后围绕,然后围绕这些对象建立数据和函数,如图所示。这些对象建立数据和函数,如图所示。一个对象的数

12、据不能访问其他对象的函数,而一个对象的函一个对象的数据不能访问其他对象的函数,而一个对象的函数可以访问其他对象的函数。面向对象程序设计的一些显数可以访问其他对象的函数。面向对象程序设计的一些显著特性包括以下几个方面:著特性包括以下几个方面: 程序设许的重点在于数据而不是过程;程序设许的重点在于数据而不是过程;程序被划分为所谓的对象;程序被划分为所谓的对象;数据结构为表现对象的特性而设计;数据结构为表现对象的特性而设计; 函数作为对某个对象数据的操作,与数据结构紧密地结合在函数作为对某个对象数据的操作,与数据结构紧密地结合在一起;一起;数据被隐藏起来,不能被外部函数访问;数据被隐藏起来,不能被外

13、部函数访问; 对象之间可以通过函数沟通。对象之间可以通过函数沟通。 (4)对象的行为会改变对象的状态。)对象的行为会改变对象的状态。 例如:例如: 玩耍玩耍 疲劳疲劳=True 睡觉睡觉 疲劳疲劳=False 吃食吃食 饥饿饥饿=False(5)对象的状态会影响对象的行为。)对象的状态会影响对象的行为。例如:例如: if( 饥饿饥饿 = False) 吃食吃食 return failure对象对象(1)对象就是我们周围的各种各样的事物。)对象就是我们周围的各种各样的事物。例如:例如: 衣服、盘子、宠物、朋友、电脑等。衣服、盘子、宠物、朋友、电脑等。(2)每个对象都有一些状态(属性)。)每个对象

14、都有一些状态(属性)。例如:例如:衣服:衣服:颜色,长度,面料颜色,长度,面料。猫:猫: 名字,情绪,饥饿,名字,情绪,饥饿,。(3)有些对象会作出一些行为。)有些对象会作出一些行为。例如:例如:猫:猫: 情绪,疲劳,饥饿情绪,疲劳,饥饿 发怒,玩耍,吃食,睡觉发怒,玩耍,吃食,睡觉。 面向对象的程序设计与我们人类观察客观事物的模式相同:面向对象的程序设计与我们人类观察客观事物的模式相同: 用类表示客观事物,用类表示客观事物, 用类中的变量表示事物的属性,用类中的变量表示事物的属性, 用函数表示事物的行为,用函数表示事物的行为, 属性与行为相互作用。属性与行为相互作用。1、关于、关于“大学生大

15、学生”的有关说明的有关说明 (1)描述学生特征的信息(属性)描述学生特征的信息(属性): 姓名,学号,专业,年龄,性别姓名,学号,专业,年龄,性别 (2)描述行为的信息(函数)描述行为的信息(函数): 一个学生主要是学习,而学习主要的行为就是:一个学生主要是学习,而学习主要的行为就是: 读;写读;写 对于读对于读,要指明读的什么书,读书所获得的内容是什么?但这里不能用一具体要指明读的什么书,读书所获得的内容是什么?但这里不能用一具体的书名的书名 对于写对于写,要指明做的什么作业,所完成的具体内容是什么?但不能用具体的课要指明做的什么作业,所完成的具体内容是什么?但不能用具体的课程名称程名称.

16、通过以上两方面,就较准确的描述大学生的有关信息,可以说,这种描述使通过以上两方面,就较准确的描述大学生的有关信息,可以说,这种描述使用于所有的大学生,实际上就是说明了一类人员用于所有的大学生,实际上就是说明了一类人员大学生。大学生。为此,我们可以给出为此,我们可以给出“大学生类大学生类”的一个的一个“规范规范”的描述形式:的描述形式: class students private: string XM; int XH; string ZY; int NL; string XB; public: string read(String SM); string write(String KCMC);

17、 students(String x,int y,String z,int a, String b); /用于创建一个学生用于创建一个学生(构造函数构造函数) (3)对于下面的两个问题如何来描述呢对于下面的两个问题如何来描述呢? 张三正在读英语张三正在读英语; 李四正在做数学作业李四正在做数学作业;在这里,张三和李四必须是学生,我们用在这里,张三和李四必须是学生,我们用A代代表张三,表张三,B代表李四代表李四(张三和李四的具体信息应清楚张三和李四的具体信息应清楚:学号,专业、年学号,专业、年龄、性别是什么?龄、性别是什么?),english代表英语,代表英语,maths代表数学,代表数学,那么

18、:那么:从迈向从迈向struct TComplex double real; double imag;void Init( double r, double i);void Tstorage_Init( TStorage *p );void Tstorage_Clear( Tstorage *p );q 例例2.1 q struct TComplexq double real; /复数的实部复数的实部q double imag; /复数的虚部复数的虚部q void Init(double r,double i) /给给real和和imag赋初值赋初值q real=r; imag=i;q dou

19、ble RealComplex( ) /求复数的实部值求复数的实部值q return real; q double ImagComplex() /求复数的虚部值求复数的虚部值q return imag; q ;n 为了访问这些成员函数,必须定义该结构类型的为了访问这些成员函数,必须定义该结构类型的变量,然后像访问结构中的数据成员一样进行访变量,然后像访问结构中的数据成员一样进行访问。问。#include #include Using namespace std;void main( ) plex A; A.init (1.1,2.2); coutreal of complex A= plex(

20、)endl; coutimag of complex A= plex()endl;“类类”是对具有共同的属性特征和行为特征的对象的概括和抽是对具有共同的属性特征和行为特征的对象的概括和抽象象因此类和对象的关系是抽象和具体的关系,类是由多个对象因此类和对象的关系是抽象和具体的关系,类是由多个对象进行综合抽象的结果,对象又是类的个体实物。进行综合抽象的结果,对象又是类的个体实物。 从面向对象程序设计的观点看,一个对象是由描述其属性从面向对象程序设计的观点看,一个对象是由描述其属性的数据和定义在其上面的一组操作组成的实体,是数据单的数据和定义在其上面的一组操作组成的实体,是数据单元和函数单元的组合体

21、;类是对一组对象的概括和抽象,元和函数单元的组合体;类是对一组对象的概括和抽象,这组对象具有相同的属性结构和操作行为,类的定义中一这组对象具有相同的属性结构和操作行为,类的定义中一定要说明这些属性结构和操作行为。定要说明这些属性结构和操作行为。 C+对对C的改进,最重要的就是增加了的改进,最重要的就是增加了“类类”这样一种数据类这样一种数据类型。类型。类(class)不但是不但是C+最重要的特征,也是最重要的特征,也是C+的精华,的精华,它可以将一个数据结构与一个操作紧密地结合起来。它可以将一个数据结构与一个操作紧密地结合起来。 C+中声明一个中声明一个“类类”类型,其方法和声明一个结构体类型

22、类型,其方法和声明一个结构体类型是相似的。是相似的。2.2.1 结构体与类结构体与类 结构体是结构体是C语言的一种自定义的数据类型,在结构体语言的一种自定义的数据类型,在结构体中可以含有各种不同类型的成员。中可以含有各种不同类型的成员。C+语言对结构类型进语言对结构类型进行了扩充,它不仅可以含有不同类型的成员,而且还可以行了扩充,它不仅可以含有不同类型的成员,而且还可以含有函数。例如下面声明的的结构体:含有函数。例如下面声明的的结构体:在在C+中,一个结构的成员中,一个结构的成员(包括数据和函数包括数据和函数)通常分为两类:私有成员通常分为两类:私有成员(private)和公有和公有成员成员(

23、public)。私有成员只能被该结构中的其它成员访问,私有成员只能被该结构中的其它成员访问,公有成员既可被结构内其它成员访问,也可公有成员既可被结构内其它成员访问,也可被结构外的其它部分访问。被结构外的其它部分访问。1 类的定义格式:类的定义格式:class 类名类名public : 成员数据成员数据; 成员函数;成员函数; protected:成员数据成员数据;成员函数;成员函数;private : 成员数据成员数据; 成员函数;成员函数;;关键字关键字类名类名私有私有公有公有保护保护class Student public : float average; void SetName(cha

24、r *name); void SetMath(float math); float GetAverage(void); void SetChinese(float ch);private : char Name20; float Math; float Chinese;分号不能少分号不能少类的成员类的成员:成员函数、成员数据成员函数、成员数据class Clock public: void SetTime(int NewH, int NewM, int NewS); void ShowTime(); private: int Hour, Minute, Second;成员数据成员数据成员函数成

25、员函数成员函数外部实现成员函数外部实现void Clock:SetTime(int NewH, int NewM, int NewS) Hour=NewH; Minute=NewM; Second=NewS;void Clock:ShowTime() coutHour:Minute: char szName5 如果如果szName 不是私有,需要修改全部:不是私有,需要修改全部: strcpy( man1.szName, “Tom123” );如果将如果将szName变为私有变为私有, 所有对所有对szName的访问都是通过成员函数来进行,的访问都是通过成员函数来进行, man1.SetNam

26、e( “Tom123” );类成员访问控制表类成员访问控制表访问控制访问控制含义含义属属 性性public公有成员公有成员类的外部接口类的外部接口protected保护成员保护成员仅允许本类成员函数及派生类仅允许本类成员函数及派生类成员函数访问成员函数访问private私有成员私有成员仅允许本类成员函数访问仅允许本类成员函数访问v实际上,在实际上,在C+中,类中,类class和结构和结构struct是类似的,它们的主要区别是缺省值不同:是类似的,它们的主要区别是缺省值不同:在类中,缺省时成员是私有的;而在结构在类中,缺省时成员是私有的;而在结构中,缺省时成员是公有的。中,缺省时成员是公有的。n

27、 数据成员可以是任何数据类型,但是不能用自动数据成员可以是任何数据类型,但是不能用自动(auto)、寄存器寄存器(register)或外部或外部(extern)进行说明。进行说明。n 不能在类的声明中给数据成员赋初值。不能在类的声明中给数据成员赋初值。n 例如:例如:n class abcn private:n char a=q; n int b=33; n public: n n /错误错误/错误错误成员函数的实现成员函数的实现n 两种实现方式两种实现方式:n 成员函数的类外实现成员函数的类外实现n 内联成员函数内联成员函数在类体外定义成员函数的格式:在类体外定义成员函数的格式:void A

28、:Setxy(float a,float b) x=a; y=b; 函数类型函数类型类名类名函数名函数名形参列表形参列表函数体函数体返回值类型返回值类型 类名类名:成员函数名成员函数名(参数表参数表) 函数体函数体 class A private: float x, y; public: void Setxy(float a,float b); void Print(void);;/类定义类定义, Point.hclass Point public: void InitPoint(float PointA_x=0, float PointA_y=0); void Move(float New_

29、x, float New_y); float GetPointx(); float GetPointy();private: float P1_x,P1_y;/成员函数的类外实现成员函数的类外实现,point.cpp void Point:InitPoint(float PointA_x, float PointA_y) P1_x=PointA_x; P1_y=PointA_y; void Point:Move(float New_x, float New_y) P1_x+=New_x; P1_y+=New_y; float Point:GetPointx() return P1_x; flo

30、at Point:GetPointy() return P1_y; 函数的实现函数的实现函数声明函数声明成员函数的类外实现:成员函数的类外实现:内联函数内联函数n为什么要内联函数为什么要内联函数n内联函数的定义形式内联函数的定义形式n内联函数注意事项内联函数注意事项内联函数内联函数-为什么要内联函数为什么要内联函数例:例:int min( int v1, int v2 ) return ( v1 v2 ? v1:v2 );使用这个函数有什么好处?使用这个函数有什么好处?使用这个函数有什么缺点?使用这个函数有什么缺点?内联函数内联函数-为什么要内联函数为什么要内联函数C语言中的宏定义语言中的宏定

31、义#define MIN(a, b) (a)=b ? 0 : 1nif( FLOOR(a&0 x0f, 0 x07) ) /n宏展开:宏展开:if( a&0 x0f=0 x07?0:1 )n宏在类内宏在类内nclass X nint i; npublic:n#define VAL(x:i) /Error内联函数的定义形式内联函数的定义形式n非类的函数非类的函数ninline int plusone( int x ) return +x; n类的成员函数类的成员函数n在类体中,直接给出函数定义在类体中,直接给出函数定义n在类外时,使用在类外时,使用inline关键字关键字内联函数

32、举例内联函数举例(一一)class Point public: void Init(int initX,int initY) X=initX; Y=initY; int GetX() return X; int GetY() return Y; private: int X,Y;函数在声明的同函数在声明的同时,给出实现时,给出实现内联成员函数举例内联成员函数举例(二二)class Point public: void Init(int initX,int initY); int GetX(); int GetY(); private: int X,Y;只声明函数只声明函数inline void

33、 Point: Init(int initX,int initY) X=initX; Y=initY;inline int Point:GetX() return X;inline int Point:GetY() return Y;50在类外实现,但需要添在类外实现,但需要添加关键字加关键字“inline”,表示是内联函数表示是内联函数class Point public: void InitPoint(float PointA_x=0, float PointA_y=0) P1_x=PointA_x; P1_y=PointA_y; void Move(float New_x, float

34、New_y) P1_x+=New_x; P1_y+=New_y; float GetPointx() return P1_x; float GetPointy() return P1_y; private: float P1_x,P1_y;函数在声明的同函数在声明的同时,给出实现时,给出实现内联函数内联函数-注意事项注意事项n没有在类体中定义的内联成员函数必须被定没有在类体中定义的内联成员函数必须被定义在类定义出现的头文件中。义在类定义出现的头文件中。n对于较简单的函数可以声明为内联形式。对于较简单的函数可以声明为内联形式。n内联函数体中不要有复杂结构内联函数体中不要有复杂结构n(如循环语句和

35、(如循环语句和switch语句)。语句)。对象对象v对象的定义对象的定义v声明类的同时,直接定义对象声明类的同时,直接定义对象v例如:例如: vclass CPoint vv private:v int x, y; v public:v void SetXY( int, int );v int GetX();v int GetY();v op1,op2;vCPoint op1,op2; 类中成员的访问方式类中成员的访问方式n 类中成员互访类中成员互访n 直接使用成员名直接使用成员名n 类外访问:类外访问:n 访问访问 public 属性的成员,有属性的成员,有3种方法种方法n 通过对象名和成员

36、运算符(通过对象名和成员运算符(“.”)访问对象中的成员)访问对象中的成员n 通过指向对象的指针访问对象中的成员通过指向对象的指针访问对象中的成员n 通过对象的引用来访问对象中的成员通过对象的引用来访问对象中的成员n 外部访问外部访问 private 属性的成员,有属性的成员,有2种方法种方法n 1、通过公有成员函数为私有成员赋值、通过公有成员函数为私有成员赋值n 2、友元函数、友元函数访问访问 public 属性的成员,有属性的成员,有3种方法种方法:通过对象名和成员运算符(通过对象名和成员运算符(“.”)访问对象中)访问对象中的成员:的成员:A.x;通过指向对象的指针访问对象中的成员通过指

37、向对象的指针访问对象中的成员: p-x;通过对象的引用来访问对象中的成员通过对象的引用来访问对象中的成员 B.x;回忆结构体成员访问方式回忆结构体成员访问方式(1)通过对象名和成员运算符访问对象中的成员)通过对象名和成员运算符访问对象中的成员void main() CPoint p1; p1. Init(8,100); coutp1. GetX()p1.GetY();圆点访问形式圆点访问形式:对象名对象名.公有成员公有成员class CPoint public: void Init(int a,int b) X=a; Y=b; int GetX() return X; int GetY() r

38、eturn Y; private: int X,Y;p1.GetX()实际上是一种缩写形实际上是一种缩写形式,它表达的意义是式,它表达的意义是p1.Point:GetX(),这两种表达,这两种表达式是等价的。式是等价的。n 用成员选择运算符用成员选择运算符“.”只能访问对象只能访问对象的公有成员,而不能访问对象的私有的公有成员,而不能访问对象的私有成员或保护成员。成员或保护成员。n 若要访问对象的私有的数据成员,只若要访问对象的私有的数据成员,只能通过对象的公有成员函数来获取。能通过对象的公有成员函数来获取。 class A float x,y;public: float m,n; void

39、Setxy( float a, float b ) x=a; y=b; void Print(void) coutxtyendl; ;void main(void) A a1,a2; a1.m=10; a1.n=20; /为公有成员数据赋值为公有成员数据赋值 a1.x=2; a1.y=5; a1.Setxy(2.0,5.0); a1.Print();必须通过类内公有函必须通过类内公有函数访问私有数据成员数访问私有数据成员非法,私有成员非法,私有成员不能在类外访问不能在类外访问class Timepublic: int hour; int minute;void main() Time t,*p

40、; p=&t; couthour;指针访问形式指针访问形式: 对象指针变量名对象指针变量名-公有成员公有成员class A private: float x,y; public:float Sum(void) return x+y; void Set(float a,float b) x=a; y=b; void Print(void) coutx=xty=ySet(2.0, 3.0); /通过指针引用对象的成员函数通过指针引用对象的成员函数 p-Print(); coutSum()endl; a2.Set(10.0, 20.0); a2.Print();Setxy()Getxy()P

41、rintxy()xy2.03.0pa1定义类的数组及数组中元素的引用定义类的数组及数组中元素的引用void main(void)Stu stu3;/定义类的数组定义类的数组Stu *pstu;/定义类的指针定义类的指针pstu=stu;/为指针赋值为指针赋值int i;stu0.SetStudent (“A”,90,90); /通过数组元素的引用赋值通过数组元素的引用赋值stu1.SetStudent (B,80,80);stu2.SetStudent (C,70,70);for(i=0;iShow (); /指针变量指向数组元素指针变量指向数组元素pstu+; /指针变量加一,指向下一元素指

42、针变量加一,指向下一元素stupstupstu3 通过对象的引用来访问对象中的成员通过对象的引用来访问对象中的成员class Timepublic: int hour; int minute;void main() Time t1; Time &t2=t1; coutt2.hour;由于由于t1和和t2公用一公用一个空间,因此,个空间,因此, t2.hour就是就是t1.hour引用就是变量的另外一个名字引用就是变量的另外一个名字类的对象外部如何引用私有数据成员类的对象外部如何引用私有数据成员1. 通过公有函数操作私有成员赋值通过公有函数操作私有成员赋值2. 友元函数友元函数1、通过公

43、有函数为私有成员赋值、通过公有函数为私有成员赋值class Test int x , y; public: void Setxy(int a, int b)x=a; y=b; void Printxy(void) coutx=xty=yendl;void main(void) Test p1,p2; p1.Setxy(3, 5); p1.Printxy( );调用公有函数为调用公有函数为私有对象赋值私有对象赋值对象的存储对象的存储(cont.)对象对象1对象对象2对象对象10. 成员函数成员函数data1data2data10对象的存储方式:对象的存储方式:实例化对象:对象的存储实例化对象:对

44、象的存储(cont.)C+中怎么查看对象所占内存空间大小?中怎么查看对象所占内存空间大小?this指针指针class CPoint public: void Init(int a,int b) X=a; Y=b; int GetX() return X; int GetY() return Y; private: int X,Y;void main() CPoint p1, p2; p1.Init( 2, 3 ); coutp1.GetX()p1.GetY(); p2.Init( -2, -3); coutp2.GetX()p2.GetY();输出是什么?输出是什么?这些成员函数是如何区分操作

45、对象这些成员函数是如何区分操作对象是是p1 和和 p2的?的?对比结构体对比结构体struct TPoint int X,Y;void Init( TPoint &p, int x, int y ) p.X = x; p.Y = y;void main() TPoint p1, p2; Init( P1, 2, 3 ); coutp1.Xp1.Y; Init( p2, -2, -3); coutp2.XX=a; this-Y=b; int GetX() return this-X; int GetY() return this-Y; private: int X,Y;void main

46、() CPoint p1, p2; p1.Init( 2, 3 ); coutp1.GetX()p1.GetY(); p2.Init( -2, -3); coutp2.GetX() X=a ; this-Y = b; 在在main()函数中,成员函数函数中,成员函数Init(int a, int b)调用形式调用形式 p1.Init ( 2, 3 );this指针指针C+把类对象作为参数传把类对象作为参数传递给函数递给函数(传地址传地址)。this指针指针this指针指针 成员函数所属对象的指针。它指向成员函数所属对象的指针。它指向类对象的地址。它隐含于每个类的成员函数类对象的地址。它隐含于每

47、个类的成员函数中。也就是每个成员函数都有一个中。也就是每个成员函数都有一个this指针。指针。成员函数访问类中数据成员的格式可以写成:成员函数访问类中数据成员的格式可以写成: this-成员变量成员变量this指针举例指针举例class CAint i;public: void Hello() cout“Hello”endl; void Show() coutiHello(); p-Show();编译会怎么样?编译会怎么样?运行会怎么样?运行会怎么样?this 指针何时使用指针何时使用n 返回类对象本身返回类对象本身n CPoint & CPoint:Show()n n coutXY;

48、n return *this;n n 在拷贝在拷贝/赋值函数中,作为对象判断赋值函数中,作为对象判断n void CPoint:copy( const CPoint & obj )n n if ( this ! = &obj )n n 类的定义应用举例类的定义应用举例2、面向对象的概念、面向对象的概念类的定义应用举例类的定义应用举例(1)问题:给出一个矩形类的定义。问题:给出一个矩形类的定义。分析:通过抽象分析,找出描述该类的属性和方法:分析:通过抽象分析,找出描述该类的属性和方法:(1)成员属性:)成员属性:一提到矩形,首先想到矩形的长和宽,因而其中成员一提到矩形,首先想到矩

49、形的长和宽,因而其中成员属性有:属性有:边的长度:(实型数)边的长度:(实型数)边的宽度:(实型数)边的宽度:(实型数)如果要关心矩形的位置,则需要抽象出举行左上角顶如果要关心矩形的位置,则需要抽象出举行左上角顶点的坐标值,则需要增加下列成员属性:点的坐标值,则需要增加下列成员属性:x坐标值:坐标值: (实型数)(实型数)y坐标值:坐标值: (实型数)(实型数) 2、面向对象的概念、面向对象的概念类的定义应用举例类的定义应用举例(2)(2)成员方法:)成员方法: 对于矩形,说道计算问题,我们就会立对于矩形,说道计算问题,我们就会立即想到矩形的周长、面积,因而成员方法即想到矩形的周长、面积,因而

50、成员方法有:有: 计算矩形的周长:计算矩形的周长: (计算的结果(数值为实(计算的结果(数值为实型),作为函数值返回)型),作为函数值返回)计算矩形的面积:计算矩形的面积: (计算的结果(数值为实(计算的结果(数值为实型),作为函数值返回)型),作为函数值返回)另外:另外: 有时需要移动矩形的位置,按水平和垂直方向移到新的位置;有时需要移动矩形的位置,按水平和垂直方向移到新的位置; 有时需要改变矩形的长度和改变矩形的宽度;有时需要改变矩形的长度和改变矩形的宽度; 有时需要得到(获取)矩形的实际长度值和宽度值;有时需要得到(获取)矩形的实际长度值和宽度值; 有时需要,在显示器上显示矩形的属性值;

51、有时需要,在显示器上显示矩形的属性值; 需要构造方法来形成矩形(由顶点、长度、宽度形成矩形)需要构造方法来形成矩形(由顶点、长度、宽度形成矩形)因而需要再有的成员方法:因而需要再有的成员方法:移动矩形的位置:(需要水平和垂直方向的移到量)移动矩形的位置:(需要水平和垂直方向的移到量)改变矩形的长度改变矩形的长度改变矩形的宽度改变矩形的宽度获取矩形的长度获取矩形的长度获取矩形的宽度获取矩形的宽度显示矩形的属性值(显示矩形的属性值(4项)项)构造方法(需要构造方法(需要4个参数)个参数)2、面向对象的概念、面向对象的概念类的定义应用举例类的定义应用举例(3)根据以上的抽象分析,可以给出矩形类定义:

52、根据以上的抽象分析,可以给出矩形类定义:class rectangle private: double L; /边的长度边的长度 double W; /边的宽度边的宽度 double X; /顶点的坐标顶点的坐标, x坐标值坐标值, double Y; /顶点的坐标顶点的坐标, y坐标值坐标值 public: double perimeter() /计算矩形的周长计算矩形的周长 double area() /计算矩形的面积计算矩形的面积 void move (double a ,double b) /移动矩形到新位置移动矩形到新位置 double getL() /获取矩形的长度获取矩形的长度

53、double getW() /获取矩形的宽度获取矩形的宽度 double setL(double a ) /改变矩形的长度为新值改变矩形的长度为新值 double setW(double a ) /改变矩形的宽度为新值改变矩形的宽度为新值 void show() /显示矩形的属性值(显示矩形的属性值(4项)项) rectangle (double a,double b, double c,double d) /构造方法(构造方法(4个参数)个参数)每个函数是如何实现的呢每个函数是如何实现的呢?2、面向对象的概念、面向对象的概念类的定义应用举例类的定义应用举例(4)根据以上的抽象分析,可以给出矩

54、形的根据以上的抽象分析,可以给出矩形的JAVA类定义:类定义:class rectangle private: double L; /边的长度边的长度 double W; /边的宽度边的宽度 double X; /顶点的坐标顶点的坐标, x坐标值坐标值, double Y; /顶点的坐标顶点的坐标, y坐标值坐标值 public: double perimeter() /计算矩形的周长计算矩形的周长 double area() /计算矩形的面积计算矩形的面积 void move (double a ,double b) /移动矩形到新位置移动矩形到新位置 double getL() /获取矩形

55、的长度获取矩形的长度 double getW() /获取矩形的宽度获取矩形的宽度 double setL(double a ) /改变矩形的长度为新值改变矩形的长度为新值 double setW(double a ) /改变矩形的宽度为新值改变矩形的宽度为新值 void show() /显示矩形的属性值(显示矩形的属性值(4项)项) rectangle (double a,double b, double c,double d) /构造方法(构造方法(4个参数个参数 double perimeter() double p; p=(L+W)*2; return p;2、面向对象的概念、面向对象的

56、概念类的定义应用举例类的定义应用举例(5)根据以上的抽象分析,可以给出矩形的根据以上的抽象分析,可以给出矩形的JAVA类定义:类定义:class rectangle private: double L; /边的长度边的长度 double W; /边的宽度边的宽度 double X; /顶点的坐标顶点的坐标, x坐标值坐标值, double Y; /顶点的坐标顶点的坐标, y坐标值坐标值 public: double perimeter() /计算矩形的周长计算矩形的周长 double area() /计算矩形的面积计算矩形的面积 void move (double a ,double b) /

57、移动矩形到新位置移动矩形到新位置 double getL() /获取矩形的长度获取矩形的长度 double getW() /获取矩形的宽度获取矩形的宽度 double setL(double a ) /改变矩形的长度为新值改变矩形的长度为新值 double setW(double a ) /改变矩形的宽度为新值改变矩形的宽度为新值 void show() /显示矩形的属性值(显示矩形的属性值(4项)项) rectangle (double a,double b, double c,double d) /构造方法(构造方法(4个参数个参数double area() double s; s=L*W

58、; return s;2、面向对象的概念、面向对象的概念类的定义应用举例类的定义应用举例(6)根据以上的抽象分析,可以给出矩形的根据以上的抽象分析,可以给出矩形的JAVA类定义:类定义:class rectangle private: double L; /边的长度边的长度 double W; /边的宽度边的宽度 double X; /顶点的坐标顶点的坐标, x坐标值坐标值, double Y; /顶点的坐标顶点的坐标, y坐标值坐标值 public: double perimeter() /计算矩形的周长计算矩形的周长 double area() /计算矩形的面积计算矩形的面积 void m

59、ove (double a ,double b) /移动矩形到新位置移动矩形到新位置 double getL() /获取矩形的长度获取矩形的长度 double getW() /获取矩形的宽度获取矩形的宽度 double setL(double a ) /改变矩形的长度为新值改变矩形的长度为新值 double setW(double a ) /改变矩形的宽度为新值改变矩形的宽度为新值 void show() /显示矩形的属性值(显示矩形的属性值(4项)项) rectangle (double a,double b, double c,double d) /构造方法(构造方法(4个参数个参数 vo

60、id move (double a,double b) X=X+a; Y=Y+b;2、面向对象的概念、面向对象的概念类的定义应用举例类的定义应用举例(7)根据以上的抽象分析,可以给出矩形的根据以上的抽象分析,可以给出矩形的JAVA类定义:类定义:class rectangle class rectangle private: double L; /边的长度边的长度 double W; /边的宽度边的宽度 double X; /顶点的坐标顶点的坐标, x坐标值坐标值, double Y; /顶点的坐标顶点的坐标, y坐标值坐标值 public: double perimeter() /计算矩形的周长计算矩形的周长 double area() /计算矩形

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论