1. 1、本文档共27页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
C模板

泛型编程 让代码和其所处理的对象类型彼此独立。标准库中的容器,迭代器和算法都是泛型编程的例子。 而模板是泛型编程的基础。 模板(涉及到的所有代码,VS2010亲测) 1. 模板的概念。 重载:要为多种类型定义一个不同版本。代码冗余。没有事先定义的调用会出错。 能否只写一套代码解决这个问题呢? C++引入模板机制。 模板定义:模板就是实现代码重用机制的一种工具,它可以实现类型参数化。 模版可以分为两类,一个是函数模版,另外一个是类模版。 模板工作原理: 模板定义并未引入新类型,新函数实体。 编译阶段编译器推断出具体类型后才生成新的类型或者新的函数。编译器承担了为我们使用的每种类型编写函数的单调工作。 链接阶段,识别合并等价模板实例。每一种类型只留一份实例。 只有当存在模板调用,才生成实例。不调用就不会实例化。 函数模板 2.1 函数模板写法 函数模板的一般形式如下: template class\typename T 返回类型 函数名(形参表) {//函数定义体 } //声明一个函数模版,用来比较输入的两个相同数据类型的参数的大小,class也可以被typename代替, //T可以被任何字母或者数字代替。 template class T T min(T x,T y) { return(xy)?x:y;} void main( ) { int n1=2,n2=10; double d1=1.5,d2=5.6; cout 较小整数:min(n1,n2)endl; //min(n1,n2)指定模板实参,实参是值 cout 较小实数:min(d1,d2)endl; system(PAUSE); } 2.2 模板参数自动推导 2.2.1模板形参注意事项: a 模板形参作用域:在声明为模板形参之后,知道模板声明或定义结尾处。 b 遵循名字屏蔽规则,屏蔽外部定义的同名。 c用做模板形参的名字不能再模板内部重用。 d模板声明和定义中模板形参名字不必相同 2.2.2什么情况可自动推导? 函数模板调用 fun模板参数类型表(函数参数) 一般可省略为fun(函数参数) A 编译器只根据函数调用时给出的实参列表来推导模板参数值,与函数参数类型无关的模板参数无法推倒。 B 与函数返回值相关的模板参数也无法推倒。 C 所有可推导的模板参数必须是连续位于模板参数列表尾部,中间不能有不可推导的模板参数 #include iostream templatetypename T0, typename T1, typename T2, typename T3, typename T4 T2 func(T1 v1, T3 v3, T4 v4); int main() { double sv2; using namespace std; sv2 = funcdouble, int, int(1, 2, 3); cout \tsv2: sv2 endl; sv2 = funcdouble, int, int(1, 3, 4); cout \tsv2: sv2 endl; sv2 = funcdouble, int, int(1, 0.1, 0.1); cout \tsv2: sv2 endl; sv2 = funcint, double, double(0.1, 0.1, 0.1); cout \tsv2: sv2 endl; } templatetypename T0, typename T1, typename T2, typename T3, typename T4 T2 func(T1 v1, T3 v3, T4 v4) { T0 static sv0 = T0(0); T2 static sv2 = T2(0); std::cout \tv1: v1 \tv3: v3 \tv4: v4 \t|| sv0: sv0; T2 v2 = sv2; sv0 -= 1; sv2 -= 1; return v2; } 所以上面的例子只可以把T3和T4省略。其他不能省略。也不支持sv2 = funcdouble, , int(1, 2, 3); 2.2 模板参数默认值 C++ 11标准允许为函数模板参数赋默认值 templatetypename T0 = f

文档评论(0)

haocen + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档