unit8—参数化程序设计—第六章模板内容摘要:
rray[i]max_val) max_val=r_array[i]。 return max_val。 } ( 2)隐式指定,如: i=max(ia,5)。 编译器必须检查函数调用中提供的函数实参的类型,由此判断用作模板实参的实际类型。 模板实参推演与模板实例化的区别与联系。 由 调用 函数模板 (function template) 而生成的函数,称为 模板函数 (template function)。 注意概念区分。 函数模板与模板函数: 【 例 】 矩阵运算:矩阵转置与矩阵相乘函数模板。 下标作为参数传递。 解决例 问题。 函数模板及应用 【 例 】 矩阵运算 template typename T1, typename T2void inverse(T1 *mat1,T2 *mat2,int a,int b){ int i,j。 for (i=0。 ib。 i++) for (j=0。 ja。 j++) mat2[j][i]=mat1[i][j]。 return。 } template typename T1,typename T2void multi(T1 *mat1,T2 *mat2,T2 *result,int a,int b, int c){ int i,j,k。 for(i=0。 ia。 i++) for(j=0。 jc。 j++){ result[i][j] = 0。 for(k=0。 kb。 k++) result[i][j]+=mat1[i][k]*mat2[k][j]。 } return。 } template typename Tvoid output(T *mat,char *s, int a,int b){ int i,j。 coutsendl。 for(i=0。 ia。 i++){ for(j=0。 jb。 j++) coutsetw(4)mat[i][j]。 coutendl。 } return。 } 【 例 】 矩阵运算 void main(){ int middle[6][3], result[6][4]。 int matrix1[3][6]={8,10,12,23,1,3,5,7,9,2, 4,6,3,45,56,2,4,6}。 int matrix2[3][4]={3,2,1,0,1,2,9,8,7,6,5,4}。 char *s1=result。 char *s2=middle。 inverse(matrix1,middle,6,3)。 //显 式 :inverseint[6],int[3] (matrix1,middle,6,3)。 multi(middle,matrix2,result,6,3,4)。 //显 式 :multi int[3],int[4] (middle,matrix2,result,6,3,4)。 output(matrix1,matrix1,3,6)。 output(middle,s2,6,3)。 output(matrix2,matrix2,3,4)。 output(result,s1,6,4)。 } 【 例 】 矩阵运算 含 有 6个一维数组元素的二维数组类型。 二级指针。 与 函数声 明不同, 函数模板的声明必须含变量名。 因为两者编译过程不一样,函数模板必须先转换为模板函数。 template typename T1,typename T2 void inverse(T1 *mat1, T2 *mat2, int a,int b)。 template typename T1,typename T2void multi(T1 *mat1,T2 *mat2,T2 *result,int a, int b, int c)。 template typename Tvoid output(T *mat,char*s,int a,int b)。 与 函数声 明相同 ,函数模板的声 明也不必包含变量名。 t late typen 1,typen 2 v id inverse( 1 *, T2 *, int,int )。 t late typen 1,typen 2v id lti( 1 *,T2 *,T2 *,int , int , int )。 template typename Tvoid output(T *,char*,int ,int )。 函数模板及应用 注 意事项: 类模板 与数据结构 类 模板定义: template模板参数表 class 类名 { …… //类定义体 }。 //再次指出分号不可 少 template模板参数表 返回类型 类名 模板参数名表 ::成员函数名 1(形参表 ) { … ; //成员函数定义体 } … template模板参数表 返回类型 类名 模板参数名表 ::成员函数名 n(形参表 ) { … ; //成员函数 n定义体 } 模板参数有两种: 模板类型参数 和 模板非类型参数。 模板非类型参数 由一个普通的参数声明构成。 表示该参数名代表了一个 潜在的常量 ,不允许修 改这种参数的 值。 如: 数 组类模 板中代表数 组长度的非类型参 数 i: template typename T,int iclass array{ T vector[i]。 int size。 public: array():size(i){} //等效 array(){size=i。 }参见 ... }。 模板非类型参数: 类模板 与数据结 构 注 意: ( 1)类模 板外 定义 的成 员函数必须是函数模 板,不同于类模板内定义的,该 成 员函数只有在被调用(或取地址)时才被实例化。 ( 2)成 员函数模板定义中 ,其所 在类域的 类名 后跟的 模板参数名表 中参数与 类模板的 模板参数表 中的类型参数名相同,但不加 typename 或class。 类模板 与数据结 构 由 通 用的类模 板生 成类的过程称为模板实例化( template instant。unit8—参数化程序设计—第六章模板
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。
用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。