《C++ STL-数据结构与算法实现》课件第2章 STL 技术基础_第1页
《C++ STL-数据结构与算法实现》课件第2章 STL 技术基础_第2页
《C++ STL-数据结构与算法实现》课件第2章 STL 技术基础_第3页
《C++ STL-数据结构与算法实现》课件第2章 STL 技术基础_第4页
《C++ STL-数据结构与算法实现》课件第2章 STL 技术基础_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第二章模板与重载模板概念函数模板类模板类模板继承模板特化操作符重载1/31引入模板——代码重用C++是强类型语言,函数或类的功能类似,只要数据类型不同,就要编写多份代码,增加了编程量和源程序长度。例:求a,b最大值,需编写四个函数(四份代码)intMax(inta,intb){return(a>b)?a:b;}floatMax(floata,floatb){return(a>b)?a:b;}doubleMax(doublea,doubleb){return(a>b)?a:b;}charMax(chara,charb){return(a>b)?a:b;}模板概念只写一份代码适用多种类型——模板功能相同2/31函数模板编写一个函数模子,用这个模子制造出若干功能相同,参数类型和返回类型不同的函数——模板函数函数模板的声明template<classT>//T:类型是参数TMax(Ta,Tb) {return(a>b)?a:b;}//-----------如此,就做好了一个函数模板------------在调用Max函数时,根据实参类型确定T:intx=2,y=5;cout<<Max(x,y);//T→

int函数模板3/31函数模板简例4/31函数模板中使用多种类型函数模板中可用多种类型参数——T1,T2每种类型参数前加class问:a,b可否实例化为相同类型?5/31函数重载参数类型不同参数个数不同问:左边两个重载的函数模板的类型参数T

是否可以被实例化为不同的类型?函数模板重载6/31函数模板与普通函数重载函数模板重载7/31类模板(类属类/类生成类)概念像函数模板一样,类模板是生成具体类的一个模子目的把成员变量的类型、成员函数参数的类型、返回值的类型参数化,使之能适用于多种数据类型定义类模板template<classT>//类型参数T,与函数模板一样class类名//类的定义{…//类体};类模板及定义8/31//定义栈的一个类模板constintn=10;template<class

T>//数据类型参数化classStack

//定义类(类模板){

Tstk[n];//顺序栈,T为元素类型(可变)

inttop;//栈顶元素的位置,int不变public:Stack(){top=-1;}//构造函数,初始化栈顶

voidpush(Tob);//入栈函数,T为参数的类型

Tpop();//出栈函数,T为返回值类型};类模板定义举例9/31template<classT>voidStack<T>::push(Tob){if(top==n-1){cout<<"Stackfull";return;}stk[++top]=ob;}成员函数的类外实现template<classT>TStack<T>::pop(){if(top<0){cout<<"Stackempty";return(0);}returnstk[top--];}观察:与普通类的成员函数实现有何差别?10/31类模板实例化

——生成具体的类,由它创建对象

类名<实际类型>对象名;类模板实例化T具体化11/31全局类型与模板类型同名——局部优先(全局与局部的关系)typedefstring

type;//全局类型名template<classtype>//局部类型名classG{

typen;//n是什么类型?……};//n不是string类型类模板的其他语法规则12/31类型参数可带缺省类型左←右复习:函数参数带缺省值template<classT1=char,classT2=int>classA{

T1m1;T2m2;……};又例:template<classT1=int,classT2>classX;//错template<classT1,classT2=int>classY;//对//实例化时只给一个具体类型,给予谁?类模板的其他语法规则13/31A<>a("abc");//缺省实例化A<double>b;

//1个实参A<int,bool>c;//2个实参不要混淆:类型实例化与变量初始化类模板实例化:类型参数带缺省值template<classT1=char,classT2=int>classA{T1m1;T2m2;};intmain(){

//创建对象时A<int,double>c1;//指定两个类型A<bool>c2;//第二类型参数采用缺省类型A<>c3;//两个类型参数都用缺省类型//空的<>不能省略!}类模板的其他语法规则14/31类模板组合内嵌其他类模板的对象template<classU>

classA{A<U>*p;//本类可省略<U>不写。错:A<>*p;};template<classU>classB{A<U>&a,*b;//<U>不可省略,内嵌对象其他模板类的}类模板的其他语法规则15/3116/73类模板派生<T2>不能省略A<tt1>可否?实验分析2个类模板实例化:创建对象构造函数模板特化函数模板实例化用它生成具体的函数(模板函数)——适用多种数据类型类模板实例化用它生成具体的类(模板类)——适用多种数据类型模板特化特殊的实例化对于某种数据类型,不能用模板的通用实例化方法来生成具体的函数或类时,对这种数据类型设计专门的实例化方案——函数模板特化、类模板特化模板特化17/31函数模板特化不能处理t1和t2是char数组的情况专门处理t1和t2是char数组的情况18/31类模板特化完全特化(全特化)对模板的全部类型参数进行特化部分特化(偏特化)对模板的部分类型参数进行特化完全特化下例:类模板特化19/3120/73实例:类模板全特化部分特化template<classT1,classT2>classvector{

//…//};template<classT>//部分特化:还有类型参数Tclassvector<bool,T>//第一个参数为具体类型bool{//第二个参数T没有具体化

//…//};类模板部分特化21/31引入加法例1复数c1=3+4i,c2=5-10i

加法

c=c1+c2=(3+5)+(4-10)i=8-6i加法例2chars1[]="Chi",s2[]="na";

加法

s1

+

s2="China";C++的“+”运算符能实现如此的加法吗?重载“+”,扩展“+”功能,完成新任务

——运算符重载(即运算符函数重载)操作符重载概念22/31返回类型

operator

运算符(形参表){

...//该运算符函数代码}注意:运算符必须是系统定义的,如+,-,=,…不允许重载的运算符.成员访问运算符,如:obj.length().*成员指针访问运算符,如:obj.*pt::域限定符,如:obj::fun()sizeof如:sizeof(int)?:条件运算符,如:x>y?x:y操作符重载的方法运算符函数23/31操作符重载例复数加法例24/31操作符重载例c3=c1+c2

执行函数调用:c3=c1.operator+(c2);25/31运算符函数的重载方式类的成员函数(本讲义)类的友元函数(破坏类封装,不建议)单目/双目运算符重载双目运算符+,执行a+b操作数a和b为A类对象+函数为A类成员函数a+b

等价于a.operator+(b)前置单目运算符++,执行++a++函数不需形参:operator++();后置单目运算符++,执行++aoperator++(int);int参数与前置区别运算符函数26/31单目运算符重载例27/31重载不能改变运算符的操作数个数,例如:><

重载前:二元运算符,需两个操作数重载后:仍是二元运算符*&…既可以是二元运算符,也可以是一元运算符。重载不能改变运算符的优先级,例如:*/优先级高于+-运算符重载函数不能有默认形参否则,改变了参数(操作数)个数重载的运算符功能应与原功能相近,例如:+重载:string对象连接,便于理解操作符重载的限制28/31运算符函数的形参至少有一个是对象或对象的引用,保证重载运算符用于自定义类型(防止修改运算符原功能),例:intoperator+(inta,intb)//错误{return(a-b);}重载赋值运算符=当它执行同类对象的赋值运算时——逐个复制对象的数据成员当对象中有指针成员时,完成对象的“浅拷贝”,因此重载=,完成对象的“深拷贝”。操作符重载的限制29/31重载目的自定义类型的数据不能直接用

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论