一、类模板
1、类模板引入
类模板 与 函数模板 的 作用类似 ,
当 多个类 功能相同 , 只是数据类型不同 ,
此时可以 定义一个类模板 代替 定义多个类 ;
借助 " 类模板 " 可以 使用一种模板语法来定义类 , 以实现 处理不同数据类型的类实例 ;
类模板好处 : 使用 类模板 编写出 更加通用和可复用的代码 , 避免重复编写 相同或类似的代码 ;
类模板 常用于 表示 数组 , 线性表 , 树 , 图 等 数据结构 ;
这些数据结构的 节点数据类型 可以使用 类模板 , 同一个数据结构可以存储不同类型的数据 ;
linux 内核链表 就是使用了 类似 类模板 的技术 , 可以存储各种不同类型的数据 , 是一个万能链表 ;
2、声明类模板语法
类模板语法 : 先声明 类型形式参数表 , 然后 使用 类型形式参数表 中的类型 实现 类模板的类声明 ;
代码语言:javascript复制template <类型形式参数表>
class 类模板名称
{
// 类声明
}
类型形式参数表 的格式如下 : 由若干 typename 泛型类型 组成 , 多个之间使用逗号隔开 ;
代码语言:javascript复制typename 泛型类型, typename 泛型类型2, ... , typename 泛型类型n
泛型类型 使用 大写字母表示 , 一般是 T ;
- 定义一个泛型 : 在尖括号中只 声明 一个泛型 ;
template <typename T>
- 定义多个泛型 : 再见括号中 声明 多个泛型 , 泛型之间 使用 逗号隔开 ;
template <typename T, typename X, typename Y>
类模板示例 : 在下面的 示例 中 , MyClass 是一个类模板 , 在该 类模板 张红使用一个 泛型参数 T 来定义 成员变量 ;
代码语言:javascript复制template <typename T>
class MyClass {
public:
T value;
MyClass(T val) : value(val) {}
void printValue() {
std::cout << value << std::endl;
}
};
3、调用类模板语法
调用类模板时 , 首先要 在 类名称后面 使用 尖括号 <>
声明 泛型类型 , 然后创建该 类模板 实例对象 ;
类名<泛型类型> 实例对象名称;
上个章节中的 MyClass 类模板使用示例 :
- 泛型类型为 int 类型的 类模板 调用 :
MyClass<int> myInt(10); // 创建一个 int 类型的实例
myInt.printValue(); // 输出:10
- 泛型类型为 double 类型的类模板调用 :
MyClass<double> myDouble(10.0); // 创建一个 double 类型的实例
myDouble.printValue(); // 输出:10.0
类模板中 , 成员变量 T 类型数据 , 可以指定不同的数据类型 ;
二、代码示例 - 类模板
1、代码示例
代码示例 :
在下面的代码中 , 声明了类模板 MyClass , 在其中 声明了 T 泛型类型的 成员变量 ;
创建该 类模板 实例对象 时 , 声明变量时 , 需要先显式指定泛型 T 的类型 , 然后再创建 类对象 ;
代码语言:javascript复制#include "iostream"
using namespace std;
// 声明类模板
template <typename T>
class MyClass {
public:
T value;
MyClass(T val) : value(val) {}
void printValue() {
std::cout << value << std::endl;
}
};
int main() {
// 调用类模板
MyClass<int> myInt(10); // 创建一个 int 类型的实例
myInt.printValue(); // 输出:10
MyClass<double> myDouble(10.0); // 创建一个 double 类型的实例
myDouble.printValue(); // 输出:10
MyClass<string> myStr("hello"); // 创建一个 string 类型的实例
myStr.printValue(); // 输出:hello
return 0;
}
2、执行结果
执行结果 :
10 10 hello