C++超详细讲解泛型攻略
什么是泛型
泛型是一种编程方式,可以编写能够处理多种数据类型的代码模板。也就是说,泛型可以让我们写出适用于多种类型数据的代码,而无需为每个具体的数据类型编写特定的代码。
在C++中,泛型主要由函数模板和类模板来实现。
函数模板
函数模板可以实现适用于多种类型数据的函数代码。函数模板的定义格式如下:
template<typename T>
返回值类型 函数名(参数列表){
//函数体
}
其中,模板参数typename T
表示要运用泛型的数据类型的一个占位符,在函数被实例化时,会根据实参类型推断出T的具体类型,从而实现函数代码的执行。
示例1:交换两个变量的值
template<typename T>
void swap(T& a, T& b){
T temp = a;
a = b;
b = temp;
}
在该示例中,我们定义了一个可以交换任意两个类型相同的变量的函数模板swap,其中,变量a和b实际上可以是任意类型,包括int
,double
,string
等。
示例2:找出数组中的最大值
template<typename T>
T findMax(T arr[], int size){
T max = arr[0];
for(int i=1; i<size; i++){
if(arr[i] > max){
max = arr[i];
}
}
return max;
}
在该示例中,我们定义了一个可以在数组中找出最大元素的函数模板findMax,其中,变量arr是一个任意类型T的数组,size指定了数组长度,函数在执行时可以适用于任意类型的数据类型。
类模板
类模板可以实现适用于多种类型数据的类模板。类模板的定义格式如下:
template<typename T>
class 类名{
// 成员变量
// 成员函数
}
其中,模板参数typename T
表示要运用泛型的数据类型的一个占位符,在类被实例化时,会根据实参类型推断出T的具体类型,从而实现类模板的实例化。
示例3:栈的实现
template<typename T>
class Stack{
private:
T* data;
int top;
int capacity;
public:
Stack(int size = 100){
data = new T[size];
capacity = size;
top = -1;
}
~Stack(){
delete[] data;
}
void push(T val){
if(top == capacity-1){
overflow_error e;
throw e;
}
data[++top] = val;
}
T pop(){
if(top == -1){
underflow_error e;
throw e;
}
return data[top--];
}
bool isEmpty(){
return top == -1;
}
};
在该示例中,我们定义了一个数据类型可以任意的栈类模板Stack,在类模板中,变量T可以是任意类型,而栈数据的push,pop,isEmpty操作都能够适用于该类型元素。
总结
泛型是一种强大的编程方式,可以实现适用于多种类型数据的代码,提高代码的复用性和可维护性。C++通过函数模板和类模板来实现泛型编程,不仅可以用于各种情况下的编程,还可以用于编写通用库函数的实现。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++超详细讲解泛型 - Python技术站