c++语法-模板

模板

模板是C++中一种强大的特性,允许你编写通用的代码,以便在不同数据类型上重复使用。模板分为函数模板和类模板,它们都是在编译时生成具体代码的蓝图。




1.函数模板

函数模板是一种定义通用函数的方式,可以在不同数据类型上使用相同的代码逻辑。函数模板使用template关键字定义,允许在函数中使用一个或多个类型参数。

语法

template <typename T>
return_type function_name(T parameter1, T parameter2, ...) {
    
    
    // 函数体
}
  • template <typename T>:定义了一个模板,其中T是类型参数,可以在函数内部使用。
  • return_type:函数的返回类型。
  • function_name:函数的名称。
  • T parameter1, T parameter2, ...:函数的参数列表,参数的类型是T

示例

#include <iostream>

// 函数模板示例:计算两个数的最大值
template <typename T>
T max(T a, T b) {
    
    
    return (a > b) ? a : b;
}

int main() {
    
    
    int x = 5, y = 10;
    double d1 = 3.5, d2 = 7.8;

    std::cout << "Max of integers: " << max(x, y) << std::endl;
    std::cout << "Max of doubles: " << max(d1, d2) << std::endl;

    return 0;
}



2.类模板

类模板允许你定义通用的类,其中的数据类型可以作为参数进行指定,以便创建适用于不同数据类型的对象。

语法
template <typename T>
class ClassTemplate {
    
    
public:
    // 类成员和方法
};
  • template <typename T>:定义了一个类模板,其中T是类型参数,可以在类内部使用。
示例
#include <iostream>

// 类模板示例:实现一个通用的栈
template <typename T>
class Stack {
    
    
private:
    T* data;
    int top;
    int capacity;

public:
    Stack(int size) : capacity(size), top(-1) {
    
    
        data = new T[capacity];
    }

    ~Stack() {
    
    
        delete[] data;
    }

    void push(T value) {
    
    
        if (top < capacity - 1) {
    
    
            data[++top] = value;
        }
    }

    T pop() {
    
    
        if (top >= 0) {
    
    
            return data[top--];
        }
        return T(); // 默认构造一个T类型的对象并返回
    }

    bool isEmpty() {
    
    
        return top == -1;
    }
};

int main() {
    
    
    Stack<int> intStack(5);
    Stack<double> doubleStack(3);

    intStack.push(10);
    intStack.push(20);

    doubleStack.push(3.14);

    std::cout << "Int Stack: ";
    while (!intStack.isEmpty()) {
    
    
        std::cout << intStack.pop() << " ";
    }
    std::cout << std::endl;

    std::cout << "Double Stack: ";
    while (!doubleStack.isEmpty()) {
    
    
        std::cout << doubleStack.pop() << " ";
    }
    std::cout << std::endl;

    return 0;
}

注意

模板声明和实现必须放在同一个文件中

因为c++模板的底层是占位符,编译的时候链接编入,如果放在不同文件,调用会出现找不到定义/实现的情况

猜你喜欢

转载自blog.csdn.net/qq_43537701/article/details/132981383
今日推荐