C++ 模板初阶

打印 上一主题 下一主题

主题 870|帖子 870|积分 2610

目录
一、媒介
二、正文
1、函数模板 
1.1函数模板概念
1.2函数模板格式
1.3函数模板的原理
1.4函数模板的实例化
1.5模板参数的匹配原则
2.类模板
2.1类模板的定义格式
2.2类模板函数化 
3.template与typedef的区别
三、结言


一、媒介

   据说C++创建初期,很多人是对C++这一门新型语言是不感冒的,因为他们认为C++和C语言并没有明确的区别,当C++推出——模板,这一功能的时候才被更多人承认。今天我们将要学习的就是模板中的初阶部门。
  二、正文

   当我们想要实现将多个数据范例的变量进行交换,我们该如何利用呢,是写多个Swap交换函数?这样就显得很冗余。
  
这个时候就必要借助我们的模板功能了,我们可以创建一个通用的模板函数,让他适应全部范例的数据。
   

  你是什么范例数据,我就给你生成是什么数据范例的函数。
  1、函数模板 

1.1函数模板概念

   函数模板代表一个函数家族,该函数模板与范例无关,在利用时被参数化,根据实参范例产生函数的特定范例版本。
  1.2函数模板格式

   template<typename T1,typename T2......> 大概template<calss T1,class T2......>。
  

  值得注意的是:标号1必须和标号1下面的函数搭配利用才是模板函数,不然就会报错。
  

  如上图所示可知,template<typename T1,typename T2......>必须和函数搭配起来利用。
  1.3函数模板的原理

   函数模板是一个蓝图,它本身并不是函数 ,是编译器用利用方式产生特定详细范例函数的模具。
  所以其实模板就是将本应该我们做的重复的事情交给了编译器。
  

  (大家放心利用,上面的图片是我扣我学习课件上的)
  在编译器编译阶段,对于函数模板的利用,编译器必要根据输入的实参范例来推演生成对应范例的函数以供调用。比如:当用double范例利用函数模板时,编译器通过对实参范例的推演,将T确定为double范例,然后产生一份专门处理double范例的代码,对于字符范例也是如此。
  1.4函数模板的实例化

   用不同范例的参数利用函数模板时,称为函数模板的实例化。模板参数实例化分为:隐式实例化和显式实例化。
  

  
  

  上面这个情况我们在不改变模板函数的情况下,该如何正常运行呢?
  

  我们可以通过逼迫隐式范例转换大概显式实例化来解决这个问腿。
  1.5模板参数的匹配原则

   

  • 1.一个·非模板函数可以和一个同名的函数模板同时存在,而且该函数模板还可以 被实例化为这个非模板函数。
  

  

  • 2.对于非模板函数和同名函数模板,如果其他条件相同,在调用时会优先调用非函数模板函数而不会从函数模板中生成出一个实例。如果模板可以生成一个具有更好匹配的函数,那么将选择函数模板来生成一个实例,以便更好的满足实际必要。
  

  

  • 3.模板函数不允许主动范例转换,但普通函数可以主动范例转换。
  2.类模板

2.1类模板的定义格式

   

  1. #include<iostream>
  2. using namespace std;
  3. //类模板
  4. template<class T>
  5. class stack  //stack是类名
  6. {
  7. public:
  8.         stack(int capacity = 4)
  9.         {
  10.                 _array = new T[capacity];
  11.                 _capacity = capacity;
  12.                 _size = 0;
  13.         }
  14.         void Push(const T& data)
  15.         {
  16.                 //扩容
  17.                 _array[_size] = data;
  18.                 ++_size;
  19.         }
  20. private:
  21.         T* _array;
  22.         int _capacity;
  23.         int _size;
  24. };
  25. int main()
  26. {
  27.         stack<int > st1;//栈存储的是int类型
  28.         stack<double> st2;//栈存储的是double类型
  29.         return 0;
  30. }
复制代码
2.2类模板函数化 

   类模板实例化与函数模板实例化不同,类模板实例化必要在类模板名字后跟< >,然后将实例化的范例放在< >中即可,类模板名字不是真正的类,而实例化的效果才是真正的类。
  

  3.template与typedef的区别

   看到前面大家大概感觉template与我们之前学习的typedef有点相似,都是想将A在后文中都被替换成B。
  比方typedef int typedata。在后续代码中全部的typdata都是int。
  但是template与typedef还是有所区别的,typedef只能针对一个函数,而template则可以针对全部范例的数据生成相对应的函数。
  

  比方上面就是template函数的优势,只要写出了类模板函数,我们既可以生成存储int范例德栈,也可以生成double范例的栈。
  而typedef则不能到达这个效果,它只能正对某个特定的函数,我们想改变其栈存储的范例,还得手动改变其范例。
  三、结言

   今天的模板初阶就分享到这了,同学们我们下期再见~
  
 

  


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

怀念夏天

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表