VC++ (五)特殊函数形式
1、函数模板(template)
当需要定义多个具有相同函数名的函数时,需要进行函数重载(overload)。函数重载的条件是这些函数的形参列表各不相同。事实上,所有函数都有签名,函数的签名由函数名称和形参列表确定,程序中每个函数都必须有唯一的签名。同理,不同的返回值类型不足以区别函数。
当多个函数重载时,仅仅因为变量和形参类型不同,而算法和流程一致,为避免对每个函数重复编写本质上相同的代码,可以采用函数模板。如下:
template<typename T>
T Max(T x[], int len){
T result = x[0];
for(int i = 1; i<len; i++)
if(result < x[i]) result = x[i];
return result;
}
调用时如下:
int iValus[] = {1,2,3,4};
double dValues[] = {0.1,0.2,0.3,0.4};
int iMax = Max(iValues, 4);
double dMax = Max(dValues, 4);
编译器会自动识别并生成相应代码。
2、泛型函数(generic)
泛型函数的作用与函数模板相似,但工作原理上有很大不同:使用函数模板时,编译器根据模板生成需要的函数的源代码,然后与其他代码一起编译,在某些情况下,将导致许多函数的产生,从而使执行模块的体积增大。而泛型函数本身将被编译器编译,当调用某个与泛型函数说明匹配的函数时,实际类型将在运行时替代类型形参,这样一来没有额外代码在编译时生成。泛型函数的定义与函数模板类似,如下:
generic<typename T> where T:IComparable
T Max(array<T>^ x){
T result = x[0];
for(int i= 1;i< x->Length; i++)
if(result->CompareTo(x[i]) < 0) result= x[i];
return result;
}
关键字where后面内容,是对在使用泛型函数时,用于替代T的实际类型的约束条件,在此处表示该类型必需实现IComparable接口。
3、内联函数(inline)
当函数定义为内联函数时,编辑器将设法以函数体代码替代函数调用,所以内联函数最适合用于非常短小的、频繁调用的简单函数,如循环体内的简单函数调用等。通过内联函数可以避免调用函数时的系统开销,从而加速代码运行。如:
inline double Multiplication(double dA, double dB) { return dA * dB};
double dM = 0;
int i;
for (i=0;i<10000;i++){
dM += Multiplication(PI, i / 0.123 ); //循环内的简单运算
}