zoukankan      html  css  js  c++  java
  • 第58课.类模板的概念和意义

    1.c++中的类模板

    a.以相同的方式处理不同的类型
    b.在类声明前使用template进行标识
    c.< typename T >用于说明类中使用的泛指类型T

    template < typename T>
    class Operator
    {
    public:
        T op (T a, T b);
    };
    

    2.类模板的应用

    a.只能显示指定具体类型,无法自动推导
    b.使用具体类型定义对象

    Operator<int> op1;
    Operator<string> op2;
    
    int i = op1.op(1, 2);
    string s = op2.op("kun", "123");
    

    注:
    a.声明的泛指类型T可以出现在类模板的任意地方
    b.编译器对类模板的处理方式和函数模板相同
     1).从类模板通过具体类型产生不同的类
     2).在声明的地方对类模板代码本身进行编译
     2).在使用的地方对参数替换后的代码进行编译

    eg:

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    template < typename T >
    class Operator 
    {
    public:
        T add (T a, T b)
        {
            return a + b;
        }
        T minus(T a, T b)
        {
            return a - b;
        }
        T multiply(T a, T b)
        {
            return a * b;
        }
        T divide(T a, T b)
        {
            return a / b;
        }
    };
    
    string operator- (string& l, string& r)
    {
        return "minus";
    }
    
    int main()
    {
        Operator<int> op1;
        
        cout << op1.add(1, 2) << endl;
        
        Operator<string> op2;
        
        cout << op2.add("D.T.", "Software") << endl;
        cout << op2.minus("D.T.", "Software") << endl;
        
        return 0;
    }
    

    3.类模板在工程中的应用

    a.类模板必须在头文件中定义
    b.类模板不能分开实现在不同的文件中
    c.类模板外部定义的成员函数需要加上模板<>声明

    eg:

    #ifndef _OPERATOR_H_
    #define _OPERATOR_H_
     
    template < typename T >
    class Operator 
    {
    public:
        T add(T a, T b);
        T minus(T a, T b);
        T multiply(T a, T b);
        T divide(T a, T b);
    };
    
    template < typename T >
    T Operator<T>::add(T a, T b)
    {
        return a + b;
    }
    
    template < typename T >
    T Operator<T>::minus(T a, T b)  
    {
        return a - b; 
    }
    
    template < typename T>
    T Operator<T>::T multiply(T a, T b)
    {
        return a * b;
    }
    
    template < typename T >
    T Operator<T>::divide(T a, T b)
    {
        return a / b;
    }
    
    #endif /*  _OPERATOR_H_    */
  • 相关阅读:
    HDU 2844 Coins(多重背包)
    HDU 4540 威威猫系列故事——打地鼠(DP)
    Codeforces Round #236 (Div. 2)
    FZU 2140 Forever 0.5
    HDU 1171 Big Event in HDU(DP)
    HDU 1160 FatMouse's Speed(DP)
    ZOJ 3490 String Successor
    ZOJ 3609 Modular Inverse
    ZOJ 3603 Draw Something Cheat
    ZOJ 3705 Applications
  • 原文地址:https://www.cnblogs.com/huangdengtao/p/12011155.html
Copyright © 2011-2022 走看看