前言:
函数重载解决了一组功能相近函数命名问题.这些函数虽然函数名相同,但各自都有独立的函数体,需要分别书写语句.例如计算某两个整数之和或者计算某个浮点数之和往往会被写成:
int add(int x,int y)
{
return(x+y);
}
float add(int x,int y)
{
return(x+y);
}
观察所得除了部分函数数据类型不同外,其函数内部的部分都相同,因此程序员咋想如果存在一种语法机制使得其通过一个通用的函数模板,在不必重复书写雷同的代码,大大提高程序重用性。
函数模板:
c++语言提供了模板(Template),为函数和提供类提供了通用的样板。程序员可以为功能相近,处理过程相同的一组函数统一定义为一个函数模板。
定义函数模板必须从关键字
template开始,其语法形式为:
template <class 类型参数1,class 类型参数 2.....>
类型 函数名(形参列表)
{
变量申明语句
执行语句
}
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
template<class T>
T add(T x, T y)
{
T z;
z = x + y;
return(z);
}
int main()
{
int x1 = 1, y1(2);
float x2 = 1.1, y2 = 2.2;
cout << add(x1, y1) << endl;
cout << add(x2, y2) << endl;
return(0);
}
为了体现简化性,以下展现两个用了template和非template的例子:
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
struct complex
{
int x;
int y;
};
int main()
{
int add(int x, int y);
float add(float x, float y);
complex add(complex m, complex n);
complex m1 = { 1, 2 }, m2 = { 3, 4 }, m3;
cout << add(1, 2) << endl;
cout << add(1.1f, 2.2f) << endl;
m3 = add(m1, m2);
cout << m3.x << "+" << m3.y << "i" << endl;
return(0);
}
int add(int x, int y)
{
return(x + y);
}
float add(float x, float y)
{
return(x + y);
}
complex add(complex m, complex n)
{
complex c;
c.x = m.x + n.x;
c.y = m.y + n.y;
return(c);
}
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
struct complex
{
int x;
int y;
};
template<class T> //函数模板申明
T add(T x, T y);
int main()
{
complex add(complex m, complex n);
complex m1 = { 1, 2 }, m2 = { 3, 4 }, m3;
cout << add(1, 2) << endl;
cout << add(1.1f, 2.2f) << endl;
m3 = add(m1, m2);
cout << m3.x << "+" << m3.y << "i" << endl;
return(0);
}
template<class T>//函数模板
T add(T x, T y)
{
T z;
z = x + y;
return(z);
}
complex add(complex m, complex n)
{
complex c;
c.x = m.x + n.x;
c.y = m.y + n.y;
return(c);
}
类模板:
类模板可以看成是模板的一个成分,就像上面所说只要存在部分可以产生通用性都可以用模板。类模板允许c++程序员为类定义的一种模式,使得类中的某些数据成员,成员函数的参数或者返回值能任意数据类型。任意数据类型包括基本数据类型以及用户自定义的构造类型。
其语法是:
template<class 类型参数1,class 类型参数2...>
class 类名
{
...
};
注意:定义模板类时也要加上模板参数表,与函数模板的形式类似。
template <class T>
class A
{
private:
T a1;
...
public:
T fun1(T x);
...
}
类模板不代表一个实际的类,它代表着一个类的集合。在使用时给出模板实参表,由类模板生成一个实际的模板类,在创建对象。
其语法形式为:
类名 <模板实参表> 对象1,对象2.。。。
例如:
A <int> b1,b2...
举例:
#include<iostream.h>
struct S
{
int a;
int b;
}
template <class T>//类模板
class data
{
public:
data(T x);
T get(void);
private:
T d;
}
template <class T>
data<T>::data(T x)
{
d=x;
}
template <class T>
T data<T>::get(void)
{
return(d);
}
int main()
{
int x1=5;
float x2=3.7;
S x3={1,2};
data <int> t1(x1);
data <float> t2(x2);
data <S> t3(x3);
cout<<t1.get()<<endl;
cout<<t2.get()<<endl;
cout<<t3.get().a<<" "<<t3.get().b<<endl;
return(0);
}
运行结果如下:
5
3.7
1 2