• 【C++】泛型编程 ⑦ ( 类模板常用用法 | 类模板声明 | 类模板调用 | 类模板作为函数参数 )







    一、类模板基础用法




    1、类模板声明定义


    上一篇博客中 , 【C++】泛型编程 ⑥ ( 类模板 | 类模板语法 | 代码示例 ) 讲解了模板类的基础语法 , 模板类声明如下 :

    // 声明类模板
    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
    • 10

    2、类模板使用


    模板类声明后 ,

    // 声明类模板
    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
    • 10

    使用 模板类 创建 实例对象时 ,

    首先 , 要进行 具体类型 初始化 , 该操作就是在 模板类 后面的 尖括号中 , 注明 泛型类型 ;

    MyClass<int>
    
    • 1

    此时 , 注明 泛型类型后 , 就会生成 具体的类 ;

    然后 , 使用 具体的类 , 定义 具体的 变量 ;

    MyClass<int> myInt(10);
    
    • 1

    3、类模板做函数参数


    类模板 作为函数参数 , 形参 必须是具体类型 , 也就是 类模板 的泛型类型必须声注明 ;

    下面的 fun 函数中 , 接收模板类作为参数 , 模板类的 泛型类型 需要被注明 ;

    // 类模板对象作为函数参数
    // 形参必须是具体类型
    // 类模板的泛型类型必须声注明
    void fun(MyClass<int> &a)
    {
        a.printValue();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    如果不指定 泛型类型 , 会报错 error C2955: “MyClass”: 使用 类 模板 需要 模板 参数列表 错误 ;

    1>------ 已启动生成: 项目: HelloWorld, 配置: Debug Win32 ------
    1>Test.cpp
    1>Y:\002_WorkSpace\002_VS\HelloWorld\HelloWorld\Test.cpp(18,18): error C2955: “MyClass”: 使用 类 模板 需要 模板 参数列表
    1>Y:\002_WorkSpace\002_VS\HelloWorld\HelloWorld\Test.cpp(6): message : 参见“MyClass”的声明
    1>Y:\002_WorkSpace\002_VS\HelloWorld\HelloWorld\Test.cpp(20,18): error C2662:void MyClass<T>::printValue(void): 不能将“this”指针从“MyClass”转换为“MyClass<T> &1>Y:\002_WorkSpace\002_VS\HelloWorld\HelloWorld\Test.cpp(20,18): message : 原因如下: 无法从“MyClass”转换为“MyClass<T>1>Y:\002_WorkSpace\002_VS\HelloWorld\HelloWorld\Test.cpp(20,5): message : 转换要求第二个用户定义的转换运算符或构造函数
    1>Y:\002_WorkSpace\002_VS\HelloWorld\HelloWorld\Test.cpp(10,10): message : 参见“MyClass<T>::printValue”的声明
    1>Y:\002_WorkSpace\002_VS\HelloWorld\HelloWorld\Test.cpp(39,15): error C2664:void fun(MyClass &): 无法将参数 1 从“MyClass<int>”转换为“MyClass &1>Y:\002_WorkSpace\002_VS\HelloWorld\HelloWorld\Test.cpp(18,6): message : 参见“fun”的声明
    1>已完成生成项目“HelloWorld.vcxproj”的操作 - 失败。
    ========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0==========
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12




    二、完整代码示例




    1、代码示例


    下面的示例中是一个 C++ 模板类 MyClass 的定义 ; 这个类可以接受一个类型参数T , 并创建一个具有该类型的成员变量的对象 ;

    MyClass是一个模板类 , 该模板类 接受一个 泛型类型参数T , 泛型类型参数 T 在类中的许多地方都会用到 , 在类体中定义了一个 T 类型的成员变量 value , 以及一个接受T类型参数的构造函数 , 在printValue函数中 , 打印 value 的值 ;

    template 是模板声明 , 告诉编译器我们将在后面定义一个类模板 , 其中T是一个类型参数 ;

    在类模板中 , 所有使用T的地方都可以被任何类型替换 ;


    MyClass myInt(10); 中的 是模板参数 , 表示这个类的类型参数是 int ;

    myInt(10) 是创建了一个 MyClass 的实例对象 , 并使用 (10) 进行初始化 ;


    #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;
        }
    };
    
    // 类模板对象作为函数参数
    // 形参必须是具体类型
    // 类模板的泛型类型必须声注明
    void fun(MyClass<int> &a)
    {
        a.printValue();
    }
    
    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
    
    
        // 类模板作为 函数参数
        MyClass<int> myInt2(88);
        fun(myInt2);
    
    	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
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42

    2、执行结果


    执行结果 :

    10
    10
    hello
    88
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

  • 相关阅读:
    03-JavaScript-函数
    Python 全栈系列200 Redis Agent
    uni-app入门:wxs基本使用
    【Leetcode】【每日一题】【简单】2609. 最长平衡子字符串
    线程的创建和状态(操作系统和java)
    【数据结构】二叉树--顺序结构及实现 (堆)
    外包干了3个月,技术退步明显。。。。。
    selenium判断元素可点击、可见、可选
    广州市车联网先导区LTE-V2X 车载直连通讯设备技术规范
    六、软考-系统架构设计师笔记-软件工程基础知识
  • 原文地址:https://blog.csdn.net/han1202012/article/details/134482321