本篇内容介绍了“c++ 显示具体化和显示实例化的详细讲解”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
成都网络公司-成都网站建设公司创新互联十载经验成就非凡,专业从事网站设计制作、成都网站制作,成都网页设计,成都网页制作,软文发布平台,广告投放平台等。十载来已成功提供全面的成都网站建设方案,打造行业特色的成都网站建设案例,建站热线:18982081108,我们期待您的来电!
今天看到c++ primer plus 第8章--函数探幽,其中模版函数一节有2个比较容易搞混的概念: 在此记录以下:
先看模版函数的定义:个人认为主要是为了节约代码量,对不同的类型完成相同的操作,如果使用函数重载的话,对于基本数据类型整形,就有short/int/long/longlong 4种,还不包括unsigned和signed,因此需要大量的重载函数,而内容都是雷同的,浪费复制粘帖的操作。因此采用模版函数来实现。
1、使用 template 或 template 放到函数开头来声明模版。其中typename是新标准,class是为了向前兼容。因此写class较为通用。
2、注意模版不能缩短可执行文件长度,在函数调用时,必须依据给出的参数类型由编译器生成实例化的模版函数(称作隐式实例化 instance),即 int add(int a, int b); 因此模版函数只是将程序员要做的事交给了编译器而已。
3、模版可以重载,见上图的模版1和模版2、模版3,注意重载是用于改变输入参数类型或增加、减少输入参数个数(后者一般通过缺省参数实现!!)。
我们输入 add(1,2)得到3,并且显示调用模版1;输入 add(1,2,3) 得到6,调用模版2;输入 add(1,'A')得到'B',调用模版3; 注意模版3中多个类型的写法。
比如对于模版2而言,我们无法用其实现 int*类型的加法,因此我们需要 specialize 这个模版,即对于int*型的输入特例化(具体化)这个模版,使其可以与原始模版不同的功能。注意显示具体化不能只声明,一定要有函数体才可以,否则vs会报链接错误!!!
我的理解是:显示具体化拓宽的模版的应用范围!原本add函数只能对重载了“+运算符”的类型使用,现在也可以对int 数组使用,但其实完全可以另写一个函数 add_array来实现这个功能,感觉就是为了好看(符合某种统一风格)所以写到一起!
模版的显式实例化其实只是一个声明:template int add(int,int); 注意template后没有<>,而add后最好加上,即你自己要实例化的类型。
实际上对显式实例化的作用我也不很清楚,因为修改函数体的话使用具体化就可以了,实例化是不能带函数体的,因此参考 http://bbs.csdn.net/topics/390559301,大概能得到结论:
cout< cout< cout< 此外显式实例化还有一个作用: 根据《在同一文件中使用同类型的显示实例化和显示具体化会报错的特点》,先声明显示实例化,则后面的显示具体化如果存在,会报错,从而防止具体化该型模版!! c++11中,好像可以先具体化,再实例化声明,不会报错 调用优先级:普通函数>显式具体化>显式实例化>普通模版 显式实例化用于人为选择特定的类型! 显式具体化用于修改某类型的函数具体功能! “c++ 显示具体化和显示实例化的详细讲解”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注创新互联网站,小编将为大家输出更多高质量的实用文章!总结:
本文名称:c++显示具体化和显示实例化的详细讲解
标题路径:http://njwzjz.com/article/ijedeg.html