c++的模板

本文介绍C++中的模板编程,包括函数模板和类模板的应用。通过示例展示了如何使用模板简化代码,实现不同类型的通用处理,如求三个数的最大值。
我们首先看看这个例子:
 
InBlock.gif#include <iostream> 
InBlock.gif 
InBlock.gifusing namespace std; 
InBlock.gif 
InBlock.gifint int_maxVal(int val1,int val2,int val3) 
InBlock.gif
InBlock.gif        int max=val1; 
InBlock.gif        if(val2>max) 
InBlock.gif        max=val2; 
InBlock.gif        if(val3>max) 
InBlock.gif        max=val3; 
InBlock.gif        return max; 
InBlock.gif
InBlock.gif 
InBlock.gifint double_maxVal(double val1,double val2,double val3) 
InBlock.gif
InBlock.gif        double max=val1; 
InBlock.gif        if(val2>max) 
InBlock.gif        max=val2; 
InBlock.gif        if(val3>max) 
InBlock.gif        max=val3; 
InBlock.gif        return max; 
InBlock.gif
InBlock.gif 
InBlock.gif//... 
InBlock.gif 
InBlock.gifint main(int argc,char* argv[]) 
InBlock.gif
InBlock.gif        //int整数比较 
InBlock.gif        int a,b,c; 
InBlock.gif        cout << "请输入3个用于比较的整数:" ; 
InBlock.gif        cin>>a>>b>>c; 
InBlock.gif        cout<<"最大的整数是:"<<int_maxVal(a,b,c)<<endl; 
InBlock.gif 
InBlock.gif        //double小数比较 
InBlock.gif        float d1,d2,d3; 
InBlock.gif        cout << "请输入3个用于比较的浮点数:"
InBlock.gif        cin>>d1>>d2>>d3; 
InBlock.gif        cout<<"最大的浮点数是:"<<double_maxVal(d1,d2,d3)<<endl; 
InBlock.gif 
InBlock.gif        return 0; 
InBlock.gif}
 
这个大家并不陌生,这里为了简单只是实现了int和double,实际中我们可能的类型很多,于是每种类型都重新定义一个函数,这里我们的函数每一个的名字不相同。
 
难道我们为了实现一个求3个值得最大值,就需要记住这么多函数名字?
 
于是函数重载,使得我们可以重复使用相同的函数名字,编译器来根据不同的类型调用对应的函数,算是改进了一步。
 
但是对于这个问题,具体的实现却有着众多的相似之处,我们发现除了参数类型的不同,我们并没有发现其他差别。
 
于是聪明的程序员们发现了使用宏来解决我们这个问题。
 
在模板之前,早期的c的程序员可能不会忘记使用宏来满足我们实现下面这样的要求:定义一系列的具有相同逻辑,但是处理不同类型这样的函数或类。
 
宏其实并没有根本改变我们的问题,由预处理器展开宏后的代码和上面又有什么区别呢,只是宏代替我们,实现代码定义的自动化而已。
 
模板为我们提供了更好的解决方案:
 
模板其实好比一个模子,可以复印出我们所需要的模板函数。
想看看函数模板:
 
functpl.cpp
 
InBlock.gif//函数模板 
InBlock.gif#include <iostream> 
InBlock.gif 
InBlock.gifusing namespace std; 
InBlock.gif 
InBlock.giftemplate <class T> 
InBlock.gifT maxVal(T val1,T val2,T val3) 
InBlock.gif
InBlock.gif        T max=val1; 
InBlock.gif        if(val2>max) 
InBlock.gif        max=val2; 
InBlock.gif        if(val3>max) 
InBlock.gif        max=val3; 
InBlock.gif        return max; 
InBlock.gif
InBlock.gif 
InBlock.gifint main() 
InBlock.gif
InBlock.gif        //int整数比较 
InBlock.gif        int a,b,c; 
InBlock.gif        cout << "请输入3个用于比较的整数:" ; 
InBlock.gif        cin>>a>>b>>c; 
InBlock.gif        cout<<"最大的整数是:"<<maxVal(a,b,c)<<endl; 
InBlock.gif 
InBlock.gif        //double小数比较 
InBlock.gif        float d1,d2,d3; 
InBlock.gif        cout << "请输入3个用于比较的浮点数:"
InBlock.gif        cin>>d1>>d2>>d3; 
InBlock.gif        cout<<"最大的浮点数是:"<<maxVal(d1,d2,d3)<<endl; 
InBlock.gif 
InBlock.gif        return 0; 
InBlock.gif
 
注意模板形式参数T
有点像我们的函数定义,
template <typename T>或template <class T>(早期编译器可能认得这个class)
 
这样程序调用maxVal时时可以根据不同的函数参数,如果int整型时,则int替代这里的T,也就是说调用的对应int的那个模板函数。
 
如果double就调用double那个,可以根据这个类型参数决定调用哪个(可以这样理解,好比我们定义了不同的函数).
 
当然了也可以是我们自定义的类型。
 
 
类模板:
可以定义一些类似逻辑机构的类,比如我们测试程序时,常用的一些
class X,class Y,class Z我们初学c++时常常定义一些这样的类,可能实际这些类没有什么意义,用类模板可以简化我们定义这些相似的类的定义。
 
classtpl.cpp
 
InBlock.gif//类模板 
InBlock.gif#include <iostream> 
InBlock.gif 
InBlock.gifusing namespace std; 
InBlock.gif 
InBlock.giftemplate <class T> 
InBlock.gifclass MyTpl 
InBlock.gif
InBlock.gifprivate
InBlock.gif        T val; 
InBlock.gifpublic
InBlock.gif        MyTpl(T val){this->val=val;}; 
InBlock.gif        void setVal(T val); 
InBlock.gif        T getVal(); 
InBlock.gif}; 
InBlock.gif 
InBlock.giftemplate <class T> 
InBlock.gifvoid MyTpl<T>::setVal(T val) 
InBlock.gif
InBlock.gif        this->val=val; 
InBlock.gif
InBlock.gif 
InBlock.giftemplate <class T> 
InBlock.gifT MyTpl<T>::getVal() 
InBlock.gif
InBlock.gif        return val; 
InBlock.gif
InBlock.gif 
InBlock.gifint main(int argc,char* argv[]) 
InBlock.gif
InBlock.gif        MyTpl<int> a(10); 
InBlock.gif        cout<<a.getVal()<<endl; 
InBlock.gif 
InBlock.gif        MyTpl<double> b(1.233); 
InBlock.gif        cout<<b.getVal()<<endl; 
InBlock.gif 
InBlock.gif        return 0; 
InBlock.gif
InBlock.gif 
 
MyTpl<int>,MyTpl<double>这样的就是我们根据我们的类模板生成的模板类。
 


   本文转自 xcf007 51CTO博客,原文链接:http://blog.51cto.com/xcf007/105231,如需转载请自行联系原作者

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值