第九讲面向对象程序设计基础课件

上传人:我*** 文档编号:144715062 上传时间:2020-09-13 格式:PPT 页数:27 大小:48.50KB
返回 下载 相关 举报
第九讲面向对象程序设计基础课件_第1页
第1页 / 共27页
第九讲面向对象程序设计基础课件_第2页
第2页 / 共27页
第九讲面向对象程序设计基础课件_第3页
第3页 / 共27页
第九讲面向对象程序设计基础课件_第4页
第4页 / 共27页
第九讲面向对象程序设计基础课件_第5页
第5页 / 共27页
点击查看更多>>
资源描述

《第九讲面向对象程序设计基础课件》由会员分享,可在线阅读,更多相关《第九讲面向对象程序设计基础课件(27页珍藏版)》请在金锄头文库上搜索。

1、本讲主要内容: 面向对象的基本思想 类和对象概念及举例 属性和方法 类成员的访问控制 构造函数和析构函数 封装、继承、多态,面向对象技术的由来,面向过程的设计方法(结构化程序设计方法)的不足: 功能和数据分离,不符合人们对事物的认识,难以保证数据和功能的相容性 基于模块的设计方法,使软件修改困难 自顶向下的设计方法,限制了软件的可重用性,降低了开发效率,维护困难,面向对象设计方法,把数据和对数据的操作作为一个相互依赖不可分割的整体,符合人们的思维习惯 采用数据抽象和信息隐蔽技术,使问题简单化 有助于控制软件的复杂性,提高软件的生产效率,其他程序设计方法,面向过程的设计方法:在科学计算中仍有其优

2、势 面向逻辑的设计方法:人工智能 面向规则的设计方法:专家系统,类,类是对象的符号表示形式。类描述组成对象的属性、方法和事件等。 类通常同时包含定义和实现,但它也可以包含没有实现的一个或多个成员。 类的概念类似于面向过程程序开发中的数据类型(结构)概念。,C+类声明,class Rectangle private: int a,b; public: int Square() return a*b; int Girth() return 2*(a+b); void Assign(int x,int y) a=x; b=y; ;,定义了一个类,名为Rectangle 类中包含了两个私有成员(属性)

3、a,b,分别为长方型的长和宽。 类中包含了三个成员函数(方法),分别计算长方形的周长、面积和为a,b赋值。 private表示a,b只能在类内部使用。 public表示表示三个函数可以在类外被调用,类Rectangle包含了长方形的静态特征长和宽,类似结构,还可以包含更多的属性,类型可各不相同。 类Rectangle也包含了长方形的行为特征(成员函数),周长和面积的计算。 类中的方法可以在类外定义,如:,class Rectangle private: int a,b; public: int Square(); int Girth(); void Assign(int x,int y); ,

4、int Rectangle:Square() return a*b; int Rectangle:Girth() return 2*(a+b); void Rectangle:Assign(int x,int y) a=x; b=y; ,对象object,类描述对象的“结构”,而对象则是类的可用“实例”。每个实例都是其类的一个精确而又不同的副本。所以创建对象的动作就称为“实例化”。 一个类也可以用于根据需要创建多个对象。类也可以通过封装来控制用户对对象项的访问。 对象的概念类似面向过程程序设计中的变量概念。,举例:对上例中定义的类的应用,void main() Rectangle aRecta

5、ngle;/声明了一个名为aRectangle对象 aRectangle.Assign(2,2);/为该对象的私有成员a,b赋值,即 /aRectangle.a=2;aRectangle.b=2 coutaRectangle.Square()endl;/调用该对象Square方法,输出该对象/的面积 类是一个抽象概念,而对象是具体的实例。类就如同人的抽象概念,人都具有共同的外部特征和行为特征,就象类的属性和方法,而对一个具体的人,就是一个人的实例,他自然具有人都具有共同的外部特征和行为特征。,private和public成员,class Rectangle public: int a,b; i

6、nt Square() return a*b; int Girth() return 2*(a+b); ;,修改上述程序:把a,b也定义成public,则可以不需要Assign方法:,void main() Rectangle r; r.a=2; /在类外访问public r.b=2;/属性a和b。 coutr.Square(); ,下面是使用指向对象的指针创建并使用对象:,void main() Rectangle *r; r=new Rectangle(); r-a=2; r-b=2; coutSquare(); 对指针,必须先创建对象,后使用该对象。 对指针指向对象成员的访问类似结构指针

7、,用符号-。,建立一个三角型类(TriAngle):,字段:三条边长 方法: 计算面积Area 计算周长Girth 计算三个内角InteralAngle 判断三角型类型(是等腰BothSame,是等边AllSame还是直角RightTriAngle三角形 是钝角obtuse三角形还是锐角sharp三角形。,面向对象的特征之一:封装,“封装”是包含和控制访问一组关联项的能力。类提供一个最通用的方式来封装项。封装使您可以将 类中的数据和过程作为一个单元来使用。您可以同时处理多个对象而不会混淆,因为每个对象都由该类的一个唯一实例来表示。 封装还使您可以控制如何使用数据和过程。可以使用访问修饰符(如

8、Private 或 Protected)来防止外部过程执行类方法或读取与修改属性和字段中的数据。,面向对象的特征之一:封装,应当将类的内部详细信息声明为 Private 以防止在类外使用它们,此技术称为“数据隐藏”。 隐藏类的实现详细信息可以防止这些信息被以不希望的方式使用。,例:关于封装,上例中可以在Rectangle中定义 public int a,b;则在Main中可以用R.a和R.b访,无法通过类内部机制对a,b的合法性控制。 定义private int a,b;可以防止外部程序修改字段a,b,而通过Assign对字段a,b赋值可以对字段值地合法性进行检查。 上述思路对类方法同样适用。

9、,构造函数,为类中特殊的成员函数,在声明该类对象或新建该类对象时被调用。 构造函数与类同名,并且没有返回类型,包括void。 构造函数可以包含参数。,例:使用构造函数重写Rectangle类,#include class Rectangle private: int a,b; public: Rectangle(int x,int y ) a=x; b=y; int Square() return a*b; int Girth() return 2*(a+b); ;,void main() /Rectangle r(2,2);/使用对象 Rectangle *r; /使用指针 r=new Re

10、ctangle(2,2); /coutSquare(); 在定义对象或新建对象时,通过构造函数把参数值传递给属性。 定义构造函数参数可以指定缺省值。Rectangle(int x=3,int y=7),则定义对象时可以不使用参数,参数值取缺省值。,析构函数,析构函数为类中特殊的成员函数,其函数名规定为类名请加。 析构函数在对象消亡时被自动调用。 析构函数没有返回类型,也不能有参数。 析构函数一般包含对在对象生存期内申请的资源进行释放的程序。,面向对象的特征之二:继承,类使你可以定义封装一组相关项的数据类型。然而与结构不同的是,类可以继承和扩展其他类的特性。 作为新类的基础的类称为“基类”。从基

11、类派生的类称为“派生类”。 派生类继承基类中定义的属性、方法和事件。这就意味着可以开发和调试类一次,然后将其作为其他类的基础重复使用。,例:建立一个正方型形的类,实现面积和周长及其内接圆面积的计算。,#include class Rectangle public: int a,b; Rectangle(int x=3,int y=4 ) a=x; b=y; public: int Area() return a*b; int Girth() return 2*(a+b); ;,class Square:public Rectangle/公有继承Rectangle public: Square(

12、int x):Rectangle(x,x) /调用父类构造函数 double InCircleArea() return 3.14*(a/2)*(a/2); ; void main() Square r(2); cout正方形面积:r.Area(); cout内接圆面积:r.InCircleArea(); 调用了基类(父类)的Area()成员函数。,补充:Protected成员,Protected成员,只能被类内部和其派生类访问。,继承的种类,public派生:继承而来的成员访问权限不变。 protected派生:继承而来的成员访问权限public和protected都变成protected。

13、 private派生:继承而来的成员访问权限都变成private。,例:建立三角形,等腰三角型到等腰直角三角形的类继承关系,等腰三角形继承三角型类 只需要已知两条边长。 判断是否为直角等腰三角形(方法的重写) 计算面积(方法的重写) 直角等腰三角形继承等腰三角形类 只需要已知一条直角边长。 计算面积(方法的重写),面向对象的特征之三:多态,静态多态-函数重载:基于不同的参数列表,同一个函数名字可以指向不同的函数定义。 函数重载中具体调用什么函数在编译时就已经确定。 动态多态-允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方

14、式运作。 动态多态实现是在执行过程中,函数重载,#include int max(int x,int y) couty?x:y; float max(float x,float y) couty?x:y; ,void main() int a,b; float c,d; cinab; coutcd; coutmax(c,d)endl; 1 2 integer:2 1 2 Float:2,如程序中要写两个函数,分别计算圆面积和正方形面积,函数名可 取同名Area。,动态多态,#include #define PI 3.14 class Shape public: /下面定义一个虚拟函数 virt

15、ual float Area()return 0; ; class Square:public Shape int a; public: Square(int x) a=x; float Area() return (float)a*a; ; class Circle:public Shape public: int r; Circle(int x)r=x; float Area() return (float)PI*r*r; ;,bool IsLarger(Shape 基类中定义的虚拟函数成员,使得可以用指向基类的指针或引用来调用函数。即调用IsLarge(c,s)时,当运行其中的if(a.

16、Area()b.Area()时,实际调用的不是shape中的Area,而是Square和Circle中的Area。 尝试把virtual去除,则调用的都将是Shape中的Area,始终输出“正方形面积大于圆面积。” 。 上例使用了对象引用,也可以使用对象指针实现多态,但不能使用对象变量。,使用对象指针,bool IsLarger(Shape *a,Shape *b) if(a-Area()b-Area() return true; else return false; void main() Circle c(2);/Circle c=new Circle(2); Square s(2);/Square s=new Square(2); if(IsLarger( ,使用对象变量,bool IsLarger(Shape a,Shape b) if(a.Area()b.Area() return true; else return false; void main() Circ

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

最新文档


当前位置:首页 > 办公文档 > PPT模板库 > PPT素材/模板

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