面向对象技术.ppt

上传人:sccc 文档编号:5454063 上传时间:2023-07-08 格式:PPT 页数:67 大小:961.54KB
返回 下载 相关 举报
面向对象技术.ppt_第1页
第1页 / 共67页
面向对象技术.ppt_第2页
第2页 / 共67页
面向对象技术.ppt_第3页
第3页 / 共67页
面向对象技术.ppt_第4页
第4页 / 共67页
面向对象技术.ppt_第5页
第5页 / 共67页
点击查看更多>>
资源描述

《面向对象技术.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+运算符进行重载。允许重载除“.”“”“?:”“*”“#”之外的所有运算符重载不能改变运算符的优先级别重载运算符的函数不能有默认的参数 重载的

22、运算符必须和自定义类型的对象一起使用,其参数至少应有一个是类对象.用于类对象的运算符一般必须重载,但有两个例外,运算符“=”和“&”不必用户重载.,重载为友元函数,语法:class 类名称 public:friend 类名称 operator+(类名称 a,类名称 b);friend 类名称 operator-(类名称 a,类名称 b);friend 类名称 operator*(类名称 a,类名称 b);friend 类名称 operator/(类名称 a,类名称 b);,重载算术运算符,class LargeInteger public:LargeInteger();LargeInteger

23、(const char*v)strcpy(value,v);LargeInteger(long v)sprintf(value,%ld,v);LargeInteger(int v)sprintf(value,%d,v);virtual LargeInteger();public:long getVaule()return atol(value);friend long operator+(LargeInteger,LargeInteger:LargeInteger()value0=0;LargeInteger:LargeInteger()long operator+(LargeInteger,

24、重载算术运算符,#include#include LargeInteger.husing namespace std;int main(int argc,char*argv)LargeInteger a(123),b(456);long c;c=a+b;coutc=cendl;couta+b+6=a+b+6endl;couta+6=a+6endl;return 0;,重载为类成员,语法:class 类名称 public:数据类型 operator+(类名称 a);数据类型 operator-(类名称 a);数据类型 operator*(类名称 a);数据类型 operator/(类名称 a);

25、,重载算术运算符,class LargeInteger public:LargeInteger();LargeInteger(const char*v)strcpy(value,v);LargeInteger(long v)sprintf(value,%ld,v);LargeInteger(int v)sprintf(value,%d,v);virtual LargeInteger();public:long getVaule()return atol(value);long operator-(int op);long operator*(LargeInteger,LargeInteger:

26、LargeInteger()value0=0;LargeInteger:LargeInteger()long LargeInteger:operator-(int op)return getVaule()-op;long LargeInteger:operator*(LargeInteger,重载算术运算符,#include#include LargeInteger.husing namespace std;int main(int argc,char*argv)LargeInteger a(123),b(2);long c;c=a+b;coutc=cendl;couta+b+6=a+b+6e

27、ndl;couta+6=a+6endl;couta-6a-6endl;couta*2a*bendl;return 0;,重载“-”运算符,成员函数形式:long LargeInteger:operator-()return-getVaule();,友员函数形式:long operator-(LargeInteger op)return-op.getVaule();,重载 类型转换 运算符,成员函数形式:LargeInteger:operator long()return getVaule();,#include#include LargeInteger.husing namespace std

28、;int main(int argc,char*argv)LargeInteger a(123),b(2);long c;c=long(c);return 0;,重载 运算符,成员函数形式:,char,char,int main(int argc,char*argv)LargeInteger a(123),b(2);couta1endl;a1=5;couta;return 0;,重载函数调用 运算符,成员函数形式:,long LargeInteger:operator()()return getVaule();,long operator()();,int main(int argc,char

29、*argv)LargeInteger a(123),b(2);couta1endl;a1=5;couta();return 0;,重载成员访问运算,LargeInteger*LargeInteger:operator-()return this;,LargeInteger*operator-();,int main(int argc,char*argv)LargeInteger a(123),b(2);coutgetVaule();return 0;,重载+/-运算,long LargeInteger:operator+()long l=getVaule();+l;sprintf(value,

30、%ld,l);return l;,long operator+();,int main(int argc,char*argv)LargeInteger a(123),b(2);couta1endl;a1=5;couta+;return 0;,重载输出流,ostream,friend osteam,int main(int argc,char*argv)LargeInteger a(123),b(2);couta1endl;a1=5;couta;return 0;,重载输入流,istream,friend istream,int main(int argc,char*argv)LargeInte

31、ger a(123),b(2);cina;couta;return 0;,重载运算符方法,只能使用成员函数重载的运算符有:=、()、-、new、delete。单目运算符最好重载为成员函数。对于复合的赋值运算符如+=、-=、*=、/=、&=、!=、=、%=、=、=建议重载为成员函数。对于其它运算符,建议重载为友元函数。,运算符重载可以使用成员函数和友元函数两种形式:,模板是不与特定数据类型相联系的的通用函数和类。,类模板,函数模板类模板,(1)建立模板函数或模板类(2)实例化(3)使用,步骤:,模板实例化之后为处理具体问题的函数和类。,函数模板,函数模板是指在C+程序允许为功能完全相同,但是参数

32、数据类型不同函数定义通用的函数。,int sum(int a,int n)int s=0;for(int i=0;in;i+)s+=ai;return s;,double sum(double a,int n)double s=0;for(int i=0;in;i+)s+=ai;return s;,两个函数的功能相同,只是参数的数据类型不同,因此为这两函数编制函数模板。,函数模板,语法:template 函数类型 函数名称(函数参数)或 template函数类型 函数名称(函数参数),templateAny sum(Any a,int n)Any s=0;int i;for(i=0;in;i+

33、)s+=ai;return s;,templatevoid print(T a,int n)int i;for(i=0;in;i+)coutai;,Any为类型的别名,亦可为其他有效标识符在函数参数返回值函数体中应当用到Any来声明变量优先使用typename关键字函数模板调用与普通函数相同,系统根据参数类型生成具体的函数代码,上述两个函数sum的模板可以使如下两种模板定义中的一个,函数模板使用,template Any sum(Any a,int n)Any s=0;for(int i=0;in;i+)s+=ai;return s;int main(int argc,char*argv)in

34、t a5=1,2,3,4,5;int b=sum(a,5);return 0;,函数模板重载,当处理多个具有相同名称,但是参数不同的函数模板时,可以进行重载函数模板,void print(int a);void print(int a,int n);void print(char a);void print(char*s);,templatevoid print(T a,int n)for(i=0;ivoid print(T a)templatevoid print(T*a),可能的函数形式,函数模板重载,类模板,用于创建常规的类框架,使用时通过具体的数据初始化。,语法:template cl

35、ass 类名称/类成员;,Any为类型的别名,亦可为其他有效标识符在类成员变量中或成员函数中应用到Any,template class Datapublic:Any sum(void);private:Any a100;template Any Data:sum(void)Any s=0;for(int i=0;i100;i+)s+=ai;return s;,函数模板使用,int main(int argc,char*argv)int a5=1,2,3,4,5;Data test;test.sum();return 0;,template class Datapublic:Any sum(vo

36、id);private:Any a100;template Any Data:sum(void)Any s=0;for(int i=0;i100;i+)s+=ai;return s;,STL简介,STL(Standard Template Library,标准模板库)是惠普实验室1994开发的一系列软件的统称。它是由Alexander Stepanov、Meng Lee和David R Musser在惠普实验室工作时所开发出来的,其基本思想为Generic Programming).STL的代码从广义上讲分为三类:container(容器)iterator(迭代器)algorithm(算法)几

37、乎所有的代码都采用了模板类和模版函数的方式。在C+标准中,STL被组织为下面的13个头文件:、和。,容器,迭代器,迭代器部分主要由头文件,和组成。是一个很小的头文件,它包括了贯穿使用在STL中的几个模板的声明 提供了迭代器使用的许多方法主要部分是模板类allocator,它负责产生所有容器中的默认分配器。,迭代器,#include#include#include#include using namespace std;bool compare(int a,int b)return ab;void print(int n)cout array(10);array0=1;array1=2;vect

38、or:iterator itr;itr=find(array.begin(),array.end(),2);cout*itr;return 0;,算法,STL提供了大约100个实现算法的模版函数,比如算法for_each将为指定序列中的每一个元素调用指定的函数,stable_sort以你所指定的规则对序列进行稳定性排序等等。算法部分主要由头文件,和组成。是所有STL头文件中最大的一个(尽管它很好理解),它是由一大堆模版函数组成的,可以认为每个函数在很大程度上都是独立的,其中常用到的功能范围涉及到比较、交换、查找、遍历操作、复制、修改、移除、反转、排序、合并等等。体积很小,只包括几个在序列上面进

39、行简单数学运算的模板函数,包括加法和乘法在序列上的一些操作。中则定义了一些模板类,用以声明函数对象。,Vector,构造器运算符遍历,#include stdafx.h#include#include#include using namespace std;int main(int argc,char*argv)vector array(100);array0=1;array1=2;for(int i=0;i10;i+)coutarrayi;coutendl-endl;int*p=array.begin();for(i=0;i10;i+)cout*p+;return 0;,Vector,遍历,

40、#include stdafx.h#include#include using namespace std;int main(int argc,char*argv)vector array(100);array0=1;array1=2;int*p=array.begin();for(i=0;i10;i+)cout*p+;return 0;,#include stdafx.h#include#include using namespace std;int main(int argc,char*argv)vector array(100);array0=1;array1=2;for(int i=0

41、;i10;i+)coutarrayi;,Vector,遍历,#include stdafx.h#include#include using namespace std;int main(int argc,char*argv)vector array(100);vector array2(100);array0=1;array1=2;vector:iterator itr;for(itr=array.begin();itr!=array.end();itr+)cout*itr;return 0;,Vector,遍历,#include stdafx.h#include#include#includ

42、e#include using namespace std;void print(int n)cout array(10);array0=1;array1=2;vector:iterator itr;for_each(itr=array.begin(),array.end(),print);return 0;,Vector,排序,#include#include#include#include using namespace std;bool compare(int a,int b)return ab;void print(int n)cout array(10);array0=1;array

43、1=2;vector:iterator itr;sort(array.begin(),array.end(),compare);for_each(itr=array.begin(),array.end(),print);return 0;,Vector,删除插入,#include stdafx.h#include#include#include using namespace std;int main(int argc,char*argv)vector array(100);vector array2(100);array0=1;array1=2;array.insert(array.begin()+1,3);array.erase(array.begin()+2);int*p=array.begin();for(int i=0;i10;i+)cout*p+;return 0;,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 建筑/施工/环境 > 农业报告


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号