模板【C++】
一、函数模板
(1)函数模板的引入:函数的重载
两个以上的函数具有相同的函数名,但是形参的个数或者是类型不同,编译器根据不同的特
点,自动确定调用相应的函数,这就是函数的重载。
重载函数的声明:
形参类型不同:
int add(int x, int y);
float add(float x, float y);
形参个数不同:
int add(int x, int y);
int add(int x, int y, int z);
Example:
(2)函数模板
实际上是建立一个通用函数,其函数类型和形参类型不具体指定,用一个虚拟的类型来代
表。这个通用函数就叫做函数模板。函数体相同的函数都可以用这个模板来代替,不必定义多个函
数,只要在模板中定义一次即可。
函数模板定义的格式为:
template <class T1, class T2, ......>
类型名 函数名(参数表){
函数体的定义
}
// template 是声明函数模板的关键字,template 后一对“<>”括起来并且用“,”隔开的是函数模
板参数表。
模板参数分为模板类型参数和模板非类型参数。模板类型参数代表一种类型。每个模板类型
参数前必须用关键字 class 或 typename 标识,表示“一个用户定义的或固有的数据类型” 。模板非
类型参数是一个普通的参数声明,要求在编译期就确定它的值,也就是说模板非类型参数必须是个
编译期常量。 模板函数可以先定义后使用;也可以先声明,再使用,最后定义。
(3)函数模板实例化
根据函数模板构造函数的过程称为函数模板实例化,这个过程是隐式发生的。为了判断用作
模板实参的实际类型和值,编译器需要检查函数调用提供的函数实参的类型。
用函数实参的类型来决定模板实参的类型和值的过程被称为模板实参推演。也可以显式地指定模板实参。 在取函数模板实例的地址时,必须能够通过上下文环境为一个模板实参决定一个唯一的类型或值。否则,就会产生编译时错误。
Example:
#include<iostream>
using namespace std;
template <class T>
T max1(T x, T y) {
return x > y ? x : y;
}
int main() {
int x = 7;
int y = 4;
cout << x << "和" << y << "的较大值是:";
cout << max1(x, y) << endl;
double a = 3.5;
double b = 4.5;
cout << a << "和" << b << "的较大值是:";
cout << max1(a, b) << endl;
return 0;
}
/*代码分析:
*无论是调用max1(x, y)还是调用max1(a, b)都没有问题。
*这是因为,当编译器遇到表达式max(x, y)时,
*它就搜索与实参x,y相匹配的实max(),
*由于x,y的类型都是int,
*并且函数模板声明并使用了一个参数T,
*所以匹配也就确定了,
*编译器产生了一个如下所示的函数:
int max(int x, int y) {
return x>y?x:y ;
}
*同理&