沈阳网站建设技术支持, 番茄视频 在线,中文软件开发平台,如何做网站拓扑结构图文章目录1 泛型编程2 函数模板2.1 函数模板概念2.2 函数模板格式2.3 函数模板的实例化2.3.1 隐式实例化2.3.1.1 定义2.3.1.2 代码演示2.3.1.3 运行结果2.3.1.4 缺点2.3.2 显式实例化2.3.2.1 格式2.3.2.2 代码演示2.3.2.3 运行结果2.4 模板参数的匹配原则2.4.12.4.22.4.33 类模板…
文章目录1 泛型编程2 函数模板2.1 函数模板概念2.2 函数模板格式2.3 函数模板的实例化2.3.1 隐式实例化2.3.1.1 定义2.3.1.2 代码演示2.3.1.3 运行结果2.3.1.4 缺点2.3.2 显式实例化2.3.2.1 格式2.3.2.2 代码演示2.3.2.3 运行结果2.4 模板参数的匹配原则2.4.12.4.22.4.33 类模板3.1 类模板格式代码演示3.2 类模板实例化1 泛型编程
编写与类型无关的通用代码是代码复用的一种手段。模板是泛型编程的基础。其中模板包括函数模板和类模板。
2 函数模板
2.1 函数模板概念
函数模板代表了一个函数家族该函数模板与类型无关在使用时被参数化根据实参类型产生函数的特定类型版本。
2.2 函数模板格式
typename定义模板参数关键字也可使用class
templatetypename T1[,typename T2,typename T3]
返回值类型 函数名(参数列表){}或
templateclass T1[,class T2,class T3]
返回值类型 函数名(参数列表){}2.3 函数模板的实例化
用不同类型的参数使用函数模板时称为函数模板的实例化。模板参数实例化分为隐式实例化和显式实例化。
2.3.1 隐式实例化
2.3.1.1 定义
编译器通过实参的数据类型推演模板参数的实际类型
2.3.1.2 代码演示
// 模板实现两数交换
templateclass T
void Swap(T a, T b) {T t a;a b;b t;
}int main() {// 隐式实例化int a1 10, a2 20;cout a1 a1 a2 a2 endl;// 此时模板参数为intSwap(a1, a2);cout swap endl;cout a1 a1 a2 a2 endl;coutendl;double a3 10.1, a4 20.1;cout a3 a3 a4 a4 endl;// 此时模板参数为doubleSwap(a3, a4);cout swap endl;cout a3 a3 a4 a4 endl;return 0;
}2.3.1.3 运行结果 2.3.1.4 缺点
当两参数数据类型不一致时编译器无法推演出模板的数据类型 可通过类型强转或显式实例化解决。 类型强转Swap(a1,(int)a3);
2.3.2 显式实例化
2.3.2.1 格式
在函数名后的中指定模板参数的实际类型
2.3.2.2 代码演示
// 实现两数相加模板
templateclass T
T Add(const T left, const T right)
{return left right;
}
int main(){int c1 10, c2 20;double d1 10.1, d2 20.2;cout Add(c1, c2) endl;cout Add(d1, d2) endl;// 参数类型强转cout Add((double)c1, d2) endl;// 显示实例化// 指定为int型cout Addint(c1, d2) endl;// 指定为double型cout Adddouble(c1, d2) endl;return 0;
}2.3.2.3 运行结果
经过显式实例化后intdouble型也可以算出和
2.4 模板参数的匹配原则
2.4.1
一个非模板函数可以和一个同名的函数模板同时存在而且该函数模板还可以被实例化为这个非模板函数。
2.4.2
对于非模板函数和同名函数模板如果其他条件都相同在调动时会优先调用非模板函数而不会从该模板产生出一个实例。如果模板可以产生一个具有更好匹配的函数 那么将选择模板。
2.4.3
模板函数不允许自动类型转换但普通函数可以进行自动类型转换。
3 类模板
3.1 类模板格式
templateclass T
class 类模板名
{};代码演示
// 类模板Vector
templateclass T
class Vector
{
public:Vector(size_t capacity 10):_pData(new T[capacity]), _size(0), _capacity(capacity) {}~Vector();void PushBack(const T data)void PushBack(const T data)void PopBack()// ...size_t Size() { return _size; }T operator[](size_t pos){assert(pos _size);return _pData[pos];}
private:T* _pData;size_t _size;size_t _capacity;
};// 注意类模板中函数放在类外进行定义时需要加模板参数列表
template class T
VectorT::~Vector()
{if (_pData)delete[] _pData;_size _capacity 0;
}
};3.2 类模板实例化
类模板实例化需要在类模板名字后跟然后将实例化的 类型放在中即可类模板名字不是真正的类而实例化的结果才是真正的类。
// vectorint类型名
Vectorint v1;
Vectordouble v2;