C++程序设计课件:2 类和对象

上传人:hs****ma 文档编号:570096333 上传时间:2024-08-01 格式:PPT 页数:105 大小:1.19MB
返回 下载 相关 举报
C++程序设计课件:2 类和对象_第1页
第1页 / 共105页
C++程序设计课件:2 类和对象_第2页
第2页 / 共105页
C++程序设计课件:2 类和对象_第3页
第3页 / 共105页
C++程序设计课件:2 类和对象_第4页
第4页 / 共105页
C++程序设计课件:2 类和对象_第5页
第5页 / 共105页
点击查看更多>>
资源描述

《C++程序设计课件:2 类和对象》由会员分享,可在线阅读,更多相关《C++程序设计课件:2 类和对象(105页珍藏版)》请在金锄头文库上搜索。

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

2、们认识世界的方法不们认识世界的方法不们认识世界的方法不们认识世界的方法不同。同。同。同。nn主要是理解算法的处主要是理解算法的处主要是理解算法的处主要是理解算法的处理思想和过程理思想和过程理思想和过程理思想和过程。面向对象程序设计面向对象程序设计n研究对象研究对象n是建立在认识方法学基是建立在认识方法学基础上的一项技术科学,础上的一项技术科学,比较自然地模拟了人类比较自然地模拟了人类认识客观世界的方式;认识客观世界的方式;n主要是理解主要是理解“构件或组构件或组件件”及其及其“组装组装”的思的思想和过程。想和过程。面向过程程序设计面向过程程序设计n传统的程序设计方法传统的程序设计方法- -面向

3、过程程序设计的步骤为:面向过程程序设计的步骤为:对具体应用问题进行详细的功能分析,然后将问题分解成对具体应用问题进行详细的功能分析,然后将问题分解成若干个可实现的若干个可实现的功能模块功能模块;根据功能块的功能来设计一系列与功能相适宜的数据,即根据功能块的功能来设计一系列与功能相适宜的数据,即设计设计“数据结构数据结构”; 编写一些编写一些过程过程或或函数函数实现对这些数据所进行的实现对这些数据所进行的操作操作; 最终的最终的应用程序应用程序就是由这些就是由这些过程过程或函数以及数据结构所组或函数以及数据结构所组成。成。 下面,我们举一个实例来进一步讨论面向过程的程序下面,我们举一个实例来进一

4、步讨论面向过程的程序设计方法。设计方法。n考虑一个银行系统。该系统允许顾客开设不考虑一个银行系统。该系统允许顾客开设不同类型的银行账户,其中包括现金账户、支同类型的银行账户,其中包括现金账户、支票账户和贷款账户,同时允许顾客存款、取票账户和贷款账户,同时允许顾客存款、取款和转账。款和转账。 根据面向过程的思想,首先将银行系统进行根据面向过程的思想,首先将银行系统进行功能分析,然后分解成功能分析,然后分解成三个模块三个模块分别负责分别负责存存款款、取款取款和和转账转账三项工作。假设这三个过程三项工作。假设这三个过程是是 MakeDeposit、WithDraw和和Transfer。 第二步就是对

5、客户建立一个第二步就是对客户建立一个数据结构数据结构: struct account char name; /*姓名姓名*/ unsigned long accounted; / *账号账号* / float balance; / *余额余额* / float interestYTD; /*年利息年利息* / char accountType; /*账户类型账户类型(现金、支票和贷款现金、支票和贷款) ) * /; 第三步就是对所需要的第三步就是对所需要的操作操作进行代码进行代码编制编制。void MakeDeposit( float amount) float WithDraw(float

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

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

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

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

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

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 struct TComplex double real; /复数的实部复数的实部 double imag; /复数的虚部复数的虚部 void Init(double r,double i) /给给real和和imag赋初值赋初值 real=r; imag=i; double Rea

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

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

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

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

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

24、id SetName(char *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 n如如果果szName 不是私有,需要修改全部:不是私有,需要修改全部: strcpy( man1.szName, “Tom123” );n如如果将果将szName变为变为私私有有, 所有对所有对szName的访问都是通过成员函数来进行,的访问都是通过成员函数

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

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

28、 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_x, float New

29、_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; float Point:Get

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

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

32、oid 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 Point: Init(int initX,int initY)

33、 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 New_y) P1_x+=New_x; P1_y+=New_y;

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

35、义n声明类的同时,直接定义对象声明类的同时,直接定义对象例如:例如: class CPoint private: int x, y; public: void SetXY( int, int ); int GetX(); int GetY(); op1,op2;nCPoint op1,op2; 类中成员的访问方式类中成员的访问方式n类中成员互访类中成员互访直接使用直接使用成员名成员名n类外访问:类外访问: 访问访问 public 属性的成员,有属性的成员,有3种方法种方法通过通过对象名对象名和和成员运算符(成员运算符(“.”)访问对象中的成员访问对象中的成员通过通过指向对象的指针指向对象的指针

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

37、访问方式回忆结构体成员访问方式(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() return Y; private: int X,Y;p1.GetX()实际上是一种缩写形实际上是一种缩写形式,它表达的意义是式,它

38、表达的意义是p1.Point:GetX(),这两种表达式是等价的。,这两种表达式是等价的。n用成员选择运算符用成员选择运算符“.”只能访问对象只能访问对象的的公有成员公有成员,而,而不能访问对象的私有成不能访问对象的私有成员或保护成员员或保护成员。n 若要访问对象的私有的数据成员,只若要访问对象的私有的数据成员,只能通过对象的公有成员函数来获取。能通过对象的公有成员函数来获取。 class A float x,y;public: float m,n; void Setxy( float a, float b ) x=a; y=b; void Print(void) coutxtyendl; ;

39、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; p=&t; couthour;指针访问形式指针访问形式: 对象指针变量名对象指针变量名-公有成员公有成员class A priva

40、te: 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()Printxy()xy2.03.0pa1定义类的数组及数组中元素的引用定义类的数组及数组中元素的引用void main(void)Stu stu

41、3;/定义类的数组定义类的数组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+; /指针变量加一,指向下一元素指针变量加一,指向下一元素stupstupstu3 通过通过对象的引用对象的引用来访问对象中的成员来访问对象中的成员class Timepubl

42、ic: int hour; int minute;void main() Time t1; Time &t2=t1; coutt2.hour;由于由于t1和和t2公用一公用一个空间,因此,个空间,因此, t2.hour就是就是t1.hour引用就是变量的另外一个名字引用就是变量的另外一个名字类的对象外部如何引用私有数据成员类的对象外部如何引用私有数据成员1. 通过公有函数操作私有成员赋值通过公有函数操作私有成员赋值2. 友元函数友元函数1、通过公有函数为私有成员赋值、通过公有函数为私有成员赋值class Test int x , y; public: void Setxy(int a, int

43、 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对象的存储方式:对象的存储方式:实例化对象:对象的存储实例化对象:对象的存储(cont.)C+中怎么查看对象所占内存空间大小?中怎么查看对象所占内存空间大小?this指针指针class CPoint public: v

44、oid 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();输出是什么?输出是什么?这些成员函数是如何区分操作对象这些成员函数是如何区分操作对象是是p1 和和 p2的?的?对比结构体对比结构体struct TPoint int X,Y;void Init( T

45、Point &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() CPoint p1, p2; p1.Init( 2, 3 ); coutp1.GetX()p1.GetY(); p2.Init( -2, -3); co

46、utp2.GetX() X=a ; this-Y = b; 在在main()函数中,成员函数函数中,成员函数Init(int a, int b)调用形式调用形式 p1.Init ( 2, 3 );this指针指针C+把类对象作为参数传递把类对象作为参数传递给函数给函数(传地址传地址)。this指针指针this指指针针 成成员员函函数数所所属属对对象象的的指指针针。它它指指向向类类对对象象的的地地址址。它它隐隐含含于于每每个个类类的的成成员员函函数数中中。也就是每个成员函数都有一个也就是每个成员函数都有一个this指针。指针。成员函数访问类中数据成员的格式可以写成:成员函数访问类中数据成员的格式

47、可以写成: this-成员变量成员变量this指针举例指针举例class CAint i;public: void Hello() cout“Hello”endl; void Show() coutiHello(); p-Show();编译会怎么样?编译会怎么样?运行会怎么样?运行会怎么样?this 指针何时使用指针何时使用n返回类对象本身返回类对象本身CPoint & CPoint:Show() coutXY; return *this;n在拷贝在拷贝/赋值函数中,作为对象判断赋值函数中,作为对象判断void CPoint:copy( const CPoint & obj ) if ( th

48、is ! = &obj ) 类的定义应用举例类的定义应用举例2、面向对象的概念、面向对象的概念类的定义应用举例类的定义应用举例(1)问题:给出一个矩形类的定义。问题:给出一个矩形类的定义。分析:通过抽象分析,找出描述该类的属性和方法:分析:通过抽象分析,找出描述该类的属性和方法:(1)成员)成员属性属性:一提到矩形,首先想到矩形的长和宽,因而其中成员一提到矩形,首先想到矩形的长和宽,因而其中成员属性有:属性有:边的长度:(实型数)边的长度:(实型数)边的宽度边的宽度:(:(实型数)实型数)如果要关心矩形的位置,则需要抽象出举行左上角顶如果要关心矩形的位置,则需要抽象出举行左上角顶点的坐标值,则

49、需要增加下列成员属性:点的坐标值,则需要增加下列成员属性:x坐标值:坐标值: (实型数)(实型数)y坐标值:坐标值: (实型数)(实型数) 2、面向对象的概念、面向对象的概念类的定义应用举例类的定义应用举例(2)(2)成员方法:)成员方法: 对于矩形,说道计算问题,我们就会立对于矩形,说道计算问题,我们就会立即想到矩形的周长、面积,因而成员方法有:即想到矩形的周长、面积,因而成员方法有: 计算矩形的周长计算矩形的周长: (计算的结果(数值(计算的结果(数值为实型),作为函数值返回)为实型),作为函数值返回)计算矩形的面积计算矩形的面积: (计算的结果(数值(计算的结果(数值为实型),作为函数值

50、返回)为实型),作为函数值返回)另外:另外: 有有时需要移动矩形的位置,按水平和垂直方向移到新的位置;时需要移动矩形的位置,按水平和垂直方向移到新的位置; 有有时需要改变矩形的长度和改变矩形的宽度;时需要改变矩形的长度和改变矩形的宽度; 有有时需要得到(获取)矩形的实际长度值和宽度值;时需要得到(获取)矩形的实际长度值和宽度值; 有时需要,在显示器上显示矩形的属性值;有时需要,在显示器上显示矩形的属性值; 需要构造方法来形成矩形(由顶点、长度、宽度形成矩形)需要构造方法来形成矩形(由顶点、长度、宽度形成矩形)因而需要再有的成员方法:因而需要再有的成员方法:移动矩形的位置:(需要水平和垂直方向的

51、移到量)移动矩形的位置:(需要水平和垂直方向的移到量)改变矩形的长度改变矩形的长度改变矩形的宽度改变矩形的宽度获取矩形的长度获取矩形的长度获取矩形的宽度获取矩形的宽度显示矩形的属性值(显示矩形的属性值(4项)项)构造方法(需要构造方法(需要4个参数)个参数)2、面向对象的概念、面向对象的概念类的定义应用举例类的定义应用举例(3)根据以上的抽象分析,可以给出矩形类定义根据以上的抽象分析,可以给出矩形类定义:class rectangle private: double L; /边的长度边的长度 double W; /边的宽度边的宽度 double X; /顶点的坐标顶点的坐标, x坐标值坐标值,

52、 double Y; /顶点的坐标顶点的坐标, y坐标值坐标值 public: double perimeter() /计算矩形的周长计算矩形的周长 double area() /计算矩形的面积计算矩形的面积 void move (double a ,double b) /移动矩形到新位置移动矩形到新位置 double getL() /获取矩形的长度获取矩形的长度 double getW() /获取矩形的宽度获取矩形的宽度 double setL(double a ) /改变矩形的长度为新值改变矩形的长度为新值 double setW(double a ) /改变矩形的宽度为新值改变矩形的宽度

53、为新值 void show() /显示矩形的属性值(显示矩形的属性值(4项)项) rectangle (double a,double b, double c,double d) /构造方法(构造方法(4个参数)个参数)每个函数是如何实现的呢每个函数是如何实现的呢?2、面向对象的概念、面向对象的概念类的定义应用举例类的定义应用举例(4)根据以上的抽象分析,可以给出矩形的根据以上的抽象分析,可以给出矩形的JAVA类定义:类定义:class rectangle private: double L; /边的长度边的长度 double W; /边的宽度边的宽度 double X; /顶点的坐标顶点的坐

54、标, x坐标值坐标值, double Y; /顶点的坐标顶点的坐标, y坐标值坐标值 public: double perimeter() /计算矩形的周长计算矩形的周长 double area() /计算矩形的面积计算矩形的面积 void move (double a ,double b) /移动矩形到新位置移动矩形到新位置 double getL() /获取矩形的长度获取矩形的长度 double getW() /获取矩形的宽度获取矩形的宽度 double setL(double a ) /改变矩形的长度为新值改变矩形的长度为新值 double setW(double a ) /改变矩形的宽

55、度为新值改变矩形的宽度为新值 void show() /显示矩形的属性值(显示矩形的属性值(4项)项) rectangle (double a,double b, double c,double d) /构造方法(构造方法(4个参数个参数 double perimeter() double p; p=(L+W)*2; return p;2、面向对象的概念、面向对象的概念类的定义应用举例类的定义应用举例(5)根据以上的抽象分析,可以给出矩形的根据以上的抽象分析,可以给出矩形的JAVA类定义:类定义:class rectangle private: double L; /边的长度边的长度 doub

56、le W; /边的宽度边的宽度 double X; /顶点的坐标顶点的坐标, x坐标值坐标值, double Y; /顶点的坐标顶点的坐标, y坐标值坐标值 public: double perimeter() /计算矩形的周长计算矩形的周长 double area() /计算矩形的面积计算矩形的面积 void move (double a ,double b) /移动矩形到新位置移动矩形到新位置 double getL() /获取矩形的长度获取矩形的长度 double getW() /获取矩形的宽度获取矩形的宽度 double setL(double a ) /改变矩形的长度为新值改变矩形的

57、长度为新值 double setW(double a ) /改变矩形的宽度为新值改变矩形的宽度为新值 void show() /显示矩形的属性值(显示矩形的属性值(4项)项) rectangle (double a,double b, double c,double d) /构造方法(构造方法(4个参数个参数double area() double s; s=L*W; return s;2、面向对象的概念、面向对象的概念类的定义应用举例类的定义应用举例(6)根据以上的抽象分析,可以给出矩形的根据以上的抽象分析,可以给出矩形的JAVA类定义:类定义:class rectangle private

58、: double L; /边的长度边的长度 double W; /边的宽度边的宽度 double X; /顶点的坐标顶点的坐标, x坐标值坐标值, double Y; /顶点的坐标顶点的坐标, y坐标值坐标值 public: double perimeter() /计算矩形的周长计算矩形的周长 double area() /计算矩形的面积计算矩形的面积 void move (double a ,double b) /移动矩形到新位置移动矩形到新位置 double getL() /获取矩形的长度获取矩形的长度 double getW() /获取矩形的宽度获取矩形的宽度 double setL(d

59、ouble a ) /改变矩形的长度为新值改变矩形的长度为新值 double setW(double a ) /改变矩形的宽度为新值改变矩形的宽度为新值 void show() /显示矩形的属性值(显示矩形的属性值(4项)项) rectangle (double a,double b, double c,double d) /构造方法(构造方法(4个参数个参数 void move (double a,double b) X=X+a; Y=Y+b;2、面向对象的概念、面向对象的概念类的定义应用举例类的定义应用举例(7)根据以上的抽象分析,可以给出矩形的根据以上的抽象分析,可以给出矩形的JAVA类

60、定义:类定义:class rectangle 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() /获取矩形的长度获取矩形的

61、长度 double getW() /获取矩形的宽度获取矩形的宽度 double setL(double a ) /改变矩形的长度为新值改变矩形的长度为新值 double setW(double a ) /改变矩形的宽度为新值改变矩形的宽度为新值 void show() /显示矩形的属性值(显示矩形的属性值(4项)项) rectangle (double a,double b, double c,double d) /构造方法(构造方法(4个参数个参数 double getL() return L;2、面向对象的概念、面向对象的概念类的定义应用举例类的定义应用举例(8)根据以上的抽象分析,可以给

62、出矩形的根据以上的抽象分析,可以给出矩形的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() /获取

63、矩形的长度获取矩形的长度 double getW() /获取矩形的宽度获取矩形的宽度 double setL(double a ) /改变矩形的长度为新值改变矩形的长度为新值 double setW(double a ) /改变矩形的宽度为新值改变矩形的宽度为新值 void show() /显示矩形的属性值(显示矩形的属性值(4项)项) rectangle (double a,double b, double c,double d) /构造方法(构造方法(4个参数个参数 double getW() return W;2、面向对象的概念、面向对象的概念类的定义应用举例类的定义应用举例(9)根据以

64、上的抽象分析,可以给出矩形的根据以上的抽象分析,可以给出矩形的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

65、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 setL(double a) L=a;2、面向对象的概念、面向对象的概念类的定义应用举例类

66、的定义应用举例(10)根据以上的抽象分析,可以给出矩形的根据以上的抽象分析,可以给出矩形的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) /移动矩形到新位置移动

67、矩形到新位置 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 setW(double a ) W=a;2、面向对象的概念、面向

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

69、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个参数个参数 void show() cout“矩形所在的位置

70、顶点矩形所在的位置顶点:(“X“,”Y“)”endl; cout“矩形的长度矩形的长度:”Lendl; cout“矩形的宽度矩形的宽度:”wendl;2、面向对象的概念、面向对象的概念类的定义应用举例类的定义应用举例(12)根据以上的抽象分析,可以给出矩形的根据以上的抽象分析,可以给出矩形的JAVA类定义:类定义:class rectangle private: double L; /边的长度边的长度 double W; /边的宽度边的宽度 double X; /顶点的坐标顶点的坐标, x坐标值坐标值, double Y; /顶点的坐标顶点的坐标, y坐标值坐标值 public: double

71、 perimeter() /计算矩形的周长计算矩形的周长 double area() /计算矩形的面积计算矩形的面积 void move (double a ,double b) /移动矩形到新位置移动矩形到新位置 double getL() /获取矩形的长度获取矩形的长度 double getW() /获取矩形的宽度获取矩形的宽度 double setL(double a ) /改变矩形的长度为新值改变矩形的长度为新值 double setW(double a ) /改变矩形的宽度为新值改变矩形的宽度为新值 void show() /显示矩形的属性值(显示矩形的属性值(4项)项) recta

72、ngle (double a,double b, double c,double d) /构造方法构造方法 rectangle (double a,double b, double c,double d) X=a; Y=b; L=c; W=d;给出类定义的演示程序给出类定义的演示程序:面向对象的概念面向对象的概念 对象的创建和使用对象的创建和使用(举例举例)例例1:类的使用例题类的使用例题(矩形类矩形类的应用的应用) 利用已定义的利用已定义的”矩形类矩形类”,实现有关矩形的运算求实现有关矩形的运算求值值: (1)定义一个矩形实例定义一个矩形实例a,并计算面积周长;并计算面积周长; (2)改变该

73、矩形的长度是原来的)改变该矩形的长度是原来的2倍,再计算面积、倍,再计算面积、周长,并显示有关信息(包括矩形的长、宽);周长,并显示有关信息(包括矩形的长、宽); (3)移动矩形位置,并显示新位置的坐标。)移动矩形位置,并显示新位置的坐标。 (给出演示过程)(给出演示过程)#include” rectangle.h”void main() double A,B; rectangle a(0,0, 10,20); A=a.perimeter(); B=a.area(); cout矩形矩形a的有关信息如下:的有关信息如下:“endl; a.show(); cout矩形矩形a的面积:的面积:“Ben

74、dl; cout矩形矩形a的周长:的周长:“Aendl; double C; C=a.getL(); C=2*C; a.setL(C); cout改变后的矩形改变后的矩形a的有关信息如下:的有关信息如下:“endl; A=a.perimeter(); B=a.area(); cout矩形矩形a的有关信息如下:的有关信息如下:“endl; a.show(); cout矩形矩形a的面积:的面积:“Bendl; cout矩形矩形a的周长:的周长:“Aendl; a.move(20,20); double d,e; d=a.getX(); e=a.getY(); cout矩形矩形a的新坐标:的新坐标:

75、“endl; cout(“d+,“e)“endl; 类定义练习题类定义练习题3、面向对象的概念、面向对象的概念类的定义应用类的定义应用(练习练习6-1) 按照上面例题的分析设计思想按照上面例题的分析设计思想,给出下列两题给出下列两题的类的设计的类的设计: 要求要求: 先给出抽象分析先给出抽象分析,找出类的属性和函数找出类的属性和函数,对于函数要注意返回值对于函数要注意返回值,参数等问题参数等问题: (1)给出关于坐标系中的)给出关于坐标系中的“点点”的类定义;的类定义;1 定义一个日期类,其中日期由年月日组成,该类支持以下操作定义一个日期类,其中日期由年月日组成,该类支持以下操作(1)判断是否

76、是闰年)判断是否是闰年 (年被年被400整除或者被整除或者被4整除同时不被整除同时不被100整除整除)(2)显示日期)显示日期 (3 )获取年月日的值)获取年月日的值2 定义一个平面上的圆类(圆心和半径),该类支持以下操作:定义一个平面上的圆类(圆心和半径),该类支持以下操作:(1)获得圆心和半径)获得圆心和半径(2)分别计算圆的周长、面积)分别计算圆的周长、面积(3 )设置圆心和半径)设置圆心和半径 (4)输出圆的有关信息输出圆的有关信息;再设计主函数再设计主函数,定义对象定义对象,完成有关的输入完成有关的输入计算计算输出输出3 定义一个平面上矩形类(矩形的两个顶点),该类支持以下操作定义一

77、个平面上矩形类(矩形的两个顶点),该类支持以下操作(1)计算矩形的周长和面积)计算矩形的周长和面积 (2)读取、设置矩形的信息)读取、设置矩形的信息4 定义一个学生类,该类封装以下信息和操作定义一个学生类,该类封装以下信息和操作(1)学生的姓名、学号、班级、籍贯)学生的姓名、学号、班级、籍贯(2)显示学生的信息)显示学生的信息(3 )获取学生的各项信息)获取学生的各项信息5 定义直线类,该类封装以下操作:定义直线类,该类封装以下操作: 计算直线的斜率计算直线的斜率3、面向对象的概念、面向对象的概念类的定义应用类的定义应用(练习练习6-2)6 定义课程类,该类封装以下信息定义课程类,该类封装以下

78、信息(1)课程号,课程名,课程学分,开课学期)课程号,课程名,课程学分,开课学期(2)读取、设置各项信息)读取、设置各项信息7 定义三角形类,该类支持以下操作定义三角形类,该类支持以下操作(1)读取、设置三角形的基本信息)读取、设置三角形的基本信息(2)计算三角形的周长)计算三角形的周长8 定义一个类,用于描述一个一元二次方程,并封装以下操作:定义一个类,用于描述一个一元二次方程,并封装以下操作:(1)求解一元二次方程的根)求解一元二次方程的根(2)输出一元二次方程)输出一元二次方程9.银行卡用于储蓄和消费。每张银行卡有唯一的卡号、密码,每张银银行卡用于储蓄和消费。每张银行卡有唯一的卡号、密码

79、,每张银行卡可以查询用户的余额。设计一个银行卡类,该类支持以下操行卡可以查询用户的余额。设计一个银行卡类,该类支持以下操作:作:(1)余额查询,密码修改,存款,取款等)余额查询,密码修改,存款,取款等10 教务处在排课过程中,需要根据学生的数量,是否支持多媒体等教务处在排课过程中,需要根据学生的数量,是否支持多媒体等信息安排教室。设置一个教室类,该类支持以下操作:信息安排教室。设置一个教室类,该类支持以下操作:(1)设置、修改、查询教室的容量)设置、修改、查询教室的容量(2)查询是否支持多媒体)查询是否支持多媒体3、面向对象的概念、面向对象的概念类的定义应用类的定义应用(练习练习6-3) 3、

80、面向对象的概念、面向对象的概念类的定义应用类的定义应用(练习练习6-4)11 日期类结构如下日期类结构如下:class date private : int year, month, day; int weekday; public: date newDate(int x) 要实现的语句要实现的语句; date(形参形参) 要实现的语句要实现的语句; date() 要实现的语句要实现的语句; 要求要求: (1) 实现实现newDate(int x),要求:根据天数(,要求:根据天数(x)计算出新的日期。)计算出新的日期。 (2)实现构造函数。要求:实现两个构造方法实现构造函数。要求:实现两个构

81、造方法,一个是默认的构造函数,默一个是默认的构造函数,默认值为认值为1900.1.1,1(星期一星期一);另一个是带参数的构造函数。另一个是带参数的构造函数。12 已知类已知类A如下:如下:class A private: int *a; int n; public: A(int *x, int y) 要实现的语句要实现的语句; void max( 参数)参数) 要实现的语句要实现的语句; max 方法求出一维数组中最大值及最大值所在的位置。(最大方法求出一维数组中最大值及最大值所在的位置。(最大值不唯一)值不唯一) 3、面向对象的概念、面向对象的概念类的定义应用类的定义应用(练习练习6-5)

82、class student private : Sting name; Sting studentid; int vc, int English, int math; int total; public: student() 要实现的语句要实现的语句; 实现实现calcute,该方法计算每个学生的总,该方法计算每个学生的总成绩及各科的平均成绩成绩及各科的平均成绩.说明:在说明:在students类的构造方法中,对数据成员类的构造方法中,对数据成员a100中数组分量的姓名,学号,三科中数组分量的姓名,学号,三科成绩赋值。个人的总成绩需要在成绩赋值。个人的总成绩需要在calcute方法中计算。平均

83、成绩保留在方法中计算。平均成绩保留在average数数据成员中。据成员中。3 有有如如下下的的定定义义 3、面向对象的概念、面向对象的概念类的定义应用类的定义应用(练习练习6-6)class students private: student a100; student average; public: students() 要实现的语句要实现的语句; void calcute( ) 要实现的语句要实现的语句; 上机作业上机作业圆周率计算圆周率计算思思路路:在在边边长长为为1的的正正方方形形内内部部,以以正正方方形形的的正正中中心心为为圆圆心心画画一一个个半半径径为为r(r0.5)的的圆圆。在

84、在正正方方形形内内进进行行n0次次随随机机投投针针试试验验,假假定定其其中中落落在在圆圆内内的的针针的的数数目目为为n,则则可可得得到到: 研究目的:研究目的:(1)研究)研究n0、r、PI的计算精度之间的的计算精度之间的关系;关系;(2)能否给出合适的)能否给出合适的n0和和r?设计并测试一个用于计算圆周率设计并测试一个用于计算圆周率PI的正方形类的正方形类PISquare。要求:。要求:1.在在PISquare类外定义名为类外定义名为Point的结构体,其的结构体,其成员为成员为 double x 和和 double y , 用于保存一个用于保存一个点的坐标;点的坐标;2.定义定义PISq

85、uare的类成员变量:总点数的类成员变量:总点数n0,圆,圆半径半径r,落入圆内的点数,落入圆内的点数n,最终所计算的,最终所计算的PI值值PIVal;3.定义定义PISquare的数组成员变量:的数组成员变量: Point pts N , 用于保存所有用于保存所有n0个点的坐标(个点的坐标(N为预设的为预设的大的常量,如大的常量,如30000););4.定义定义PISquare的成员函数的成员函数FillPoints (),用于,用于将将0,1*0,1内产生的内产生的n0个随机点填入个随机点填入pts的前的前 n0个元素;个元素;5.定义定义PISquare的成员函数的成员函数CacuInP

86、oints (),用于统计落入圆内的点数用于统计落入圆内的点数n;6.定义定义PISquare的成员函数的成员函数CacuPI(),用于计,用于计算根据算根据 n0 和和 n 计算计算PI;7. 定义定义PISquare的构造函数,完成:的构造函数,完成:7.1 数组数组pts的所有的所有N 个点设初值个点设初值(0, 0);7.2 初始化随机数种子,产生随机数初始化随机数种子,产生随机数10000- 30000之间的随机数之间的随机数n0,同时,同时n=0;7.3 产生单位元内的产生单位元内的n0个随机点,作为数组个随机点,作为数组 pts的前的前n0个元素;个元素;测试:测试: 定义一个定义一个PISquare对象,显示总点数对象,显示总点数n0 、落入单位元内的点数、落入单位元内的点数n 、PI值。值。提问提问1.类和对象的理解类和对象的理解2.类和结构体区别类和结构体区别3.类的成员和成员函数的访问控制限定符类的成员和成员函数的访问控制限定符4.类的成员函数的定义形式类的成员函数的定义形式5.内联函数要求。内联函数要求。6.类的存储形式,查看变量内存大小类的存储形式,查看变量内存大小7.this 指指针针

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号