C++函数模板和类模板的区别

435 阅读1分钟

C++函数模板和类模板是两种不同的模板形式,它们具有以下区别:

  1. 函数模板(Function Templates):

    • 函数模板是用于生成函数定义的模板。
    • 函数模板允许在一个通用的函数定义中使用参数来表示类型或值的通用化。
    • 函数模板可以适应多个不同类型的参数。
    • 函数模板最常见的应用是为不同的类型提供相似的操作,例如算术运算、容器操作等。

    示例:

    #include <iostream>
    
    // 定义一个函数模板
    template <typename T>
    T add(T a, T b) {
        return a + b;
    }
    
    int main() {
        // 使用函数模板来计算整数相加
        int result1 = add(5, 3);
        std::cout << "5 + 3 = " << result1 << std::endl;
    
        // 使用函数模板来计算浮点数相加
        double result2 = add(3.5, 2.7);
        std::cout << "3.5 + 2.7 = " << result2 << std::endl;
    
        // 使用函数模板来计算字符相加
        char result3 = add('a', 1);
        std::cout << "'a' + 1 = " << result3 << std::endl;
    
        return 0;
    }
    

    类模板(Class Templates):

    • 类模板是用于生成类定义的模板。
    • 类模板允许在一个通用的类定义中使用参数来表示类型或值的通用化。
    • 类模板可以适应多个不同类型的成员,包括成员变量、成员函数等。
    • 类模板最常见的应用是为不同类型的数据提供通用的数据结构,例如容器、链表等。

    示例:

    template <typename T>
    class Stack {
    private:
        T* elements;
        int top;
        int capacity;
    public:
        Stack(int size) {
            capacity = size;
            elements = new T[capacity];
            top = -1;
        }
        void push(T element) {
            elements[++top] = element;
        }
        T pop() {
            return elements[top--];
        }
    };
    
    Stack<int> intStack(10);  // 实例化类模板,创建一个int类型的栈
    intStack.push(42);
    int value = intStack.pop();
    
    Stack<double> doubleStack(10);  // 实例化类模板,创建一个double类型的栈
    doubleStack.push(3.14);
    double data = doubleStack.pop();
    

总结:函数模板用于生成函数定义的模板,适应多个不同类型的参数,常用于提供相似操作;类模板用于生成类定义的模板,适应多个不同成员类型,常用于提供通用的数据结构。