五十八课 类模板的概念和意义

一、类模板

上节课我们使用泛型编程的思想应用于函数模板,这节课我们就来学习下泛型编程的思想是否可以用类上面呢?

  • 一些类主要用于存储和组织一些数据元素
  • 类中数据组织方式和数据元素的具体类型无关
  • 类模板主要应用数据结构 如数组类、链表类、Stack类、等

C++中将模板的思想应用于类,使得类的实现不关注数据元素的具体类型,而之关注类所实现的具体功能。

1、C++中的类模板

  • 以相同的方式处理不同的类型
  • 在类声明前使用template进行标识
  • <typename T>用于说明类中的使用的泛指类型T
template<typename T>
class Operator
{
public:
  T op(T a,T b);
};

2、类模板的应用

  • 只能显示具体的类型,无法自动推导
  • 使用具体类型<Type>定义对象
Operator<int> op1;
Operator<string>op2;
int i = op1.op(1,2);
string s = op2.op("abc","de");
  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 devide(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("abc","def") << endl;
 
 cout << op2.minus("abc","def") << endl;
 
    return 0;
}

3、类模板的工程应用

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

示例:类模板的工程应用

.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 devide(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>::multiply(T a,T b)
{
   return a * b;
}

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

#endif

.cpp文件

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

using namespace std;


int main()
{
 Operator<int> op1;
 
 cout << op1.add(1,2) << endl;
 cout << op1.minus(4,5) << endl;
 cout << op1.multiply(4,5) << endl;
 cout << op1.devide(10,5) << endl;
 
 
    return 0;
}

小结

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

猜你喜欢

转载自blog.csdn.net/qq_34862658/article/details/81871236