




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、面向对象技术电话:87602地址:辽宁省沈阳市和平区文化路3号巷11号电子邮件:程序设计基础系列课程程序设计技术前期课程:高级语言程序设计后期课程:计算机软件技术基础1教学内容多态性打破封装-静态成员、友元高级代码重用-函数模板和类模板STL模板2继承实现派生类直接使用继承类的成员变量和函数(属性和方法)。是一种重用机制,即派生类具有继承类的所有的特征。多态性是之相同的行为在派生类中具有不同的形态。例如几何图形中,定义基类Shape,其中三角(Triangle)、矩形(Rectangle)、圆(Circle)均是此Shape的派生类,所有的类均有Draw方法,但是Draw方法的具体实现不同。多
2、态性与继承TriangleCircleRectangle现需要编译一个绘图Painter用于绘制图形,能够绘制所有图形。class Painter public:void draw(Shape& shape);Painter();virtual Painter();多态性实现了通过继承类的对象的引用,调用派生类对象方法的机制3虚函数指在继承类中声明,但是没有定义的函数,需要在派生类中定义的函数。实质为函数指针虚函数声明语法:普通虚函数:Virtual 函数类型 函数名称(函数参数);纯虚函数:Virtual 函数类型 函数名称(函数参数)=0;区别:普通虚函数允许在继承类中有定义,而纯虚函数没
3、有。4现需要编译一个绘图Painter用于绘制图形,能够绘制三角(Triangle)、矩形(Rectangle)、圆(Circle)等图形。虚函数-案例定义如下类:Painter(绘图板)Shape(图形对象基类)Triangle(三角,派生于Shape)Rectangle (矩形,派生于Shape)Circle (圆派生于Shape)5Painter用于绘制图形,能够绘制三角(Triangle)、矩形(Rectangle)、圆(Circle)等图形。Painter -案例class Painter public:void draw(Shape& shape);Painter();virtua
4、l Painter();Painter:Painter()Painter:Painter()void Painter:draw(Shape &shape)shape.draw();6Shape是图形的基类,派生了三角(Triangle)、矩形(Rectangle)、圆(Circle)等图形类。Shape -案例class Shape public:int id;public:Shape();Shape(int id);virtual Shape();public:/*纯虚函数*/virtual void draw()=0;/*虚函数 打印对象基本信息*/virtual void print()
5、;Shape:Shape():id(0)Shape:Shape(int id)this-id=id;Shape:Shape()void Shape:print()coutShape Objectthisendl;coutId:idid=id;Shape:Shape()void Shape:print()coutShape Objectthisendl;coutId:ida=a;this-b=b;this-c=c;Triangle:Triangle()void Triangle:draw()coutDraw Trianglethisendl;void Triangle:print()coutTr
6、iangle Objectthisendl;coutId:idendl;cout(a,b,c):,a,b,ca=a;this-b=b;Rectangle:Rectangle()void Rectangle:draw()coutDraw Rectanglethisendl;void Rectangle:print()coutRectangle Objectthisendl;coutId:idendl;cout(a,b):,a,bendl;10主函数与运行结果#include Rectangle.h#include triangle.h#include Painter.hint main()Pai
7、nter painter;Triangle triangle(1,3,4,5);Rectangle rectangle(2,10,20);painter.draw(triangle);painter.draw(rectangle);triangle.print();rectangle.print();return 0;派生类重载的普通虚函数将自动调用继承类中对应的函数利用纯虚函数,基于继承类对象的引用可以直接调用派生类对象的方法11虚析构函数12基于“派生类重载的普通虚函数将自动调用继承类中对应的虚函数”特性,将派生类析构函数声明为虚函数,当派生类对象释放时将自动调继承类构造函数虚析构函数cl
8、ass Shape public:int id;public:virtual Shape(); class Triangle : public Shape public:float a,b,c;public:virtual Triangle();Shape:Shape()coutShape()thisendl;Triangle:Triangle()coutTriangle()thisendl;13主函数与运行结果#include Rectangle.h#include triangle.h#include Painter.hint main()Painter painter;Triangle
9、triangle(1,3,4,5);return 0;首先调用派生类析构函数其次调用父类析构函数14抽象类具有纯虚函数的类称为抽象类。抽象类不能创建对象。class Shape public:int id;public:Shape();Shape(int id);virtual Shape();public:/*纯虚函数*/virtual void draw()=0;/*虚函数 打印对象基本信息*/virtual void print();本类即为抽象类15抽象类与Java中接口C+:struct ShapeInterfacevirtual void draw()=0;virtual void
10、 print()=0;Java:public interface ShapeInterface void draw();void print();不包括成员变量的,仅仅由纯虚函数构成的类称为抽象类。其作用声明所有对象应当具有的功能接口规。16打破封装-静态成员、友元17静态成员指静态成员变量、静态成员函数静态成员静态成员变量声明: class 类访问性:static 类 对象名称;class Book public:Book();virtual Book();char * getAutor()return author;public:char name64;char isbn64;public
11、:static char author32;18静态成员指静态成员变量、静态成员函数静态成员静态成员变量初始化: class 类数据类型 类:对象名称=初始化表达式;或者数据类型 类:对象名称(初始化表达式);char Book:author32=张三;char Book: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对
12、象的静态成员变量 的地址相同endl;coutbook1.getAutor()endl;coutbook2.getAutor()endl;return 0;对于整个类的所有对象来说静态成员变量是同一变量。19静态成员指静态成员变量、静态成员函数静态成员静态成员变量使用:基于“.”运算符基于:运算符编制专门的成员函数char Book:author32=张三;char Book:author32(张三);#include using namespace std;int main(int argc, char* argv)Book book1,book2;char *p2=book2.getAut
13、or();coutbook1.authorendl;coutBook:authorendl;return 0;存储类所有对象共享的数值信息静态成员变量仅仅有一份,普通成员变量是每个对象均有一份。静态成员变量相当与C语言的中全局变量。静态成员函数的使用与对象无关。20静态成员对象A对象B对象C对象C类的所有对象共享的全局变量21静态成员指静态成员变量、静态成员函数静态成员静态成员函数声明: class 类访问性:static 函数类型 函数名(函数参数);class StringUtil public:static void copyString(char * s1,const char *s2
14、);22静态成员静态成员函数定义与普通成员函数的定义相同。void StringUtil:copyString(char * s1,const char *s2)strcpy(s1,s2);int main(int argc, char* argv)char s1100=Hello;char s2=demo;StringUtil:copyString(s1,s2);return 0;静态成员函数相当与C语言的中全局函数静态成员函数的使用与对象无关。静态成员函数是打破面向对象的封装性的技术,其主要用于构建工具类。23类实现了数据和函数的封装,不同类直接不能共享成员变量和成员函数,彼此只能通过对象
15、之间交流传递信息。友元出现打破了这种封装,允许两个类之间相互访问彼此的成员函数和成员变量。友元类class TA public:TA();TA(double v):vaule(v)virtual TA();private:double vaule;TB在编译时会告知无权访问vaule,原因是TA类的限制。class TB private:TA object;public:TB(double v):object(v)double getVaule()return object.vauleTB();virtual TB();24友元类友元类TB可以直接访问TA类的所有成员友元类为事先指定,而非运行
16、是指定友元类的声明顺序不重要派生类不会继承其基类的友元设置派生类也可以是其基类的友元。25友元类class TA friend class TB ;public:TA()TA(char *sname,double v)strcpy(name,sname);value=v;virtual 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 prin
17、t();TB();virtual TB();void TB:print()coutname:endl;coutvaule:object.vauleendl;int main(int argc, char* argv)TB tb(T,1000);tb.print();return 0;26友元函数-类和函数友元函数是类与全局性的公共函数之间的友元关系,即允许公共函数访问类的成员。class TA friend class TB ;friend void print(TA &a);public:TA();TA(char *sname,double v);virtual TA(
18、);private:double vaule;char name32;#include using namespace std;void print(TA &a)coutname:endl;coutvaule:a.vauleendl;int main(int argc, char* argv)TA a(T,100);print(a);return 0;27友元函数-类和成员函数友元函数是类与其他类的成员函数之间的友元关系,即允许公共函数访问类的成员。class TA friend void print(TA &a);friend void TB:print(TA &a);publi
19、c:TA();TA(char *sname,double v);virtual TA();private:double vaule;char name32;class TA;class TB public:void print(TA& a);TB();virtual TB();int main(int argc, char* argv)TA a(T,100);TB b;b.print(a);return 0;28运算符重载29重载运算符对系统的基本数据类型,如long,int,double,系统提供了丰富的运算符,如何令自定义类对象也支持多种运算?重载运算符解决此问题+unary plus(一
20、元正号)+ expr-unary minus(一元负号)- expr*multiplication(乘法)expr * expr/division(除法)expr / expr%remainder(求余)expr % expr+addition(加法)expr + expr-subtraction(减法)expr - expr30重载运算符string类#include #include using namespace std;int main(int argc, char* argv)string a(Hello),b(Li),c;c=a+b;coutcb)coutbendl;elsecou
21、tabendl;return 0;31重载运算符不允许用户自己定义新的运算符,只能对已有的C+运算符进行重载。允许重载除“.”“ ”“?:”“ *”“ #”之外的所有运算符重载不能改变运算符的优先级别重载运算符的函数不能有默认的参数 重载的运算符必须和自定义类型的对象一起使用,其参数至少应有一个是类对象 .用于类对象的运算符一般必须重载,但有两个例外,运算符“=”和“&”不必用户重载 .32重载为友元函数语法:class 类名称 public:friend 类名称 operator + (类名称 a,类名称 b);friend 类名称 operator - (类名称 a,类名称 b);frie
22、nd 类名称 operator * (类名称 a,类名称 b);friend 类名称 operator / (类名称 a,类名称 b);33重载算术运算符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(v
23、alue);friend long operator +(LargeInteger& op1,LargeInteger& op2);friend long operator -(LargeInteger& op1,LargeInteger& op2);friend long operator +(LargeInteger& op1,int op2);friend long operator +(int op1,LargeInteger&op2);private:char value1024;34LargeInteger:LargeInteger()value0=0;LargeInteger:L
24、argeInteger()long operator +(LargeInteger& op1,LargeInteger& op2)return op1.getVaule()+op2.getVaule();long operator -(LargeInteger& op1,LargeInteger& op2)return op1.getVaule()-op2.getVaule();long operator +(LargeInteger& op1,int op2)return op1.getVaule() +op2;long operator +(int op1,LargeInteger&op2
25、)return op2.getVaule() +op1;35重载算术运算符#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;36重载为类成员语法:class 类名称 public:数据类型 operator + (类名称 a);数据类型 operator - (类名称 a);数据类型 ope
26、rator * (类名称 a);数据类型 operator / (类名称 a);37重载算术运算符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
27、);long operator *(LargeInteger& op);private:char value1024;38LargeInteger:LargeInteger()value0=0;LargeInteger:LargeInteger()long LargeInteger:operator -(int op)return getVaule()-op;long LargeInteger:operator *(LargeInteger& op)return getVaule()*op.getVaule();39重载算术运算符#include #include LargeInteger.h
28、using 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+6endl;couta+6=a+6endl;couta-6a-6endl;couta*2a*bendl;return 0;40重载 “-”运算符成员函数形式:long LargeInteger:operator -()return -getVaule();友员函数形式:long operator -(LargeInteger op)return - op .getVau
29、le();41重载 类型转换 运算符成员函数形式:LargeInteger:operator long()return getVaule();#include #include LargeInteger.husing namespace std;int main(int argc, char* argv)LargeInteger a(123),b(2);long c;c=long(c);return 0;42重载 运算符成员函数形式:char &LargeInteger:operator(unsigned int i)throw (exception)if(i1024)throw except
30、ion(下标越界);return valuei;char &operator(unsigned int i)throw (exception);int main(int argc, char* argv)LargeInteger a(123),b(2);couta1endl;a1=5;couta;return 0;43重载函数调用 运算符成员函数形式:long LargeInteger:operator()()return getVaule();long operator()();int main(int argc, char* argv)LargeInteger a(123),b(2);co
31、uta1endl;a1=5;cout()return this;LargeInteger * operator -();int main(int argc, char* argv)LargeInteger a(123),b(2);couta1getVaule();return 0;45重载+/-运算long LargeInteger:operator +()long l=getVaule();+l;sprintf(value,%ld,l);return l;long operator +();int main(int argc, char* argv)LargeInteger a(123),b
32、(2);couta1endl;a1=5;couta+;return 0;46重载输出流ostream & operator(ostream& os,const LargeInteger op)osop.valueendl;return os;friend osteam & operator(osteam& os,const LargeInteger op);int main(int argc, char* argv)LargeInteger a(123),b(2);couta1endl;a1=5;coutistream & operator(istream& is,LargeInteger&
33、op)isop.value;return is;friend istream & operator(istream& is,LargeInteger& op);int main(int argc, char* argv)LargeInteger a(123),b(2);cina;couta;return 0;48重载运算符方法只能使用成员函数重载的运算符有:=、()、-、new、delete。 单目运算符最好重载为成员函数。 对于复合的赋值运算符如+=、-=、*=、/=、&=、!=、=、%=、=、=建议重载为成员函数。 对于其它运算符,建议重载为友元函数。 运算符重载可以使用成员函数和友元函数
34、两种形式:49模板是不与特定数据类型相联系的的通用函数和类。类模板函数模板类模板(1)建立模板函数或模板类(2)实例化(3)使用步骤:模板实例化之后为处理具体问题的函数和类。50函数模板函数模板是指在C+程序允许为功能完全相同,但是参数数据类型不同函数定义通用的函数。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;两个函数的功能相同,只是参数的数据类型不同,因此为这两函数编制函数模
35、板。51函数模板语法:template 函数类型 函数名称 (函数参数)或 template函数类型 函数名称 (函数参数)templateAny sum(Any a,int n)Any s=0; int i;for(i=0;in;i+)s+=ai;return s;templatevoid print(T a,int n) int i;for(i=0;in;i+)coutai;Any为类型的别名,亦可为其他有效标识符在函数参数返回值函数体中应当用到Any来声明变量优先使用typename关键字函数模板调用与普通函数相同,系统根据参数类型生成具体的函数代码上述两个函数sum的模板可以使如下两种
36、模板定义中的一个52函数模板使用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)int a5=1,2,3,4,5; int b=sum(a,5);return 0;53函数模板重载当处理多个具有相同名称,但是参数不同的函数模板时,可以进行重载函数模板void print(int a);void print(int a,int n);void print(char a);void print(char *s);templatevoid print
37、(T a,int n)for(i=0;in;i+)coutai;templatevoid print(T a)templatevoid print(T* a)可能的函数形式函数模板重载54类模板用于创建常规的类框架,使用时通过具体的数据初始化。语法:template class 类名称/类成员;Any为类型的别名,亦可为其他有效标识符在类成员变量中或成员函数中应用到Anytemplate class Datapublic:Any sum(void );private:Any a100;template Any Data:sum(void)Any s=0;for(int i=0;i100;i+)
38、s+=ai;return s;55函数模板使用int main(int argc, char* argv)int a5=1,2,3,4,5;Data test;test.sum();return 0;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;56STL简介STL(Standard Template Library,标准模板库)是惠普实验室1994开发的一系列软件的统称。它是由Alex
39、ander Stepanov、Meng Lee和David R Musser在惠普实验室工作时所开发出来的,其基本思想为Generic Programming).STL的代码从广义上讲分为三类:container(容器)iterator(迭代器)algorithm(算法)几乎所有的代码都采用了模板类和模版函数的方式。在C+标准中,STL被组织为下面的13个头文件:、和。57容器量(vector)连续存储的元素列表(list)由节点组成的双向链表,每个结点包含着一个元素双队列(deque)连续存储的指向不同元素的指针所组成的数组集合(set)由节点组成的红黑树,每个节点都包含着一个元素,节点之间
40、以某种作用于元素对的谓词排列,没有两个不同的元素能够拥有相同的次序多重集合(multiset)允许存在两个次序相等的元素的集合栈(stack)后进先出的值的排列队列(queue)先进先出的执的排列优先队列(priority_queue)元素的次序是由作用于所存储的值对上的某种谓词决定的的一种队列映射(map)由键,值对组成的集合,以某种作用于键对上的谓词排列多重映射(multimap)允许键对有相等的次序的映射58迭代器迭代器部分主要由头文件,和组成。是一个很小的头文件,它包括了贯穿使用在STL中的几个模板的声明 提供了迭代器使用的许多方法主要部分是模板类allocator,它负责产生所有容器
41、中的默认分配器。 59迭代器#include #include #include #include using namespace std;bool compare(int a,int b)return ab;void print(int n)coutn;int main(int argc, char* argv)vector array(10);array0=1;array1=2; vector:iterator itr;itr = find(array.begin(),array.end(),2); cout*itr;return 0;60算法STL提供了大约100个实现算法的模版函数,比
42、如算法for_each将为指定序列中的每一个元素调用指定的函数,stable_sort以你所指定的规则对序列进行稳定性排序等等。算法部分主要由头文件,和组成。是所有STL头文件中最大的一个(尽管它很好理解),它是由一大堆模版函数组成的,可以认为每个函数在很大程度上都是独立的,其中常用到的功能范围涉及到比较、交换、查找、遍历操作、复制、修改、移除、反转、排序、合并等等。体积很小,只包括几个在序列上面进行简单数学运算的模板函数,包括加法和乘法在序列上的一些操作。中则定义了一些模板类,用以声明函数对象。61Vector构造器运算符遍历#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
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 季节性用工合同规定
- 采购合同修订协议
- 广场舞合同范本
- 旅馆住宿合同范本
- 19剃头大师教学设计-2024-2025学年三年级下册语文统编版
- 4 气味告诉我们 教学设计-2024-2025学年科学一年级上册教科版
- 圆木采购合同范本
- 煤炭安全协议合同范本
- Module 8 Unit 1 教学设计 2024-2025学年外研版八年级英语下册
- 2023-2024学年清华版(2012)信息技术三年级上册第四单元《14课 一句一景色-“复制”和“裁剪”图片》教学设计
- 【医院管理分享】:牙科手机清洗保养方法案例分享实践课件
- 《新能源材料与器件》教学课件-04电化学能源材料与器件
- 二手新能源汽车充电安全承诺书
- 医学课件:介入放射学(全套课件328张)
- 水泥搅拌桩记录表格范本
- DL∕T 458-2020 板框式旋转滤网
- GB∕T 8163-2018 输送流体用无缝钢管
- 短视频:策划制作与运营课件
- 水闸设计步骤计算书(多表)
- PowerPoint使用技巧培训课件(共35张)
- SMA沥青路面的设计与施工
评论
0/150
提交评论