




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、程序设计根底系列课程程序设计技术前期课程:高级言语程序设计后期课程:计算机软件技术根底教学内容n 多态性n 突破封装-静态成员、友元n 高级代码重用-函数模板和类模板n STL模板承继实现派生类直接运用承继类的成员变量和函数属性和方法)。是一种重用机制,即派生类具有承继类的一切的特征。多态性是之一样的行为在派生类中具有不同的形状。例如几何图形中,定义基类Shape,其中三角(Triangle)、矩形(Rectangle)、圆(Circle)均是此Shape的派生类,一切的类均有Draw方法,但是Draw方法的详细实现不同。多态性与承继TriangleCircleRectangle现需求编译一个
2、绘图Painter用于绘制图形,可以绘制一切图形。class Painter public:void draw(Shape& shape);Painter();virtual Painter();多态性实现了经过承继类的对象的援用,调用派生类对象方法的机制虚函数指在承继类中声明,但是没有定义的函数,需求在派生类中定义的函数。本质为函数指针虚函数声明语法:普通虚函数:Virtual 函数类型 函数称号(函数参数);纯虚函数:Virtual 函数类型 函数称号(函数参数)=0;区别:普通虚函数允许在承继类中有定义,而纯虚函数没有。现需求编译一个绘图Painter用于绘制图形,可以绘制三角(
3、Triangle)、矩形(Rectangle)、圆(Circle)等图形。虚函数-案例定义如下类:Painter绘图板Shape(图形对象基类Triangle(三角,派生于Shape)Rectangle (矩形,派生于Shape)Circle (圆派生于Shape)Painter用于绘制图形,可以绘制三角(Triangle)、矩形(Rectangle)、圆(Circle)等图形。Painter -案例class Painter public:void draw(Shape& shape);Painter();virtual Painter();Painter:Painter()Pain
4、ter:Painter()void Painter:draw(Shape &shape)shape.draw();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:Shap
5、e(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()coutTriangle Objectthisendl;coutId:i
6、dendl;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;主函数与运转结果#include Rectangle.h#include triangle.h#include Painter.hint main()Painter painter;Triangle triangle(1
7、,3,4,5);Rectangle rectangle(2,10,20);painter.draw(triangle);painter.draw(rectangle);triangle.print();rectangle.print();return 0;n派生类重载的普通虚函数将自动调用承继类中对应的函数n利用纯虚函数,基于承继类对象的援用可以直接调用派生类对象的方法虚析构函数基于“派生类重载的普通虚函数将自动调用承继类中对应的虚函数特性,将派生类析构函数声明为虚函数,当派生类对象释放时将自动调承继类构造函数虚析构函数class Shape public:int id;public:virt
8、ual Shape(); class Triangle : public Shape public:float a,b,c;public:virtual Triangle();Shape:Shape()coutShape()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;n首先调用派生类析构
9、函数n其次调用父类析构函数笼统类具有纯虚函数的类称为笼统类。笼统类不能创建对象。class Shape public:int id;public:Shape();Shape(int id);virtual Shape();public:/*纯虚函数*/virtual void draw()=0;/*虚函数 打印对象根本信息*/virtual void print();本类即为笼统类笼统类与Java中接口C+:struct ShapeInterfacevirtual void draw()=0;virtual void print()=0;Java:public interface ShapeI
10、nterface void draw();void print();不包括成员变量的,仅仅由纯虚函数构成的类称为笼统类。其作用声明一切对象该当具有的功能接口规。突破封装-静态成员、友元静态成员指静态成员变量、静态成员函数静态成员静态成员变量声明: class 类访问性:static 类 对象称号;class Book public:Book();virtual Book();char * getAutor()return author;public:char name64;char isbn64;public:static char author32;静态成员指静态成员变量、静态成员函数静态成
11、员静态成员变量初始化: 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对象的静态成员变量 的地址一样endl;coutbook1.getAutor()endl;cou
12、tbook2.getAutor()endl;return 0;对于整个类的一切对象来说静态成员变量是同一变量。静态成员指静态成员变量、静态成员函数静态成员静态成员变量运用:基于“.运算符基于:运算符编制专门的成员函数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;retu
13、rn 0;n存储类一切对象共享的数值信息n静态成员变量仅仅有一份,普通成员变量是每个对象均有一份。n静态成员变量相当与C言语的中全局变量。n静态成员函数的运用与对象无关。静态成员对象A对象B对象C对象C类的一切对象共享的全局变量静态成员指静态成员变量、静态成员函数静态成员静态成员函数声明: class 类访问性:static 函数类型 函数名函数参数;class StringUtil public:static void copyString(char * s1,const char *s2);静态成员静态成员函数定义与普通成员函数的定义一样。void StringUtil:copyStrin
14、g(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;n 静态成员函数相当与C言语的中全局函数n 静态成员函数的运用与对象无关。n 静态成员函数是突破面向对象的封装性的技术,其主要用于构建工具类。类实现了数据和函数的封装,不同类直接不能共享成员变量和成员函数,彼此只能经过对象之间交流传送信息。友元出现突破了这种封装,允许两个类之间相互访问彼此的成员函数和成员变量。友元类cl
15、ass 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();友元类n 友元类TB可以直接访问TA类的一切成员n 友元类为事先指定,而非运转是指定n 友元类的声明顺序不重要n 派生类不会承继其基类的友元设置n 派生类也可以是其基类的友元
16、。友元类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 print();TB();virtual TB();void TB:print()coutnam
17、e:endl;coutvaule:object.vauleendl;int main(int argc, char* argv)TB tb(T,1000);tb.print();return 0;友元函数-类和函数友元函数是类与全局性的公共函数之间的友元关系,即允许公共函数访问类的成员。class TA friend class TB ;friend void print(TA &a);public:TA();TA(char *sname,double v);virtual TA();private:double vaule;char name32;#includ
18、e 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;友元函数-类和成员函数友元函数是类与其他类的成员函数之间的友元关系,即允许公共函数访问类的成员。class TA friend void print(TA &a);friend void TB:print(TA &a);public:TA();TA(char *sname,double v);
19、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;运算符重载重载运算符对系统的根本数据类型,如long,int,double,系统提供了丰富的运算符,如何令自定义类对象也支持多种运算?重载运算符处理此问题+unary plus(一元正号)+ expr-unary minus(一元负号)- ex
20、pr*multiplication(乘法)expr * expr/division(除法)expr / expr%remainder(求余)expr % expr+addition(加法)expr + expr-subtraction(减法)expr - expr重载运算符string类#include #include using namespace std;int main(int argc, char* argv)string a(Hello),b(Li),c;c=a+b;coutcb)coutbendl;elsecoutabendl;return 0;重载运算符n 不允许用户本人定义新
21、的运算符,只能对已有的C+运算符进展重载。n 允许重载除“.“ “?:“ *“ #之外的一切运算符n 重载不能改动运算符的优先级别n 重载运算符的函数不能有默许的参数 n 重载的运算符必需和自定义类型的对象一同运用,其参数至少应有一个是类对象 .n 用于类对象的运算符普通必需重载,但有两个例外,运算符“=和“&不用用户重载 .重载为友元函数语法:class 类称号 public:friend 类称号 operator + (类称号 a,类称号 b);friend 类称号 operator - (类称号 a,类称号 b);friend 类称号 operator * (类称号 a,类称号
22、b);friend 类称号 operator / (类称号 a,类称号 b);重载算术运算符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);friend long operator +(La
23、rgeInteger& 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;LargeInteger:LargeInteger()value0=0;LargeInteger:LargeInteg
24、er()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,Large
25、Integer&op2)return op2.getVaule() +op1;重载算术运算符#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 - (类称号
26、a);数据类型 operator * (类称号 a);数据类型 operator / (类称号 a);重载算术运算符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
27、 -(int op);long operator *(LargeInteger& op);private:char value1024;LargeInteger:LargeInteger()value0=0;LargeInteger:LargeInteger()long LargeInteger:operator -(int op)return getVaule()-op;long LargeInteger:operator *(LargeInteger& op)return getVaule()*op.getVaule();重载算术运算符#include #include L
28、argeInteger.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+6endl;couta+6=a+6endl;couta-6a-6endl;couta*2a*bendl;return 0;重载 “-运算符成员函数方式:long LargeInteger:operator -()return -getVaule();友员函数方式:long operator -(LargeInteger op)return -
29、op .getVaule();重载 类型转换 运算符成员函数方式: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;重载 运算符成员函数方式:char &LargeInteger:operator(unsigned int i)throw (exception)if(i1024)th
30、row exception(下标越界);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;重载函数调用 运算符成员函数方式:long LargeInteger:operator()()return getVaule();long operator()();int main(int argc, char* argv)LargeInteger a(
31、123),b(2);couta1endl;a1=5;cout()return this;LargeInteger * operator -();int main(int argc, char* argv)LargeInteger a(123),b(2);couta1getVaule();return 0;重载+/-运算long LargeInteger:operator +()long l=getVaule();+l;sprintf(value,%ld,l);return l;long operator +();int main(int argc, char* argv)LargeIntege
32、r a(123),b(2);couta1endl;a1=5;couta+;return 0;重载输出流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 & operato
33、r(istream& is,LargeInteger& 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;重载运算符方法n 只能运用成员函数重载的运算符有:=、()、-、new、delete。 n 单目运算符最好重载为成员函数。 n 对于复合的赋值运算符如+=、-=、*=、/=、&=、!=、
34、=、%=、=、=建议重载为成员函数。 n 对于其它运算符,建议重载为友元函数。 运算符重载可以运用成员函数和友元函数两种方式:模板是不与特定数据类型相联络的的通用函数和类。类模板l函数l模板类模板1建立模板函数或模板类2实例化3运用步骤:模板实例化之后为处置详细问题的函数和类。函数模板函数模板是指在C+程序允许为功能完全一样,但是参数数据类型不同函数定义通用的函数。两个函数的功能一样,只是参数的数据类型不同,因此为这两函数编制函数模板。函数模板语法:template 函数类型 函数称号 函数参数或 template函数类型 函数称号 函数参数n Any为类型的别名,亦可为其他有效标识符n 在函
35、数参数前往值函数体中该当用到Any来声明变量n 优先运用typename关键字n 函数模板调用与普通函数一样,系统根据参数类型生成详细的函数代码上述两个函数sum的模板可以使如下两种模板定义中的一个函数模板运用函数模板重载当处置多个具有一样称号,但是参数不同的函数模板时,可以进展重载函数模板能够的函数方式函数模板重载类模板用于创建常规的类框架,运用时经过详细的数据初始化。语法:template class 类称号/类成员;n Any为类型的别名,亦可为其他有效标识符n 在类成员变量中或成员函数中运用到Any函数模板运用STL简介STLStandard Template Library,规范模板
36、库)是惠普实验室1994开发的一系列软件的统称。它是由Alexander Stepanov、Meng Lee和David R Musser在惠普实验室任务时所开发出来的,其根本思想为Generic Programming).STL的代码从广义上讲分为三类:container容器iterator迭代器algorithm算法几乎一切的代码都采用了模板类和模版函数的方式。在C+规范中,STL被组织为下面的13个头文件:、和。容器量(vector)连续存储的元素列表(list)由节点组成的双向链表,每个结点包含着一个元素双队列(deque)连续存储的指向不同元素的指针所组成的数组集合(set)由节点组
37、成的红黑树,每个节点都包含着一个元素,节点之间以某种作用于元素对的谓词排列,没有两个不同的元素能够拥有相同的次序多重集合(multiset)允许存在两个次序相等的元素的集合栈(stack)后进先出的值的排列队列(queue)先进先出的执的排列优先队列(priority_queue)元素的次序是由作用于所存储的值对上的某种谓词决定的的一种队列映射(map)由键,值对组成的集合,以某种作用于键对上的谓词排列多重映射(multimap)允许键对有相等的次序的映射迭代器迭代器部分主要由头文件,和组成。是一个很小的头文件,它包括了贯穿运用在STL中的几个模板的声明 提供了迭代器运用的许多方法主要部分是模
38、板类allocator,它担任产生一切容器中的默许分配器。 迭代器#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;算法STL提供了
39、大约100个实现算法的模版函数,比如算法for_each将为指定序列中的每一个元素调用指定的函数,stable_sort以他所指定的规那么对序列进展稳定性排序等等。算法部分主要由头文件,和组成。是一切STL头文件中最大的一个虽然它很好了解,它是由一大堆模版函数组成的,可以以为每个函数在很大程度上都是独立的,其中常用到的功能范围涉及到比较、交换、查找、遍历操作、复制、修正、移除、反转、排序、合并等等。体积很小,只包括几个在序列上面进展简单数学运算的模板函数,包括加法和乘法在序列上的一些操作。中那么定义了一些模板类,用以声明函数对象。Vectorn 构造器n 运算符n 遍历#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;Vectorn 遍历#include stdafx.h#include #include using namespace std;int main(i
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 浙江省泰顺县2025年上半年事业单位公开遴选试题含答案分析
- 浙江省三门县2025年上半年事业单位公开遴选试题含答案分析
- 云南省德钦县2025年上半年事业单位公开遴选试题含答案分析
- 七年级下册英语单词表朗读 全部单元
- 河北省迁安市2025年上半年公开招聘辅警试题含答案分析
- 河北省灵寿县2025年上半年公开招聘城市协管员试题含答案分析
- 2025年度社保缴纳及企业职工企业补充意外伤害保险合同范本
- 2025年船员薪资待遇与晋升合同条款
- 2025版企业品牌形象设计与传播服务合同
- 2025年度绿色建筑房地产项目销售包销合同协议书
- 新部编版五年级语文上册第八单元课件
- 中国急性缺血性卒中诊治指南(2023)解读
- 加入音乐家协会申请书
- 2025年高二开学第一课主题班会:扬帆砥砺行奋斗正当时
- 车辆构造与检修(第三版)课件 项目1 铁道车辆基本知识认知
- 华住收益管理
- 吉林省延吉市延边第二2024-2025学年高一上学期12月月考历史试题(原卷版)
- 智联招聘行测题库及答案
- 2024版技术咨询合同:化工行业技术服务协议3篇
- 《采购的沟通与谈判》课件
- 电梯使用单位培训
评论
0/150
提交评论