C++中的模板类是一种泛型编程技术,它允许我们编写针对不同数据类型的通用类模板,可以减少代码量,提高效率。
模板类的定义
模板类定义可以采用下面的格式:
template <class T>
class class_name {
// 类成员定义
};
其中 class T
表示定义了一个泛型类型 T
,可以在类中使用。在类成员定义时,可以使用泛型类型 T
代替实际的类型。
模板类的实例化
当使用模板类时,必须为 T
指定一个实际的类型。例如:
class_name<int> obj1; // 将 T 替换为 int
class_name<double> obj2; // 将 T 替换为 double
模板类的示例
下面是一个简单的模板类示例,它实现了一个长度固定的数组类 Array
,使用泛型类型 T
代表数组元素的类型:
template <class T, int N>
class Array {
private:
T data[N];
public:
void set(int i, T x) {
data[i] = x;
}
T get(int i) {
return data[i];
}
int size() {
return N;
}
};
在上面的定义中,T
表示数组元素的类型,N
表示数组的长度。因为 N
是一个常量,所以我们使用了模板类的另一种形式来定义它。
我们可以用以下方式实例化模板类 Array
:
Array<int, 5> arr1;
Array<double, 10> arr2;
因为 Array
是一个模板类,所以在定义时我们必须指定模板参数 int
和 double
。
下面是一个使用 Array
类的示例:
Array<int, 5> arr;
for (int i = 0; i < arr.size(); i++) {
arr.set(i, i * 2);
}
for (int i = 0; i < arr.size(); i++) {
std::cout << arr.get(i) << std::endl;
}
在上面的示例中,我们创建了一个长度为 5 的 Array
对象 arr
,并设置了每个元素的值。然后,我们依次打印出了每个元素的值。
另一种示例
下面是另一个使用模板类的示例,它定义了一个通用的 Stack
类,可以用来实现任何类型的栈功能:
template <class T>
class Stack {
private:
std::vector<T> data;
public:
void push(T item) {
data.push_back(item);
}
T pop() {
T item = data.back();
data.pop_back();
return item;
}
T peek() {
return data.back();
}
bool empty() {
return data.empty();
}
};
在上面的定义中,T
表示栈元素的类型。
下面是一个使用 Stack
类的示例,它实现了一个整数栈:
int main() {
Stack<int> stack;
stack.push(1);
stack.push(2);
stack.push(3);
while (!stack.empty()) {
std::cout << stack.pop() << std::endl;
}
return 0;
}
在上面的示例中,我们创建了一个 Stack
对象 stack
,并向其中添加了一些整数。然后,我们依次将栈顶元素弹出并打印出来,直到栈为空。
通过这个示例,我们可以看到模板类的优势:实现一次,适用于多种类型。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++中的模板类是什么? - Python技术站