• c++中模板是什么?为什么要定义模板?


    一、c++中模板是什么?

    首先:

    1 int Max(int x, int y)
    2 {
    3     return x > y ? x : y;
    4 }
    5 
    6 float Max(float a,float b)
    7 {
    8     return a > b ? a : b;
    9 }

    通常我们想要比较不同数据类型的时候不得不定义两种不同的函数来表示区分,为了能精简代码和避免强类型的严格性和灵活性的冲突,我们就需要用到模板去改善这种情况。

    二、为什么要定义模板?

    强类型程序设计中,参与运算的所有对象的类型在编译时即确定下来,并且编译程序将进行严格的类型检查。为了解决强类型的严格性和灵活性的冲突。有以下3种方式解决:

    1)带参数宏定义(原样替换)

    2)重载函数(函数名相同,函数参数不同)

    3)模板(将数据类型作为参数)

    模板的使用中函数模板类模板用的最广最繁。

    函数模板

    定义:

    template <模板参数表>

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

    {

      //函数体

    }

    注:class或typename修饰的类型参数,代表一种类型;非类型参数表达式,可以是int,long,long long类型,使用已知类型符,代表一个常量

     1 //1.函数模版的隐式实例化
     2 #include <iostream>
     3 using namespace std;
     4 
     5 template <class T>
     6 T Max(T x, T y);    //函数模版的申明
     7 
     8 int main()
     9 {
    10     int intX = 1, intY = 2;
    11     double dblX = 3.9, dblY = 2.9;
    12     cout << Max(intX, intY) << endl;    //实参为int型,生成int型模板函数,并对第二个参数进行检查
    13     //或者cout << Max<int>(intX, intY) << endl;
    14     cout << Max(dblX, dblY) << endl;    //实参为double型,生成double型模板函数,并对第二个参数进行检查
    15     //或者cout << Max<double>(dblX, dblY) << endl;
    16     cout << Max(dblY,intX) << endl; //模板函数做不到两个参数类型不一致还可以比较
    17 
    18     return 0;
    19 }
    20 
    21 template <class T>
    22 T Max(T x, T y)        //函数模版的实现
    23 {
    24     return (x > y ? x : y);
    25 }
     1 //2.函数模板和函数模板的重载
     2 #include <iostream>
     3 using namespace std;
     4 
     5 template < class T >
     6 T Max(T x, T y);
     7 
     8 template <class T>
     9 T Max(T x, T y, T z)
    10 {
    11     return x > y ? (x > z ? x : z) : (y > z ? y : z);
    12 }
    13 
    14 int main()
    15 {
    16     int intX = 1, intY = 2, intZ = 3;
    17     double dblX = 3.0, dblY = 2.9;
    18 
    19     cout << Max<int>(intX, intY) << endl;    //调用实例化的Max(int,int)
    20     cout << Max<int>(intX, intY, intZ) << endl;    //调用实例化的Max(int,int,int)
    21     cout << Max<double>(dblX, dblY) << endl;    //显示实例化为double型,生成double型模板函数
    22     cout << Max('A', '8') << endl;            //隐式实例化char型,生成char型模板函数
    23     return 0;
    24 }
    25 
    26 template <class T>
    27 T Max(T x, T y)
    28 {
    29     return x > y ? x : y;
    30 }

    类模板

    定义:

    template<模板参数表>

    class 类名

    {

    }

    下面给出一个栈的模板实现类:

      1 #include <iostream>
      2 using namespace std;
      3 
      4 #define MaxSize 10
      5 
      6 template <class T>
      7 class CStack
      8 {
      9 private:
     10     T data[MaxSize];
     11     int top;
     12 public:
     13     CStack():top(-1)
     14     {
     15     }
     16     void Push(void);
     17     void Pop(void);
     18     bool ifEmpty()
     19     {
     20         if(top == -1)
     21             return true;
     22         else
     23             return false;
     24     }
     25     bool ifFull()
     26     {
     27         if(top == MaxSize-1)
     28             return true;
     29         else
     30             return false;
     31     }
     32     T getTop(void)
     33     {
     34         if(ifEmpty())
     35         {
     36             cout<<"栈为空,不能取栈顶!"<<endl;
     37             return -1;
     38         }
     39         return this->data[top];
     40     }
     41 };
     42 
     43 template <class T>
     44 void CStack<T>::Push(void)
     45 {
     46     if(ifFull())
     47     {
     48         cout<<"栈已满,不能入栈!"<<endl;
     49         return ;
     50     }
     51     T a;
     52     cin>>a;
     53     this->data[++top] = a;
     54     cout<<"元素"<<a<<"入栈!"<<endl;
     55 }
     56 
     57 template <class T>
     58 void CStack<T>::Pop(void)
     59 {
     60     if(ifEmpty())
     61     {
     62         cout<<"栈为空,不能出栈!"<<endl;
     63         return ;
     64     }
     65     T temp = this->data[top--];
     66     cout<<"元素"<<temp<<"出栈!"<<endl;
     67 }
     68 
     69 
     70 int main()
     71 {
     72     CStack<int> s1;    //可以自己更换数据类型int
     73     int i;
     74     do
     75     {
     76         cout<<"	===============================
    ";
     77         cout<<"	*********顺序栈类模板**********
    ";
     78         cout<<"	           1.入栈              
    ";
     79         cout<<"	           2.出栈              
    ";
     80         cout<<"	           3.取栈顶            
    ";
     81         cout<<"	           0.退出              
    ";
     82         cout<<"	*******************************
    ";
     83         cout<<"	===============================
    ";
     84         do
     85         {
     86             cout<<"	please input your operator:";
     87             cin>>i;
     88             system("cls");
     89         }while(i!=1 && i!=2 && i!=3 && i!=0);
     90         switch(i)
     91         {
     92         case 1:
     93             s1.Push();
     94             system("pause");
     95             system("cls");
     96             break;
     97         case 2:
     98             s1.Pop();
     99             system("pause");
    100             system("cls");
    101             break;
    102         case 3:
    103             if(-1 == s1.getTop())
    104             {
    105                 system("pause");
    106                 system("cls");
    107                 break;
    108             }
    109             else
    110                 cout<<"栈顶元素为:"<<s1.getTop()<<endl;
    111             system("pause");
    112             system("cls");
    113             break;
    114         }
    115     }while(i != 0);
    116 }
  • 相关阅读:
    四叉树平面分割算法快速图元搜索
    dataGridView的行号
    记一次部署系列:prometheus+exporter+alertmanager+pushgateway+cAdvisor+Grafana
    记一次部署系列:grafana配置特定指标进行邮件告警
    记一次部署系列:prometheus配置通过alertmanager进行邮件告警
    记一次部署系列:prometheus通过pushgateway配置自定义监控项
    ArrayList方法原理解析
    从一个类上获取不到注解的原因
    Keycloak 入门实战(1)简介
    Keycloak 入门实战(2)安装
  • 原文地址:https://www.cnblogs.com/Hwangzhiyoung/p/8624369.html
Copyright © 2020-2023  润新知