目录
1.开头
我们知道,C++可提升程序可重用性有两个方面的机制,第一个就是我们之前学过的类继承,第二个就是我们今天要讲的主题"函数模板"和"类模板",类模板在明天讲,今天首先先给大家讲解简单一些的"函数模板"!
2.函数模板
2.1例子
比如说我们来写一个函数,就swap吧,其作用就是交换两个变量的值,但是变量有int,float,double......很多类型的,肯定不能只写一个swap函数,要很多个,这就是涉及到了函数重载了,这些swap虽然名字一样,但是参数里面的类型不一样,就不会编译出错!
2.1.1 int类型swap函数
void swap(int &a,int &b){
int t;
t=a;
a=b;
b=t;
}
2.1.2 double类型swap函数
void swap(double &a,double &b){
double t;
t=a;
a=b;
b=t;
}
当然,还有很多类型的交换函数,这里就不重点讲了!
......
2.2 函数模板的概念
让我们想一想,用函数重载的方式写不同类型变量的swap有没有缺点呢?肯定是有的,什么缺点呢?第一:定义这些函数需要的代码太长了.第二:函数重载不太好理解.第三:又耗时.
那我们有没有一种两全其美的方法呢?那肯定是没有的,但是有着一种可以缩短很多代码的方法,那就是"函数模板".
函数模板是什么呢?众所周知,有了“模子”后,用“模子”来批量制造陶瓷、塑料、金属制品等就变得容易了。程序设计语言中的模板就是用来批量生成功能和形式都几乎相同的代码的。有了模板,编译器就能在需要的时候,根据模板自动生成程序的代码。从同一个模板自动生成的代码,形式几乎是一样的。
2.3 函数模板的写法
用函数模板解决:
template <class 类型参数1,class 类型参数2,……>
返回值类型 模板名 (形参表)
{
函数体
};
以后大家都可以根据这个写法来完成函数模板,
2.4 利用函数模板写swap函数
用上述写法来套一下,我们因为只需要一个类型(毕竟swap函数里面的a,b,t都是一个类型的),所以在template中只需要写class T就可以了,T是什么呢?这个就代表我们函数的类型,可以是int,可以是double,都可以代表任何类型.
返回值类型一直都是void,然后模板名肯定就是swap了,形参表里面不能写int a,int b,也不能写float a,float b.因为这样写就不是一个模板了,必须要写咋template里定义的那个类型,我们定义的就是T.所以要写T a,T b.
函数体里面写一个交换的内容,但是这个t的类型是什么好呢?int类型不行,因为这个参数可能是一个float类型的,double也不行,也就只能写函数模板的参数T了.
2.4.1 函数模板swap代码
#include<bits/stdc++.h>
using namespace std;
template <class T>
void Swap(T & x,T & y)
{
T tmp = x;
x = y;
y = tmp;
}
int main()
{
int n = 1,m = 2;
Swap(n,m); //编译器自动生成 void Swap(int & ,int & )函数
double f = 1.2,g = 2.3;
Swap(f,g); //编译器自动生成 void Swap(double & ,double & )函数
return 0;
}
这样的话,在int main();里面调用swap函数,里面的两个参数无论是什么都可以运行了!
2.5 不止一个参数的函数模板
函数模板中可以有不止一个类型参数,我们来看这一串代码。
#include<bits/stdc++.h>
using namespace std;
template <class T1, class T2>
T2 print(T1 arg1, T2 arg2)
{
cout<< arg1 << " "<< arg2<<endl;
return arg2;
}
这个两个参数的函数模板,可以应用更加的广泛!甚至可以写更多个,大大缩小了我们原本应该的代码长度.
3.总结
今天我们讲的是C++里面普通的函数模板,明天我将会讲解更加复杂的函数模板,比如说函数模板的重载,函数调用次序等.
谢谢大家的观看!