详解C++函数模板

函数模板属于类属,能够处理不同的数据类型,当编译器遇到函数调用是,将根据实际参数的类型产生特定的代码,函数模板的定义形式是:

template <类型参数表>
返回值类型 函数名(形式参数表){
//函数体
}

函数模板可以为我们提供很多方便

函数重载的例子:
int square(int number){
    return number*number;
}

float square(float number){
    return number*number;
}

上述两个函数之间的区别是参数类型和返回值类型不一样,这种情况下我们使用函数模板更加方便。
通过函数模板实现square函数

template <class T>
T square(T number){
    return number*number;
}

只要写一个函数定义就可以处理不同的数据类型,而不需要对每种数据类型都写一个单独的函数。
eg1:

#include
using namespace std;

template <class T>
T square(T number){
    return number*number;
} 

int main(){
    int userInt;
    float userFloat;

    cout.precision(5);
    cout<<"请输入一个整数和一个浮点数:";
    cin>>userInt>>userFloat;
    cout<<"他们的平方分别是:";
    cout<"和"<return 0; 
}

注:①函数模板本身不占用内存,当编译器遇到函数调用是,将在内存中创建一个函数实例。②模板的定义必须放在函数调用之前,通常放在程序的开头或者位于头文件中。

具有多个参数的函数模板:

template <class T>
void swapData(T &var1,T &var2){
    T temp;
    temp=var1;
    var1=var2;
    var2=temp;
}

函数模板不是一个真正意义上的函数,它仅仅是一个函数模型,当编译器遇到函数调用是,将依据模板给出的代码,通过检验参数的数据类型,产生重载函数。

具有多种类型的函数模板

template <class T1,class T2>
void swapData(T1 &var1,T2 &var2){
    T1 temp;
    temp=var1;
    var1=var2;
    var2=temp;
}

函数模板也支持重载

template <class T>
T sum(T var1,T var2){
    return var1+var2;
}

template <class T>
T sum(T var1,T var2,T var3){
    return var1+var2+var3;
}

当程序中有一个普通的函数(非模板),同时定义了一个模板,只要他们的参数列表不同,他们也能作为重载函数的形式共存。

float sum(float var1,float var2){
    return var1+var2;
}

template <class T>
T sum(T var1,T var2,T var3){
    return var1+var2+var3;
}
这也属于模板重载,当程序执行是,将根据实际调用的参数进行区分。

你可能感兴趣的:(c++,template,函数重载,C++)