泛型编程
如下的交换函数中,它们只有类型的不同,应该怎么实现一个通用的交换函数呢?
void Swap(int& left, int& right)
{
int temp = left;
left = right;
right = temp;
}
void Swap(double& left, double& right)
{
double temp = left;
left = right;
right = temp;
}
void Swap(char& left, char& right)
{
char temp = left;
left = right;
right = temp;
}
那能否告诉编译器一个模子,让编译器根据不同的类型利用该模子来生成代码呢?
模版分为:
函数模版:
函数模版概念:
函数模板格式:
注意:typename是用来定义模板参数关键字,也可以使用class(切记:不能使用struct代替class)
函数模版原理:
函数模版实例化:
隐式实例化: 让编译器根据实参推演模板参数的实际类型
显式实例化:在函数名后的<>中指定模板参数的实际类型
模版参数的匹配原则:
可以理解为:
类模版
类模版的定义格式:
类模版实例化:
#include <iostream>
using namespace std;
template<class T>
class Stack
{
public:
Stack(int n = 4);
~Stack()
{
cout << "~Stack()" << endl;
delete[] _a;
_a = nullptr;
_top = _capacity = 0;
}
void Push(const T& x)
{
//...
}
private:
T* _a;
int _top;
int _capacity;
};
//类模版不能将定义和声明在不同的文件
//类外定义
template<class T>
Stack<T>::Stack(int n)
{
cout << "Stack(int n = 4)" << endl;
_a = new T[n];
_top = 0;
_capacity = n;
}
int main()
{
//在普通的类中:类名就是类型
//在类模版实例化的类中:类名不是类型,类名<数据类型>才是类型
Stack<int> st1;//显示实例化
Stack<double> st2;
//显示实例化的类型不同,它们就是不同的类
//st1 = st2;//一个是Stack<int> 一个是Stack<double>
return 0;
}
以上就是个人学习的见解和学习过程的解析,欢迎各位大佬在评论区探讨,交流!
如果本篇对你有帮助的话,三连支持一下吧。
感谢大佬们的三连! 感谢大佬们的三连! 感谢大佬们的三连!