【C++】泛型编程 ⑥ ( 类模板 | 类模板语法 | 代码示例 )

2023-11-19 08:45:07 浏览数 (1)

一、类模板

1、类模板引入

类模板 与 函数模板 的 作用类似 ,

当 多个类 功能相同 , 只是数据类型不同 ,

此时可以 定义一个类模板 代替 定义多个类 ;

借助 " 类模板 " 可以 使用一种模板语法来定义类 , 以实现 处理不同数据类型的类实例 ;

类模板好处 : 使用 类模板 编写出 更加通用和可复用的代码 , 避免重复编写 相同或类似的代码 ;

类模板 常用于 表示 数组 , 线性表 , 树 , 图 等 数据结构 ;

这些数据结构的 节点数据类型 可以使用 类模板 , 同一个数据结构可以存储不同类型的数据 ;

linux 内核链表 就是使用了 类似 类模板 的技术 , 可以存储各种不同类型的数据 , 是一个万能链表 ;

2、声明类模板语法

类模板语法 : 先声明 类型形式参数表 , 然后 使用 类型形式参数表 中的类型 实现 类模板的类声明 ;

代码语言:javascript复制
template <类型形式参数表>
class 类模板名称
{
	// 类声明
}

类型形式参数表 的格式如下 : 由若干 typename 泛型类型 组成 , 多个之间使用逗号隔开 ;

代码语言:javascript复制
typename 泛型类型, typename 泛型类型2, ... , typename 泛型类型n

泛型类型 使用 大写字母表示 , 一般是 T ;

  • 定义一个泛型 : 在尖括号中只 声明 一个泛型 ;
代码语言:javascript复制
template <typename T>  
  • 定义多个泛型 : 再见括号中 声明 多个泛型 , 泛型之间 使用 逗号隔开 ;
代码语言:javascript复制
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、调用类模板语法

调用类模板时 , 首先要 在 类名称后面 使用 尖括号 <> 声明 泛型类型 , 然后创建该 类模板 实例对象 ;

代码语言:javascript复制
类名<泛型类型> 实例对象名称;

上个章节中的 MyClass 类模板使用示例 :

  • 泛型类型为 int 类型的 类模板 调用 :
代码语言:javascript复制
MyClass<int> myInt(10); // 创建一个 int 类型的实例  
myInt.printValue(); 	// 输出:10  
  • 泛型类型为 double 类型的类模板调用 :
代码语言:javascript复制
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

0 人点赞