面向对象技术.ppt
《面向对象技术.ppt》由会员分享,可在线阅读,更多相关《面向对象技术.ppt(67页珍藏版)》请在三一办公上搜索。
1、面向对象技术,赵长宽东北大学计算中心电话:87602地址:辽宁省沈阳市和平区文化路3号巷11号电子邮件:,程序设计基础系列课程程序设计技术,前期课程:高级语言程序设计后期课程:计算机软件技术基础,教学内容,多态性打破封装-静态成员、友元高级代码重用-函数模板和类模板STL模板,继承实现派生类直接使用继承类的成员变量和函数(属性和方法)。是一种重用机制,即派生类具有继承类的所有的特征。多态性是之相同的行为在派生类中具有不同的形态。例如几何图形中,定义基类Shape,其中三角(Triangle)、矩形(Rectangle)、圆(Circle)均是此Shape的派生类,所有的类均有Draw方法,但是
2、Draw方法的具体实现不同。,多态性与继承,Triangle,Circle,Rectangle,现需要编译一个绘图Painter用于绘制图形,能够绘制所有图形。,class Painter public:void draw(Shape,多态性实现了通过继承类的对象的引用,调用派生类对象方法的机制,虚函数指在继承类中声明,但是没有定义的函数,需要在派生类中定义的函数。实质为函数指针,虚函数,声明语法:普通虚函数:Virtual 函数类型 函数名称(函数参数);纯虚函数:Virtual 函数类型 函数名称(函数参数)=0;,区别:普通虚函数允许在继承类中有定义,而纯虚函数没有。,现需要编译一个绘图
3、Painter用于绘制图形,能够绘制三角(Triangle)、矩形(Rectangle)、圆(Circle)等图形。,虚函数-案例,定义如下类:Painter(绘图板)Shape(图形对象基类)Triangle(三角,派生于Shape)Rectangle(矩形,派生于Shape)Circle(圆派生于Shape),Painter用于绘制图形,能够绘制三角(Triangle)、矩形(Rectangle)、圆(Circle)等图形。,Painter-案例,class Painter public:void draw(ShapePainter:Painter()Painter:Painter(),v
4、oid Painter:draw(Shape,Shape是图形的基类,派生了三角(Triangle)、矩形(Rectangle)、圆(Circle)等图形类。,Shape-案例,class Shape public:int id;public:Shape();Shape(int id);virtual Shape();public:/*纯虚函数*/virtual void draw()=0;/*虚函数 打印对象基本信息*/virtual void print();,Shape:Shape():id(0)Shape:Shape(int id)this-id=id;Shape:Shape()voi
5、d Shape:print()coutShape Objectthisendl;coutId:idendl;,Shape是图形的基类,派生了三角(Triangle)、矩形(Rectangle)、圆(Circle)等图形类。,Shape-案例,class Shape public:int id;public:Shape();Shape(int id);virtual Shape();public:/*纯虚函数*/virtual void draw()=0;/*虚函数 打印对象基本信息*/virtual void print();,Shape:Shape():id(0)Shape:Shape(in
6、t id)this-id=id;Shape:Shape()void Shape:print()coutShape Objectthisendl;coutId:idendl;,Triangle三角形,Triangle-案例,#include Shape.hclass Triangle:public Shape public:float a,b,c;public:Triangle();Triangle(int id,float a,float b,float c);virtual Triangle();virtual void draw();virtual void print();,Triang
7、le:Triangle()Triangle:Triangle(int id,float a,float b,float c):Shape(id)this-a=a;this-b=b;this-c=c;Triangle:Triangle()void Triangle:draw()coutDraw Trianglethisendl;void Triangle:print()coutTriangle Objectthisendl;coutId:idendl;cout(a,b,c):,a,b,cendl;,Rectangle矩形,Rectangle-案例,class Rectangle:public S
8、hape public:Rectangle();Rectangle(int id,float a,float b);virtual void draw();virtual void print();virtual Rectangle();public:float a,b;,Rectangle:Rectangle()Rectangle:Rectangle(int id,float a,float b):Shape(id)this-a=a;this-b=b;Rectangle:Rectangle()void Rectangle:draw()coutDraw Rectanglethisendl;vo
9、id Rectangle:print()coutRectangle Objectthisendl;coutId:idendl;cout(a,b):,a,bendl;,主函数与运行结果,#include Rectangle.h#include triangle.h#include Painter.hint main()Painter painter;Triangle triangle(1,3,4,5);Rectangle rectangle(2,10,20);painter.draw(triangle);painter.draw(rectangle);triangle.print();recta
10、ngle.print();return 0;,派生类重载的普通虚函数将自动调用继承类中对应的函数利用纯虚函数,基于继承类对象的引用可以直接调用派生类对象的方法,虚析构函数,基于“派生类重载的普通虚函数将自动调用继承类中对应的虚函数”特性,将派生类析构函数声明为虚函数,当派生类对象释放时将自动调继承类构造函数,虚析构函数,class Shape public:int id;public:virtual Shape();class Triangle:public Shape public:float a,b,c;public:virtual Triangle();,Shape:Shape()cou
11、tShape()thisendl;Triangle:Triangle()coutTriangle()thisendl;,主函数与运行结果,#include Rectangle.h#include triangle.h#include Painter.hint main()Painter painter;Triangle triangle(1,3,4,5);return 0;,首先调用派生类析构函数其次调用父类析构函数,抽象类,具有纯虚函数的类称为抽象类。抽象类不能创建对象。,class Shape public:int id;public:Shape();Shape(int id);virtu
12、al Shape();public:/*纯虚函数*/virtual void draw()=0;/*虚函数 打印对象基本信息*/virtual void print();,本类即为抽象类,抽象类与Java中接口,C+:struct ShapeInterfacevirtual void draw()=0;virtual void print()=0;,Java:public interface ShapeInterface void draw();void print();,不包括成员变量的,仅仅由纯虚函数构成的类称为抽象类。其作用声明所有对象应当具有的功能接口规。,打破封装-静态成员、友元,静
13、态成员指静态成员变量、静态成员函数,静态成员,静态成员变量声明:class 类访问性:static 类 对象名称;,class Book public:Book();virtual Book();char*getAutor()return author;public:char name64;char isbn64;public:static char author32;,静态成员指静态成员变量、静态成员函数,静态成员,静态成员变量初始化:class 类数据类型 类:对象名称=初始化表达式;或者数据类型 类:对象名称(初始化表达式);,char Book:author32=张三;char Boo
14、k:author32(张三);,#include using namespace std;int main(int argc,char*argv)Book book1,book2;char*p1=book1.getAutor();char*p2=book2.getAutor();if(p1=p2)cout“所有Book对象的静态成员变量 的地址相同endl;coutbook1.getAutor()endl;coutbook2.getAutor()endl;return 0;,对于整个类的所有对象来说静态成员变量是同一变量。,静态成员指静态成员变量、静态成员函数,静态成员,静态成员变量使用:基于
15、“.”运算符基于:运算符编制专门的成员函数,char Book:author32=张三;char Book:author32(张三);,#include using namespace std;int main(int argc,char*argv)Book book1,book2;char*p2=book2.getAutor();coutbook1.authorendl;coutBook:authorendl;return 0;,存储类所有对象共享的数值信息静态成员变量仅仅有一份,普通成员变量是每个对象均有一份。静态成员变量相当与C语言的中全局变量。静态成员函数的使用与对象无关。,静态成员,
16、对象A,对象B,对象C,对象C,类的所有对象共享的全局变量,静态成员指静态成员变量、静态成员函数,静态成员,静态成员函数声明:class 类访问性:static 函数类型 函数名(函数参数);,class StringUtil public:static void copyString(char*s1,const char*s2);,静态成员,静态成员函数定义与普通成员函数的定义相同。,void StringUtil:copyString(char*s1,const char*s2)strcpy(s1,s2);int main(int argc,char*argv)char s1100=Hel
17、lo;char s2=demo;StringUtil:copyString(s1,s2);return 0;,静态成员函数相当与C语言的中全局函数静态成员函数的使用与对象无关。静态成员函数是打破面向对象的封装性的技术,其主要用于构建工具类。,类实现了数据和函数的封装,不同类直接不能共享成员变量和成员函数,彼此只能通过对象之间交流传递信息。友元出现打破了这种封装,允许两个类之间相互访问彼此的成员函数和成员变量。,友元类,class TA public:TA();TA(double v):vaule(v)virtual TA();private:double vaule;,TB在编译时会告知无权访
18、问vaule,原因是TA类的限制。,class TB private:TA object;public:TB(double v):object(v)double getVaule()return object.vauleTB();virtual TB();,友元类,友元类TB可以直接访问TA类的所有成员友元类为事先指定,而非运行是指定友元类的声明顺序不重要派生类不会继承其基类的友元设置派生类也可以是其基类的友元。,友元类,class TA friend class TB;public:TA()TA(char*sname,double v)strcpy(name,sname);value=v;v
19、irtual TA()private:double value;char name32;,class TB private:TA object;public:TB(char*name,double v):object(name,v)double getVaule()return object.value;void print();TB();virtual TB();,void TB:print()coutname:object.nameendl;coutvaule:object.vauleendl;,int main(int argc,char*argv)TB tb(T,1000);tb.pr
20、int();return 0;,友元函数-类和函数,友元函数是类与全局性的公共函数之间的友元关系,即允许公共函数访问类的成员。,class TA friend class TB;friend void print(TA,#include using namespace std;void print(TA,友元函数-类和成员函数,友元函数是类与其他类的成员函数之间的友元关系,即允许公共函数访问类的成员。,class TA friend void print(TA,class TA;class TB public:void print(TA,运算符重载,重载运算符,对系统的基本数据类型,如long
21、,int,double,系统提供了丰富的运算符,如何令自定义类对象也支持多种运算?重载运算符解决此问题,重载运算符string类,#include#include using namespace std;int main(int argc,char*argv)string a(Hello),b(Li),c;c=a+b;coutb)coutbendl;elsecoutabendl;return 0;,重载运算符,不允许用户自己定义新的运算符,只能对已有的C+运算符进行重载。允许重载除“.”“”“?:”“*”“#”之外的所有运算符重载不能改变运算符的优先级别重载运算符的函数不能有默认的参数 重载的
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 面向 对象 技术
链接地址:https://www.31ppt.com/p-5454063.html