什么叫泛型编程?1. 参数类型化。 2. 模板

模板概念

c++提供了函数模板,所谓函数模板,实际上是建立一个通用函数,其函数类型和形参类型不具体制定,用一个虚拟的类型来代表。这个通用函数就成为函数模板。凡是函数体相同的函数都可以用这个模板代替,不必定义多个函数,只需在模板中定义一次即可。在调用函数时系统会根据实参的类型来取代模板中的虚拟类型,从而实现不同函数的功能。

  1. c++提供两种模板机制:函数模板类模板
  2. 类属–类型参数化,又称参数模板

总结

  1. 模板把函数或类要处理的数据类型参数化,表现为参数的多态性,成为类属
  2. 模板用于表达逻辑结构相同,但具体数据元素类型不同的数据对象的通用行为。

函数模板

  1. template <class / typename T> 告诉编译器紧跟的代码出现T不要报错

  2. 类型也需要传入,类型参数化

  3. 自动类型推导

  4. 显示指定类型

     #include<iostream>using namespace std;//交换int 类型的两个文字void mySwaoInt(int &a, int &b){int tmp = a;a = b;b = tmp;}//交换double的数据void mySwapDouble(double &a, double &b){double tmp = a;a = b;b = tmp;}//类型,逻辑又非常相似//类型参数化,泛型编程--模板技术template<class T>//告诉编译器  下面如果出现T不要报错,T是一个通用的类型void mySwap(T &a, T &b){T tmp = a;a = b;b = tmp;}//template<typename T> 等价于template<class T>template<typename T>void mySwap2(){};void test01(){int a = 10;int b = 20;char c1 = 'c';//mySwaoInt(a, b);//1. 自动类型推导,必须有参数类型才可以推导//2.参数类型必须一样//mySwap(a, c1);//推导不出来T,所以不能运行mySwap(a, b);//2.显示指定类型mySwap<int >(a, b);//模板必须要指定出T才可以使用mySwap2<double>();cout << "a=" << a << endl;cout << "b=" << b << endl;double c = 3.14;double d = 1.1;//mySwaoInt(a, b);mySwap(c, d);}int main(){test01();system("pause");return 0;}
    

利用模板实现数组排序

    #include<iostream>using namespace std;//对char 和 int 数组进行排序 ,排序规则 从大到小 利用选择排序template<class T>void mySwap(T &a, T &b){T tmp = a;a = b;b = tmp;}template<class T>void mySort( T arr[], int len){//选择排序for (int i = 0; i < len; i++){int max = i;for (int j = i + 1; j < len; j++){if (arr[max] < arr[j]){//交换 下标max = j;}}if (max != i){//交换数据mySwap(arr[max], arr[i]);}}}//输出数组元素的模板template <class T>void printArray(T arr[], int len){for (int i = 0; i < len; i++){cout << arr[i] << " "; }cout << endl;}void test01(){char charArr[] = "helloword";int num = sizeof(charArr) / sizeof(char);mySort(charArr, num);printArray(charArr, num);int intArr[] = { 1, 4, 100, 34, 55 };int num2 = sizeof(intArr) / sizeof(int);mySort(intArr, num2);printArray(intArr, num2);}int main(){test01();system("pause");return 0;}

函数模板和普通安徽念书在一起调用规则

区别 :普通函数可以进行隐式类型转换,模板不行。

  1. c++编译器优先考虑普通函数

  2. 可以通过空模板实参列表的语法限定编译器只能通过模板匹配

  3. 函数模板可以像普通函数那样可以被重载

  4. 如果函数模板可以产生一个更好的匹配,那么选择模板

     #include<iostream>using namespace std;//1. 普通模板与函数模板区别template <class T>T myPlus(T a, T b){return a + b;}int myPlus2(int a, int b){return a + b;}void test01(){int a = 10;int b = 20;char c = 'c';//a=97.c=99//myPlus(a, c);//类型推导不出来cout << myPlus2(a, c) << endl;//10+99 普通函数  可以进行隐式类型转换}//2. 普通函数和函数模板的调用规则template<class T>void myPrint(T a, T b){cout << "模板调用的myPrint" << endl;}template<class T>void myPrint(T a, T b,T c){cout << "模板调用的myPrint(a,b,c)" << endl;}void myPrint(int a, int b){cout << "普通的函数调用myPrint" << endl;}void test02(){int a = 10;int b = 20;//如果出现重载,优先使用普通模板的调用,如果没有实现普通函数,出现错误//myPrint(a, b);//如果想强制调用模板,那么可以使用空参数列表myPrint<>(a, b);//3. 函数模板可以发生重载int c = 30;myPrint(a, b, c);//如果函数模板可以产生更好的匹配,那么优先使用函数模板char e = 'c';char d = 'd';myPrint(c, d);}int main(){//test01();test02();system("pause");return 0;}
    

c++模板---1(模板概念,利用模板实现数组排序,函数模板调用规则)相关推荐

  1. C++函数模板和普通函数的调用规则

    C++函数模板和普通函数的调用规则: 普通函数可以进行自动类型转换. 函数模板必须严格类型匹配. C++编译器优先考虑普通函数. 如果函数模板可以产生一个更好的匹配,那么选择模板. 可以通过空模板实参 ...

  2. php 打印函数调用栈,利用backtrace和backtrace_symbols函数打印调用栈信息

    本帖最后由 kylin_try 于 2017-2-6 08:41 编辑 在头文件"execinfo.h"中声明了三个函数用于获取当前线程的函数调用堆栈. #include int ...

  3. 模板的概念以及函数模板

    1.模板的概念 模板就是建立通用的模具,其中函数模板可以传进不同类型的实参,大大提高函数的复用性 特点:模板不可以直接使用,要先进行声明,它只是一个通用框架 模板并不是万能的 2.函数模板 c++的一 ...

  4. C++函数模板的详细讲解【函数模板的概念、用法及其模板函数的概念知识】

    目录 前言 C++函数模板的使用 函数模板语法 1.模板说明 2.函数定义 3.函数模板调用 模板函数 函数模板和函数重载 嵌套使用函数模板 函数模板和普通函数在一起,调用规则 在Linux中反汇编查 ...

  5. 泛型编程之函数模板和类模板

    1. 函数模板 C++一种编程思想称为泛型编程,主要利用的技术就是模板 C++提供两种模板机制:函数模板和类模板.这里介绍函数模板,类模板在该专题下的另外篇文章中. 函数模板作用:建立一个通用函数,其 ...

  6. C++设计模式由浅入深(二)—— 类模板和函数模板

    二.类和函数模板 C++的模板编程特性是一个又大又复杂的话题,有许多著作专门传授这种特性和技巧.在本书中,我们会用到许多C++中的高级泛型编程特性.那么我们该如何去理解贯穿次数中的这些语言结构呢?本章 ...

  7. C++笔记7:C++提高编程1:模板—[函数模板和类模板]

    0820 C++提高编程: 1.模板-[函数模板和类模板] 2.初识STL 3.STL-常用容器 4.STL-函数对象 5.STL-常用算法 C++提高编程引言: C++除了面向对象编程思想,还有泛型 ...

  8. [C++再学习系列] 函数模板和类模板

    函数模板和类模板 C++ 提供类模板和函数模板.函数模板允许重载 ,而类模板不允许重载(类无重载概念).类模板可以进行全特化和偏特化,而函数模板仅能够全特化 .因此,写一个看似函数模板偏特化的函数模板 ...

  9. c++ swap函数头文件_C++函数模板(泛型编程)

    模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码. 模板是创建泛型类或函数的蓝图或公式.库容器,比如迭代器和算法,都是泛型编程的例子,它们都使用了模板的概念. 每个容器都有一个单 ...

  10. binarytreenode”使用 类 模板 需要 模板 参数列表_c++1117 模板核心知识(一)—— 函数模板...

    目录 定义函数模板 使用函数模板 两阶段翻译 Two-Phase Translation 模板的编译和链接问题 多模板参数 引入额外模板参数作为返回值类型 让编译器自己找出返回值类型 将返回值声明为两 ...

最新文章

  1. 记一次 MySQL 的慢查优化
  2. 用polt3画曲面_用SolidWorks建模一个:防滑板曲面造型
  3. 有人把机器学习的数学基础整理成了专辑(附下载 )
  4. Python 爬虫使用固定代理IP
  5. 请求微信接口,判断用户是否关注公众号
  6. api 定位 微信小程序 精度_聊聊微信小程序内置地图定位的精确性
  7. Linux内存管理:函数调用图谱-1
  8. idea 代码自动补全突然失效
  9. 设计模式12——代理模式
  10. [转载]数据层的多租户浅谈(SAAS多租户数据库设计)
  11. 扫描版PDF转文字Word(python3)
  12. 燃烧的远征服务器排队小程序,请排队-在线排队叫号微信小程序
  13. 怎么更改计算机管理员的用户名,如何修改系统默认账户administrator
  14. Linux 服务器配置使用密钥登录教程
  15. Avamar 10007报错解决
  16. 关于51/STC单片机中断优先级的调整
  17. 一沙一世界,一叶一春秋
  18. Python爬取数据分析
  19. ElasticSearch启动报错future versions of Elasticsearch will require Java 11; your ---ElasticSearch工作笔记030
  20. 服务器配置文档模板,部署文档模板.doc

热门文章

  1. Python之字符串转换为日期、结合时区的日期操作
  2. Spark2.3(三十五)Spark Structured Streaming源代码剖析(从CSDN和Github中看到别人分析的源代码的文章值得收藏)...
  3. Python API简单验证
  4. 模块 hashlib模块
  5. React的生命周期
  6. cocos2dx 3.x 蒙板 遮罩 点击圆功能
  7. 初识openstack
  8. 极光推送JPush的快速集成
  9. 商海致富独家秘诀:微笑可以当钱花
  10. 天津科技大学计算机学院复试分数线,2021天津科技大学研究生复试分数线