zoukankan      html  css  js  c++  java
  • c++模板

    模板一般分函数模板与类模板

    函数模板:

    解决,不同数据进行同种操作时,可以给数据定义一个模板类型,以达到函数的通用性

    基本语法

    //模版函数定义

    template <typename T> //定义模版类型名T

    T test(T x){

    return x;

    }

    test<int>();指定以int型替换T,不指定则系统会参数值自动判断;

    计算绝对值函数:

    #include <iostream>
    using namespace std;
    template <typename T>
    T abs(T temp)
    {
        temp = temp > 0 ? temp : -temp;
        return temp;
    }
    
    int main()
    {
        int  i = 10;
        double d = -5.5;
        cout << abs<int>(i) << " " << abs<double>(d) << endl;
        return 0;
    }

    通过函数模板,计算数值的绝对值,就不用重复为不同类型数据定义函数;

    类模板

    解决同一种类,定义不过数据,或,其成员函数对不同数据作相同处理;

    类模板基本语法:

    template <class T>

    class abs

    {

    private:

      int i;

      T x;

    public:

      abs(T a, T b){}

    }

    类模板对象的创建:

    abs <int> a;

    abs <double> b;

    使用例:

    #include <iostream>
    using namespace std;
    template <class T>
    class Tes
    {
      private:
        T i;
        T j;
    
      public:
        Tes(T x = 0, T y = 0)
        {
            i = x;
            j = y;
        }
        T put()
        {    
            return i * j;
        }
        ~Tes() {}
    };
    int main()
    {
        Tes <int> a(2, 5);
        cout << a.put() <<endl;
        Tes <double> b(2.5, 5.5);
        cout << b.put() <<endl;
        return 0;
    }

    成员函数外部定义方法:

    基本形式:

    template<模板形参列表> 函数返回类型 类名<模板形参名>::函数名(参数列表){函数体},

    template<class T> void Tes<T>::add(参数列表){函数体},

    #include <iostream>
    using namespace std;
    //定义模板类
    template <class T>
    class Tes
    {
      private:
        T i;
        T j;
    
      public:
        Tes(T x = 0, T y = 0)
        {
            i = x;
            j = y;
        }
        T put()
        {    
            return i * j;
        }
        T add();
        ~Tes() {}
    };
    
    //外部定义函数方法
    template <class T>
    T Tes<T>::add()
    {
        return i + j;
    }
    //主函数
    int main()
    {
        Tes <int> a(2, 5);
        cout << a.put() <<endl;
        cout << a.add() <<endl;
        Tes <double> b(2.5, 5.5);
        cout << b.put() <<endl;
        cout << b.add() <<endl;
        return 0;
    }

    总结:

    在类模板中,只要使用到类名的,后面就要有<>的存在;

    结构体模板:(等效于类模板)

    template <class T>

    struct name

    {

      T data;

      name * next;

    }

    //初始化一个结点

    name<int> a;

    最后模板的使用体现形式;

    //函数模板---使用体现:调用函数时传递的参数类型。
    template<class 数据类型参数标识符>
    <返回类型><函数名>(参数表)
    {
        函数体
    }
    
    //结构体模板---使用体现:声明结构元素时 StackNode<类型> s;
    template<class T>
    struct StackNode
    {
      struct T data;
      struct StackNode<T> *next;
    };
    
    //类模板---使用体现:声明类对象时 Stack<类型> s;
    template<class T>
    class Stack
    {
     public:
      T pop();
      bool push(T e);
     private:
      StackNode<T> *p;
    }
    template<class T>//类模板外的 成员函数实现
    T Stack<T>::pop()
    {...}

     更高阶应用http://en.cppreference.com/w/cpp/language/type_alias

  • 相关阅读:
    SQL Server 2008 R2下载地址
    [转]sqlserver2014两台不同服务器上数据库同步
    笔记本(ThinkPad)怎样关闭触摸板
    10 Free Image Hosting Sites for Your Photos
    Photobucket不能用了怎么办?推荐10个在线图片储存服务!
    证书错误 导航已阻止 无法跳转 最终解决
    用websploit获取管理员后台地址
    10 Free Image Hosting Sites for Your Photos
    Css3动画属性总汇
    23个适合logo设计的常用英文字体
  • 原文地址:https://www.cnblogs.com/flowingwind/p/8443849.html
Copyright © 2011-2022 走看看