泛型程序设计之模版 :

C++提高代码可重用性一般体现在两个地方,一个是继承,一个是泛型程序设计中的模版。泛型程序设计就是指一种算法在实现时不指定特定的数据类型的程序设计方法。所谓泛型,就是指算法只需要实现一遍,并且能够适应多种数据类型,可以减少重复代码的编写。也可以说泛型程序设计就是编写大量的模版,模版就是编写一遍算法适用于不同的数据类型,模版可以分为函数模版和类模版两种。

  1. 函数模版

函数模版提高了代码的可重用性和可扩充性,就是相当于自己制造了一个模具所有的东西都可以通过这个模具批量生成,由模板生成的函数叫做模板函数,函数模版的语法说明。

template <class T1,class T2,......> // class 代表参数的类型,类型可以用在声明参数,也可以用在声明返回值类型。
返回值 模板名 (也可以叫函数名) 形参表 {函数体
}比如 :
template <class T> /
void Swap (T & a,T & b) {T temp = a;a = b;b = temp;
}

拿上面的 swap 函数来说,有了这个模版以后,编译器会根据参数类型需要生成多了 swap 函数,这样就增大了代码的可重用性和可扩充性。

模板生成函数的原理 :
编译器由模板生成模板函数的时候,会使用具体的类型对模板中所有的类型进行替换,其它部分则原封不动的保留。编译器编译该语句的时候,会根据实参的类型判断如何替换模板中的数据类型。

函数调用中调用语句的匹配顺序

  1. 先找类型完全相同的普通函数
  2. 再找类型完全匹配的模版函数
  3. 最后找可以进行自动类型转化后可以匹配的模板函数
  4. 找不到 报错 !

函数模板实例

#include <iostream>using namespace std;const int maxn = 1005;template <class T,class Pred>
void Map (T a,T b,T c,Pred op) {for (;a != b; ++ a, ++ c) {*c = op (*a);}
}double cube (double x) {return x * x * x;
}double square (double x) {return x * x;
}
double b[5];void print () {for (int i = 0;i < 5; ++ i) {cout << b[i] << endl;}
}double a[5] = {1,2,3,4,5};
int main () {Map (a,a + 5,b,cube);print();Map (a,a + 5,b,square);print();return 0;
}

2.类模版
人们为了减少编写相似的函数,便出现了函数模版,人们为了减少编写相似的类于是也就出现了类模板,编译器可以从类模版中生成多个类,减少程序员的劳动。由模板产生的类叫做模板类

C++ 中类模板的语法如下 :

template <class T1,...>  //类型参数表
class 类模版名 (也可以叫类名) {成员变量 和 成员函数;
}类模板的实例化需要在实例化的时候就指明参数类型
类模版名 <真实类型参数表> 对象名 (构造函数实参表)
这样实例化类模版类模版的成员函数在定义的时候还是需要这样写 (就是模板部分要写出来)template <class T1,class T2>
bool Pair <T1,T2>:: operator < (const Pair <T1,T2> & p) const {return key < p.key;
}像这样才可以定义成员函数

类模板的实例

#include <iostream>
#include <cstring>
#include <string>
using namespace std;template <class T1,class T2>
class Pair {public :T1 key;T2 value;Pair (T1 k,T2 v) : key (k),value (v) {};bool operator < (const Pair <T1,T2> & p) const;
};template <class T1,class T2>
bool Pair <T1,T2>:: operator < (const Pair <T1,T2> & p) const {return key < p.key;
}int main () {ios_base :: sync_with_stdio(false);Pair <string,int> student ("Tom",19); //实例化一个类cout << student.key <<' ' << student.value << endl;return 0;
}

不明白的地方看代码体会一下就好了。

C++ 泛型程序设计 模板相关推荐

  1. Part10 泛型程序设计与C++标准模板库 10.1泛型程序设计及STL的结构

    1泛型程序设计的基本概念 泛型程序设计: 编写不依赖于具体数据类型的程序 将算法从特定的数据结构中抽象出来,成为通用的 C++的模板为泛型程序设计奠定了关键的基础 术语:概念 用来界定具备一定功能的数 ...

  2. (P72)stl(一):泛型程序设计,什么是STL,STL六大组件及其关系

    文章目录 1.泛型程序设计 2.什么是STL 3.STL六大组件及其关系 1.泛型程序设计 泛型编程(generic programming) 类属编程 将程序写得尽可能通用 将算法从数据结构中抽象出 ...

  3. Java通过泛型的模板类型实例化对象

    Java通过泛型的模板类型实例化对象 最近自己研究了下mvvm框架,使用泛型的方式可节省很多代码,并且可以合并很多冗余代码,为了最大化的精简代码想到了通过泛型的type用反射的方式实例化对象,这样对象 ...

  4. 结合泛型与模板的STL.NET

    开始之前,先来看一个笑话,当问一个C++程序员怎样完成一个给定的任务时,他(她)可能会提供一打或更多的潜在解决方案列表,但又会极其详细地标出每种方案的问题之处,让你不知所措,难以选择.而Visual ...

  5. Java基础语法十二 泛型程序设计

    1 意义 泛型程序设计意味着编写的代码可以被很多不同类型的对象所重用. 常见应用 : ArrayList 2 K T V E ? object等的含义 类型变量使用大写形式 E – Element ( ...

  6. java泛型程序设计——反射和泛型

    [0]README 0.1) 本文描述+源代码均 转自 core java volume 1, 旨在理解 java泛型程序设计 的 反射和泛型 的相关知识: [1]反射和泛型相关 1.1)现在, Cl ...

  7. java泛型程序设计——无限定通配符+通配符捕获

    [0]README 0.1) 本文描述+源代码均 转自 core java volume 1, 旨在理解 java泛型程序设计 的 无限定通配符+通配符捕获 的相关知识: [1]无限定通配符相关 1. ...

  8. java泛型程序设计——通配符类型+通配符的超类型限定

    [0]README 0.1) 本文描述+源代码均 转自 core java volume 1, 旨在理解 java泛型程序设计 的 通配符类型+通配符的超类型限定 的知识: [1]通配符类型相关 1. ...

  9. java泛型程序设计——泛型类型的继承原则

    [0]README 0.1) 本文描述+源代码均 转自 core java volume 1, 旨在理解 java泛型程序设计 的 泛型类型的继承原则 的知识: [1]泛型类型的继承原则相关 1.1) ...

最新文章

  1. 你会去创建一个线程去处理压缩日志并删除吗?
  2. 用C语言实现扫雷小游戏(附上思路+项目展示+源代码)
  3. 如何通过Restful API的方式读取SAP Commerce Cloud的Product图片
  4. ArrayList和LinkedList类的用法及区别
  5. Pyinstaller打包: 将资源文件或文件夹打包到最后生成的exe中
  6. 怎么查看linux硬盘多路径,linux下磁盘多路径
  7. 使用.NET Mobile API即51Degrees.mobi检测User-Agent
  8. 03. Django基础:URL和视图函数
  9. 微信公众号——分享给朋友/分享至朋友圈(Vue)
  10. android 豁免的广播及广播白名单,浅谈BLE地址、隐私机制、白名单、定向广播
  11. 2020华为春招面试:一面二面三面(一下午4h左右完成)已挂
  12. 怎么把PDF分割成几个文件?分享几种分割方法
  13. 面试施工员的时候你知道会问什么问题吗?
  14. 有限长信号自相关函数的估计
  15. xset 关闭屏幕保护-关闭节电模式
  16. 6轴机械手控制系统DEMO
  17. 卸载sql sever2022全过程
  18. Postgresql更改字段默认值、设置字段默认值、删除字段默认值
  19. 【转】双臂电桥测低电阻
  20. Java插入排序(思路及实现)

热门文章

  1. 揭秘天河二号超级计算机的护卫队
  2. 1、PNP和NPN的简单识别和使用
  3. 【Python】pip和Anaconda添加清华镜像源
  4. linux参考文献_Linux (Unix) 的基本(一)
  5. Sa-Token简单登录认证
  6. 用 AI 算法让你的圣诞斗图“凡尔赛”起来~
  7. 信仰会给你无穷的力量
  8. Threejs画椭圆
  9. 卡西欧(casio)-SGW-100 磁偏角矫正(电子指南针数码罗盘矫正)
  10. 设计模式之 工厂方法模式&&抽象工厂模式