模板
模板是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++模板的底层是占位符,编译的时候链接编入,如果放在不同文件,调用会出现找不到定义/实现的情况