博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++模板&泛型编程
阅读量:6994 次
发布时间:2019-06-27

本文共 3045 字,大约阅读时间需要 10 分钟。

---恢复内容开始---

一、泛型编程

      定义:编写与类型无关的逻辑代码,是代码复用的一种手段。模板是泛型编程的基础

      模板分为:函数模板和类模板

      函数模板:代表了一个函数家族,该函数与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。

      函数模板的格式:template<typename p1,typename p2,...,typename p>   //typename和class都可以定义模板参数一般建议使用typelate好理解和类关键字区分

                            返回值类型  函数名(参数列表)                           

                           {...}   

     模板是蓝图,本身不是类或者函数,编译器用模板产生特定的类或者函数的特定类型版本,产生模板特定类型的过程成为模板的实类化  

     

定义模板关键字:T是模板参数名字可以任意命名,下面代码返回值是T类型这个很重要  1 template
2 T Add(T left,T right) 3 { 4 return left+right; 5 } 6 7 int main() 8 { 9 cout<
<
这个返回值是T1,配合下面代码就是int ,函数返回值类型很重要,所以这里还是认真点  1 template
2 T1 Add(T1 left,T2 right) 3 { 4 return left+right; 5 } 6 7 int main() 8 { 9 cout<
<

模板函数也可以定义为inline函数

1 template
2 inline T2 Add(T1 left,T2 right) 3 { 4 return left+right; 5 } 6 7 int main() 8 { 9 cout<
<

  模板参数:

    模板函数有两种类型形参:模板参数和调用参数

    模板形参分为:类型形参和非类型形参

//模板形参名字只能在模板形参之后到模板声明或定义的末尾之间使用,遵循名字屏蔽规则  1 typedef int T; 2 template
3 void FunTest(T t) 4 { 5 cout<<"t type = "<
<

eg:判断下面函数定义是否有问题

1 //template
2 //void F1(T,U,V); 3 //模板参数不能这样定义,模板参数前必须加上定义模板参数关键字class或者typeame 4 //template
5 //T F2(int &T); 6 7 //template
8 //T F3(T,T); 9 //typedef int TYPENAME;10 //template
11 //TYPENAME F4(TYPENAME);

模板函数重载:

主要看看下列情况调用哪个函数  1 int Max(const int& left,const int& right)//1 2 { 3     return (left>right)?left:right; 4 } 5 template
//2 6 T Max(const T& left,const T&right) 7 { 8 return (left>right)?left:right; 9 }10 template
//311 T Max(const T& a,const T& b,const T& c)12 {13 return Max(Max(a,b),c);14 }15 int main()16 {17 Max(10,20,30);//318 Max<>(10,20);//219 Max(10,20); //120 Max(10,20.0);//121 Max
(10.0,20.0);//222 Max(10.0,20.0);//223 return 0;24 } //注意:函数的所有重载版本的是声明都应该位于该函数被调用位置之前

二、模板函数特化

    在某些情况下,通用模板定义对于某个类型可能是完全错误的,或者不能编译,或者做一些错误的事情

    

1 template
2 int compare(T t1,T t2) 3 { 4 if(t1>t2) 5 return 1; 6 else if(t1

     模板函数特化形式:

        1、关键字template后面跟一个空的<>

        2、再接模板名和<模板形参>

        3、函数形参表

        4、函数体

 

三、模板类

      模板类型格式

      template<typename p1,typename p2,...,typename p>

      class 类名 

      {...}

eg: 1 template
2 class SeqList3 {4 private:5 T* _Data;6 int _size;7 int _capacity8 }
1 //以模板方式实现动态顺序表 2  3 template
4 class SeqList 5 { 6 public: 7 SeqList(); 8 ~SeqList(); 9 private:10 int _size;11 int _capacity;12 T* _Data;13 };14 template
15 SeqList
::SeqList()16 :_size(0)17 ,_capacity(10)18 ,_Data(new T[_capacity])19 {}20 template
21 SeqList
::~SeqList()22 {23 delete []_Data;24 }25 void FunTest()26 {27 //SeqList Seq;28 SeqList
s1;29 SeqList
s2;30 } //有一种不同的类型编译器就会实类化出对应的一个类

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

---恢复内容结束---

转载于:https://www.cnblogs.com/JN-PDD/p/6028803.html

你可能感兴趣的文章
凸包问题的描述(Graham法)
查看>>
失败的沟通与成功的沟通
查看>>
学习技术,从何谈起
查看>>
android中按back键返回上一个activity,如何重新调用上一个activity的oncreate方法?...
查看>>
Ubantu 安装boost环境
查看>>
学号:201621123032 《Java程序设计》第13周学习总结
查看>>
本学期阅读计划
查看>>
Programming Ability Test学习 2-13. 两个有序序列的中位数(25)
查看>>
DOM&&BOM
查看>>
JavaScript严格模式总结
查看>>
07-图
查看>>
20145127《java程序设计》第四周学习总结
查看>>
idea中,使用facets添加完web后,项目已变为web项目,但web.xml中内容经常变为红色,并报错,如何解决?...
查看>>
今晚目标代理模式和迭代器模式
查看>>
http_build_query函数(学习)
查看>>
具有头结点的单链表
查看>>
创建快捷方式
查看>>
选与不选之DFS
查看>>
WinForm 托盘控制应用
查看>>
django自定义模板过滤
查看>>