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







    一、类模板




    1、类模板引入


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

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

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


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

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


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

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

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


    2、声明类模板语法


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

    template <类型形式参数表>
    class 类模板名称
    {
    	// 类声明
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

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

    typename 泛型类型, typename 泛型类型2, ... , typename 泛型类型n
    
    • 1

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

    • 定义一个泛型 : 在尖括号中只 声明 一个泛型 ;
    template <typename T>  
    
    • 1
    • 定义多个泛型 : 再见括号中 声明 多个泛型 , 泛型之间 使用 逗号隔开 ;
    template <typename T, typename X, typename Y>  
    
    • 1

    类模板示例 : 在下面的 示例 中 , MyClass 是一个类模板 , 在该 类模板 张红使用一个 泛型参数 T 来定义 成员变量 ;

    template <typename T>  
    class MyClass {  
    public:  
        T value;  
        MyClass(T val) : value(val) {}  
        void printValue() {  
            std::cout << value << std::endl;  
        }  
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    3、调用类模板语法


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

    类名<泛型类型> 实例对象名称;
    
    • 1

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

    • 泛型类型为 int 类型的 类模板 调用 :
    MyClass<int> myInt(10); // 创建一个 int 类型的实例  
    myInt.printValue(); 	// 输出:10  
    
    • 1
    • 2
    • 泛型类型为 double 类型的类模板调用 :
    MyClass<double> myDouble(10.0); // 创建一个 double 类型的实例  
    myDouble.printValue(); 		 // 输出:10.0  
    
    • 1
    • 2

    类模板中 , 成员变量 T 类型数据 , 可以指定不同的数据类型 ;





    二、代码示例 - 类模板




    1、代码示例


    代码示例 :

    在下面的代码中 , 声明了类模板 MyClass , 在其中 声明了 T 泛型类型的 成员变量 ;

    创建该 类模板 实例对象 时 , 声明变量时 , 需要先显式指定泛型 T 的类型 , 然后再创建 类对象 ;

    #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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    2、执行结果


    执行结果 :

    10
    10
    hello

    在这里插入图片描述

  • 相关阅读:
    在单片机中什么是FLASH
    数睿通2.0数据接入、数据开发、系统权限、集群监控全面升级
    【自然语言处理】实验3,文本情感分析
    windows10通过coursier安装scala
    外贸SOHO新手指南来了!六大注意事项!
    LeetCode【46】全排列
    【大数据ETL工具,Kettle的学习和使用】
    Keras深度学习框架实战(5):KerasNLP使用GPT2进行文本生成
    2022爱分析· 国央企数字化厂商全景报告
    IReport常见问题及处理方法
  • 原文地址:https://blog.csdn.net/han1202012/article/details/134473741