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_    */
  • 相关阅读:
    Ackerman 函数奇怪的函数
    HDU2871 Memory Control 线段树区间合并
    HDU3667 Hotel 线段树 经典空间合并
    图论
    HDU3016 Man Down 线段树
    HDU1878 欧拉回路 判定是否存在欧拉回路
    从今开始
    如何打开注册表编辑器
    ASP.NET中TextBox控件设置ReadOnly="true"后台取不到值
    学习笔记(2011年5月到9月)
  • 原文地址:https://www.cnblogs.com/huangdengtao/p/12011155.html
Copyright © 2011-2022 走看看