加qq1126137994 微信:liu1126137994 一起学习更多技术!!!
1、类模板
- 一些类主要用于存储和组织数据元素
- 类中数据的组织方式和数据元素的具体类型无关
- 如 数组类,链表类,stack类,queue类等
C++中将模板的思想应用于类,使类的实现不关心具体的数据元素,而只关心类所需实现的功能
C++中的类模板:
- 以相同的方式处理不同的类型
- 在类声明前以template关键字进行标识
<typename T>
用于说明类中使用泛指类型T
2、类模板的应用
- 只能显示指定具体类型,无法自动推导
- 定义对象时需要使用具体类型
<Type>
定义对象
- 声明的泛指类型T可以出现在类模板的任意地方
- 编译器对类模板的处理方式和函数模板相同
*从类模板通过具体类型产生不同的类
*在声明的地方对类模板进行一次编译
*在使用的地方对参数替换后的代码进行一次编译
#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、类模板的工程应用
- 类模板必须在头文件中定义
- 类模板的实现,不能分开在不同的文件
- 类模板外部定义的函数,需要加上
模板<>
声明
下面是一个程序的头文件:
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、总结
- 泛型编程的思想可以应用于类
- 类模板以相同的方式处理不同的数据类型
- 类模板非常适用于编写数据结构相关的代码
- 类模板在使用时只能显示指定类型