专业网站建设品牌,十四年专业建站经验,服务6000+客户--广州京杭网络
免费热线:400-683-0016      微信咨询  |  联系我们

中常见的模板类_java

当前位置:网站建设 > 技术支持
资料来源:网络整理       时间:2023/3/5 17:02:00       共计:3612 浏览

中常见的模板类?

模板类英文为class template,template的中文翻译为模板,所以模板类的意思其实是:类的模板。

顾名思义,模板类是相当于一个模具,当参数给定时,生成具体的类,也叫实例化。它的提出主要是为了减少代码重复。

例如,我们可以用下面的代码交换两个数b和c

a = b;

b = c;

c = a;

这个交换过程与a,b,c的具体类型没有关系,因此我们可以用它来交换两个整数,或者两个浮点数。更一般的,我们可以用来交换两个具有赋值运算符的类型。因此,可以用模板进行一般化:

template<class T>

void swap(T &b, T &c){

a = b;

b = c;

c = a;

}

当然,上面介绍的这个不是模板类,而是模板函数。不过他们的概念是类似的。其中一开始的template代表后面尖括号中的是模板参数(类似于函数的参数),class代表参数是类(相应的,可以用template<int N>来声明整型参数)。后面的代码和的函数基本没有区别,只是用T来代替了具体的类型,例如int,double等。根据需要我们可以用swap<int>(b,c)来交换两个整数,swap<double>(b,c)交换两个浮点数。由于编译器可以根据b,c的具体类型推导T的具体含义,因此可以简写为swap(b,c)。

回到模板类,假设我们需要一个类型来代表动态数组,且该类型支持size成员函数。如果是整型的类,我们可能会写

class vector_int{

size_t size() const;

};

如果某一天,我们又需要浮点类型的动态数组,可能又会写

class vector_double{

size_t size() const;

};

于是就会发现它们的代码是如此的类似,因此我们希望将它一般化。如同swap函数的做法,我们将它定义为模板类:

template<class T>

class vector{

size_t size() const;

};

因此,vec_int等同于vector<int>,而vector_double等同于vector<double>。因为运用模板类的语法类似于

vector<T> a;

因此,编译器没办法为我们推导T的具体含义,所以不能像模板函数一样进行简写。

当然,上面是比较简单的情况,有时候我们需要的类在大多数情况下是一样的,但是对于某几个特殊情形可能不太一样,例如我们可能希望对于bool类型的数组能尽量减少内存的使用,用一个比特位代表一个bool值。从而,我们的数组不是通过bool a[10]的形式来定义。在这种情况下,c++提供了模板特化,也就是说当模板的参数取某个具体的值时,我们使用不同的模板,定义方式如下:

template<>

class vector<bool>{

size_t size() const;

};

因为,它是一个特化的模板类,所以只有普通模板存在的情况下,它的存在才是合法的,不然我们是对什么进行特化的呢?

版权说明:
本网站凡注明“广州京杭 原创”的皆为本站原创文章,如需转载请注明出处!
本网转载皆注明出处,遵循行业规范,如发现作品内容版权或其它问题的,请与我们联系处理!
欢迎扫描右侧微信二维码与我们联系。
·上一条:接口和抽象类的主要区别_java | ·下一条:目标节点什么意思_java

Copyright © 广州京杭网络科技有限公司 2005-2025 版权所有    粤ICP备16019765号 

广州京杭网络科技有限公司 版权所有