C++通用模板类(学习版)

来源:互联网 发布:新时模型淘宝 编辑:程序博客网 时间:2024/05/01 11:12

在编程中我们常常遇到处理同样意义的东西由于数据类型不同,使得我们写了很多的具有冗余的代码,运行速度还慢的要死,这时就出现了我知道的3种方法:一一来看一下

重载:

#include<iostream>using namespace std;class AAA{public:    int Add(int x,int y)    {        return x+y;    }    float Add(float x,float y)    {        return x+y;    }    char Add(char x,char y)    {        return x+y;    }    int Add(int x,char y)    {        return x+y;    }    //......    //我们发现同样是加法函数,我们多重载不完,大量的冗余代码也出来了;    //重载可用于方法少的地方,当我们自己都不知道有多少中的不适合重载}

定义宏实现

#include<iostream>using namespace std;#define Add(x,y) ((x)+(y))/*宏只替换,故而可以处理不同类型。但尽管我们已经很小心的对参数加了括号,可是对于调用Add(i++,j++),这类的参数,会带来副作用,是程序带来不可预测的错误。//舍弃。*/

模板

@1:集成了重载和宏的优点

template <class numtype> //声明一个模板,虚拟类型名为numtypeclass Compare //类模板名为Compare{public :   Compare(numtype a,numtype b)   {       x=a;       y=b;   }   numtype max( )   {       return (x>y)?x:y;   }   numtype min( )   {       return (x<y)?x:y;   }private :   numtype x,y;};

numtype是传过来的类型,例:int ——numtype(int)

在建立类对象时,如果将实际类型指定为int型,编译系统就会用int取代所有的numtype,如果指定为float型,就用float取代所有的numtype。这样就能实现“一类多用”。由于类模板包含类型参数,因此又称为参数化的类。如果说类是对象的抽象,对象是类的实例,则类模板是类的抽象,类是类模板的实例。利用类模板可以建立含各种数据类型的类。在声明了一个类模板后,怎样使用它?怎样使它变成一个实际的类?

先回顾一下用类来定义对象的方法:

Compare_int cmp1(4,7); // Compare_int是已声明的类

用类模板定义对象的方法与此相似,但是不能直接写成

  Compare cmp(4,7); // Compare是类模板名

Compare是类模板名,而不是一个具体的类,类模板体中的类型numtype并不是一个实际的类型,只是一个虚拟的类型,无法用它去定义对象。

必须用实际类型名去取代虚拟的类型,具体的做法是:

Compare <int> cmp(4,7);

即在类模板名之后在尖括号内指定实际的类型名,在进行编译时,编译系统就用int取代类模板中的类型参数numtype,这样就把类模板具体化了,或者说实例化了。这时Compare就相当于前面介绍的Compare_int类。
例:声明一个类模板,利用它分别实现两个整数、浮点数和字符的比较,求出大数和小数。

#include <iostream>using namespace std;template <class numtype> //声明一个模板,虚拟类型名为numtypeclass Compare //类模板名为Compare{public :   Compare(numtype a,numtype b)   {       x=a;       y=b;   }   numtype max( )   {       return (x>y)?x:y;   }   numtype min( )   {       return (x<y)?x:y;   }private :   numtype x,y;};int main( ){   Compare<int > cmp1(3,7);//定义对象cmp1,用于两个整数的比较   cout<<cmp1.max( )<<endl;   cout<<cmp1.min( )<<endl;   Compare<float > cmp2(45.78,93.6); //定义对象cmp2,用于两个浮点数的比较   cout<<cmp2.max( )<<endl;   cout<<cmp2.min( )<<endl<<endl;   Compare<char> cmp3(′a′,′A′); //定义对象cmp3,用于两个字符的比较   cout<<cmp3.max( )<<endl;   cout<<cmp3.min( )<<endl;   return 0;}

输出结果:

“`

7
3
93.6
45.78
a
A

“`明显发现一份代码,当我们给的参数类型不同,调用的也不同

调用分2种

// 隐式传类型Compare cmp1(3,7)// 显示传类型Compare<int > cmp1(3,7)

类定义体外定义的成员函数,应该使用函数模板.

#include <iostream>  using namespace std ;  template <class T>  class Base  {    public :       T a ;     Base(T b)     {       a = b ;       }      T getA(){return a ;} //类内定义     void setA(T c);    } ;  template <class T>   //模板在类外的定义  void  Base<T>::setA(T c)   {     a = c ;             }  int main()  {       Base <int>b(4) ;       cout<<b.getA() ;       Base <double> bc(4) ;       bc.setA(4.3) ;       cout<<bc.getA() ;       system("pause") ;   return 0 ;    }
阅读全文
1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 森林被野人拖走怎么办 我的世界没有羊怎么办 黑魂3杀死铁匠后怎么办 幻境7下8走错了怎么办 换了手机号微信怎么办 微信游戏没了怎么办 找sf网站被劫持怎么办 护发精油抹多了怎么办 用了护发素洗头怎么办 电脑c盘空间不足怎么办 把水蛭吃肚子里怎么办 不小心喝到蚂蟥怎么办 水蛭喝进肚子里怎么办 蚂蝗钻入皮肤里怎么办 孩子屁眼红疼怎么办啊 宝宝屁眼红疼怎么办4岁 屁股眼上火很疼怎么办 屁股上火了很痛怎么办 脚被虫子咬肿了怎么办 人在低谷的时候怎么办 支付宝忘了密码怎么办 忘了支付宝账号怎么办 支付宝账号丢了怎么办 生完孩子奶水不足怎么办 生完宝宝没奶水怎么办 生完三天没奶水怎么办 生完孩子奶头小怎么办 生完孩子没有奶水怎么办 宝宝刚出生没奶怎么办 婴儿含着乳头睡怎么办 没满月的换奶粉怎么办 生完孩子奶少怎么办 刚满月没奶了怎么办 健康之路没奶水怎么办 生完孩子奶胀痛怎么办 生完两天没有奶怎么办 一个多月的宝宝睡眠不好怎么办 产妇奶少不够吃怎么办 冬天腿上掉皮屑怎么办 一岁宝宝不喝奶粉怎么办 2岁宝宝不吃奶粉怎么办