模板学习
来源:互联网 发布:python arrow 编辑:程序博客网 时间:2024/06/10 01:15
模板的概念:
函数模板就是建立一个通用函数,其函数的类型和形参类型不具体指定,用一个虚拟的类型来代表,这个通用的函数就叫做函数模板
//函数1.
int max(int x,int y);{ return(x>y)?x:y ;}//函数2.float max( float x,float y){ return (x>y)? x:y ;}//函数3.double max(double x,double y){return (c>y)? x:y ;}
这里定义了一个int,一个float,一个double类型的函数,但如果在main函数中,我们分别定义了 char a,b; 那么在执行max(a,b);时 程序就会出错,因为我们没有定义char类型的重载版本。如果我们要实现所有类型都可行,那么就要定义所有类型的函数,好蛋疼。。。强大的C++怎么可能解决不了这样的问题呢,看下面…
现在,我们再重新审视上述的max()函数,它们都具有同样的功能,即求两个数的最大值,能否只写一套代码解决这个问题呢?这样就会避免因重载函数定义不 全面而带来的调用错误。为解决上述问题C++引入模板机制
模板意义:
模板就是实现代码重用机制的一种工具,它可以实现类型参数化,即把类型定义为参数, 从而实现了真正的代码可重用性 所谓函数模板实际上是建立一个通用函数,其函数类型和形参类型不具体指定,用一个虚拟的类型来代表,这个通用函数就称为函数模板。 凡是函数体相同的函数都可以用这个模板来代替,不必定义多个函数,只需要在模板中定义一次即可。在调用函数时,系统会根据实参的类型来取代模板中的虚拟类型,从而实现了不同函数的功能。
模版可以分为两类,一个是函数模版,另外一个是类模版。
函数模板的写法:
/*函数模板的一般形式如下:template <class或typename T>返回类型 函数名(形参表){ //函数定义体 }说明: template是一个声明模板的关键字,表示声明一个模板关键字class不能省略,如果类型形参多余一个 ,每个形参前都要加class <类型 形参表>可以包含基本数据类型可以包含类类型.请看以下程序:*///Test.cpp#include <iostream>using std::cout;using std::endl;//声明一个函数模版,用来比较输入的两个相同数据类型的参数的大小,class也可以被typename代替,//T可以被任何字母或者数字代替。template <class T>T min(T x,T y){ return(x<y)?x:y;}void main(){ int n1=2,n2=10; double d1=1.5,d2=5.6; cout<< "较小整数:"<<min(n1,n2)<<endl; cout<< "较小实数:"<<min(d1,d2)<<endl; system("pause");}
程序运行结果:
程序分析:main()函数中定义了两个整型变量n1 , n2 两个双精度类型变量d1 , d2然后调用min( n1, n2); 即实例化函数模板T min(T x, T y)其中T为int型,求出n1,n2中的最小值.同理调用min(d1,d2)时,求出d1,d2中的最小值.
注意:
原生函数优先于模板函数
如果一定要调用模板函数,需要在函数后明确类型,也就是 实例化
#include<iostream>#include<cstdlib>using namespace std;//调用的时候才编译,不调用就不会编译double add(double a, double b){ cout << "原生函数" << endl; return a + b + a + b;}template<class T>T add(T a, T b){ cout << "模板函数" << endl; return a + b;}void main(){ cout << add(1, 2) << endl;//这里调用的是原生函数 cout << add<char>(1, 2) << endl;//这里指定了函数类型,所以调用的是模板函数 cout << add('1', '2') << endl;//这里没有指定类型,但是它的数据类型与原生函数不匹配,所以也会调用模板函数 system("pause");}
函数模板接口:
#include<iostream>#include<cstdlib>using namespace std;template<class T>void show(T num){ cout << num << endl;}template<class T, class P>//泛型接口,任何数据类型都可以void run(T num, P print){ print(num);//传递函数指针打印num}void main(){ run("abc", show<const char *>);//类型检测严格,必须明确类型(实例化) system("pause");}
/**********************************end**************************************/
- 模板学习
- “模板”学习
- 模板学习
- 学习模板
- C++模板学习(函数模板+类模板)
- 学习C++模板,类模板
- c++学习之模板模板
- Xdoclet学习笔记(模板)
- C++模板的学习.
- xsl学习笔记-模板
- 模板学习笔记(一)
- velocity模板学习
- C++函数模板学习
- 函数模板学习
- 模板学习笔记
- ATL-Style模板学习
- Smarty模板学习总结
- 学习spring事务模板
- 小q的博客开通啦
- java操作new HttpPost(URL)和 new URL(shixun_ip) 获取流
- Quota与进阶文件管理
- SIP Standards
- luajit利用ffi结合C语言实现面向对象的封装库
- 模板学习
- UNICODE,GBK,UTF-8区别
- FTP服务器vsFTPd-入门操作
- LLE算法及一个例子
- 黑马程序员_7K面试题思路分析
- springmvc 发送ajax中文乱码的几种解决办法
- 国航人工客服电话是多少
- 东航客服电话是多少
- 南航客服电话是多少