C++超详细介绍模板
定义函数模板不是一个实在的函数编译器不能为其生成可执行代码。定义函数模板后只是一个对函数功能框架的描述当它具体执行时将根据传递的实际参数决定其功能。一个程序一般是经过预处理——编译——汇编——链接。但是因为程序无法知道模板的具体类型intdouble,所以无法进行预处理也就不能生成可执行代码。例子下面我们来看一个例子我们在学习c语言的时候当我们需要交换两个数我们是这样做的交换整数123456voidSwap(int x,int y){inttmp x;x y;y tmp;}交换小数123456voidSwap (double xrdouble y){doubletmp x;x y;y tmp;}我们可以看出只要类型做了变化我们就需要重新写一个几乎不变的代码这是非常不方便的。那么我们像活字印刷术一样做一个模板出来让编译器根据自行推导类型呢于是模板就出现了。对于上面的情况我们模板是这样处理的。格式12345678910111213141516171819202122templateclassTvoidSwap(T x, T y){T tmp x;x y;y tmp;}templateclassTvoidSwap(T x, T y){T tmp x;x y;y tmp;}intmain(){inta 3;intb 2;Swap(a, b);cout a endl b endl;return0;}template class 类型参数1, class类型参数2, ...返回值类型 模板名(形参表){函数体}意识就是说我们在这里用template定义了一个模板”T”当我们使用Swap的时候计算机根据我们ab都是int的类型推出T应当是int 型。实际上这个1voidSwap(T x, T y)变成了1voidSwap (int x,int y)但是需要注意只有当ab都是同类型的时候计算机才能自动推到如果是不同类型我们将b换为double类型12345678910111213141516171819202122templateclassTvoidSwap(T x, T y){T tmp x;x y;y tmp;}templateclassTvoidSwap(T x, T y){T tmp x;x y;y tmp;}intmain(){inta 3;doubleb 2.5;Swap(a, b);cout a endl b endl;return0;}就会出现因为两个数一个int一个double计算机就不知道给这个T赋int 还是double这个时候有两种处理方法处理方法第一种隐式实例化让编译器根据实参推演模板参数的实际类型12345678910111213#includeiostreamusingnamespacestd;templateclassTT Add(constT left,constT right){returnleft right;}intmain(){inta1 10, a2 20;doubled1 10.0, d2 20.5;Addint(a1, d2);//在这个地方前面加int计算机就会默认T为int型}第二种显式实例化在函数名后的中指定模板参数的实际类型12345678910111213#includeiostreamusingnamespacestd;templateclassTT Add(constT left,constT right){returnleft right;}intmain(){inta1 10, a2 20;doubled1 10.0, d2 20.5;Add(a1,(int) d2);//此处d2原本是double型但是我们强制转换为int之后两者的类型都相同计算机就能自动推导了}到此这篇关于C超详细介绍模板的文章就介绍到这了
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2564639.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!