加qq1126137994 微信:liu1126137994 一起学习更多技术!!!

1、类模板

  • 一些类主要用于存储和组织数据元素
  • 类中数据的组织方式和数据元素的具体类型无关
  • 如 数组类,链表类,stack类,queue类等

C++中将模板的思想应用于类,使类的实现不关心具体的数据元素,而只关心类所需实现的功能

C++中的类模板:

  • 以相同的方式处理不同的类型
  • 在类声明前以template关键字进行标识
  • <typename T>用于说明类中使用泛指类型T

2、类模板的应用

  • 只能显示指定具体类型,无法自动推导
  • 定义对象时需要使用具体类型<Type>定义对象

  1. 声明的泛指类型T可以出现在类模板的任意地方
  2. 编译器对类模板的处理方式和函数模板相同
    *从类模板通过具体类型产生不同的类
    *在声明的地方对类模板进行一次编译
    *在使用的地方对参数替换后的代码进行一次编译
#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、类模板的工程应用

  1. 类模板必须在头文件中定义
  2. 类模板的实现,不能分开在不同的文件
  3. 类模板外部定义的函数,需要加上模板<>声明

下面是一个程序的头文件:
Operater.h

#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);
};

/* 类模板外部定义的函数,需要加上相应的声明Operator<T> */
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>::multiply(T a, T b)
{
    return a * b;
}


template < typename T >
T Operator<T>::divide(T a, T b)
{
    return a / b;
}

#endif

源文件:
main.c

#include <iostream>
#include <string>
#include "Operator.h"

using namespace std;


int main()
{
    /* 定义对象的时候需要显示指定对象的类型 */
    Operator<int> op1;

    cout << op1.add(1, 2) << endl;
    cout << op1.multiply(4, 5) << endl;
    cout << op1.minus(5, 6) << endl;
    cout << op1.divide(10, 5) << endl;

    return 0;
}

4、总结

  1. 泛型编程的思想可以应用于类
  2. 类模板以相同的方式处理不同的数据类型
  3. 类模板非常适用于编写数据结构相关的代码
  4. 类模板在使用时只能显示指定类型