请选择 进入手机版 | 继续访问电脑版

[C 语言] C++ 函数模板和类模板详情

[复制链接]
查看88 | 回复25 | 2021-9-12 14:58:15 | 显示全部楼层 |阅读模式
目次

1. 泛型编程

  1. 如何实现一个通用的交换函数?
  2. 在C++中可以用到函数重载
复制代码
  1. class A
  2. {
  3. public:
  4. void Swap(int& x1,int& x2)
  5. {
  6. int temp=x1;
  7. x1=x2;
  8. x2=temp;
  9. }
  10. void Swap(double& x1,double& x2)
  11. {
  12. double temp=x1;
  13. x1=x2;
  14. x2=temp;
  15. }
  16. void Swap(char& x1,char& x2)
  17. {
  18. char temp=x1;
  19. x1=x2;
  20. x2=temp;
  21. }
  22. //..............
  23. };
复制代码

但是如许 写有几个缺点:

  • 重载的函数仅仅只是范例 不同,代码的复用率比较低,只要有新范例 出现时,就必要 增长 对应的函数
  • 代码的可维护性比较低,一个出错大概 全部 的重载均出错

那么能否 告诉编译器一个摸子,让编译器根据不同范例 利用 该摸子来天生 代码呢?

泛型编程:编写与范例 无关的通用代码,是代码复用的一种本领 ,模板是泛型的基础。

C++ 函数模板和类模板详情

2. 函数模板

2.1 函数模板概念

  1. 函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。
复制代码

2.2 函数模板格式化

  1. template<typename T1,typename T2,......,typename Tn>
复制代码

返回范例 函数名(参数列表){}

  1. template<typename T>
  2. void Swap( T& left, T& right)
  3. {
  4. T temp = left;
  5. left = right;
  6. right = temp;
  7. }
复制代码

留意 :typename是用来定义模板参数关键字,也可以利用 class(牢记 :不能利用 struct代替class)

2.3 函数模板原理

函数模板是一个蓝图,它本身并不是函数,是编译器用利用 方式产生特定详细 范例 函数的模具。以是 实在 模板就是将本来应该我们做的重复的变乱 交给了编译器

C++ 函数模板和类模板详情

在编译器编译阶段,对于模板函数的利用 ,编译器必要 根据传入的实参范例 来推演天生 对应范例 的函数以供调用。比如:当用double范例 利用 函数模板时,编译器通过对实参范例 的推演,将T确定为double范例 ,然后产生一份专门处理double范例 的代码,对于字符范例 也是云云 。

2.4 函数模板实例化

用不同范例 的参数利用 函数模板时,称为函数模板的实例化。模板参数实例化分为:隐式实例化和显式实例化。

  • 隐式实例化:让编译器根据实参推演模板参数的现实 范例
  1. template<class T>
  2. T Add(const T& left, const T& right)
  3. {
  4. return left + right;
  5. }
  6. int main()
  7. {
  8. int a1 = 10, a2 = 20;
  9. double d1 = 10.0, d2 = 20.0;
  10. Add(a1, a2);
  11. Add(d1, d2);
  12. Add(a,(int)b);
  13. return 0;
  14. }
复制代码
  • 表现 实例化:在函数名后<>中指定模板参数的现实 范例
  1. int main(void)
  2. {
  3. int a = 10;
  4. double b = 20.0;
  5. // 显式实例化
  6. Add<int>(a, b);
  7. return 0;
  8. }
复制代码

假如 范例 不匹配,编译器会尝试举行 隐式范例 转换,假如 无法转换成功编译器将会报错。

2.5 模板参数的匹配原理

  • 一个非模板函数可以和一个同名的函数模板同时存在,而且该函数模板还可以被实例化为这个非模板函数
  • 对于非模板函数和同名函数模板,假如 其他条件都雷同 ,在调动时会优先调用非模板函数而不会从该模板产生出一个实例。假如 模板可以产生一个具有更好匹配的函数, 那么将选择模板
  • 模板函数不答应 主动 范例 转换,但平凡 函数可以举行 主动 范例 转换

3. 类模板

在学习C语言中,我们写一个次序 表的时间 会先用

  1. typedef int ST ;
复制代码

但是在现实 用的时间 无法又用int又用double又用char,以是 在C++中就有了类模板。

3.1 类模板的定义格式

类模板的格式:

  1. template<class T1, class T2, ..., class Tn>
  2. class 类模板名
  3. {
  4. // 类内成员定义
  5. };
复制代码

跟函数模板没有什么区别

在写次序 表的时间 :

  1. template<class T>
  2. class Vector
  3. {
  4. public :
  5. Vector(size_t capacity = 10)
  6. : _pData(new T[capacity])
  7. , _size(0)
  8. , _capacity(capacity)
  9. {}
  10. // 使用析构函数演示:在类中声明,在类外定义。
  11. ~Vector();
  12. private:
  13. T* _pData;
  14. size_t _size;
  15. size_t _capacity;
  16. };
  17. // 注意:类模板中函数放在类外进行定义时,需要加模板参数列表
  18. template <class T>
  19. Vector<T>::~Vector()
  20. {
  21. if(_pData)
  22. delete[] _pData;
  23. _size = _capacity = 0;
  24. }
复制代码

3.2 类模板的实例化

类模板实例化与函数模板实例化不同,类模板实例化必要 在类模板名字后跟<>,然后将实例化的范例 放在<>中即可,类模板名字不是真正的类,而实例化的效果 才是真正的类。

  1. // Vector类名,Vector<int>才是类型
  2. Vector<int> s1;
  3. Vector<double> s2;
复制代码

到此这篇关于C++ 函数模板和类模板详情的文章就先容 到这了,更多干系 C++ 函数模板和类模板内容请搜索 脚本之家从前 的文章或继续欣赏 下面的干系 文章渴望 大家以后多多支持脚本之家!


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

avatar 123456848 | 2021-9-19 05:47:49 | 显示全部楼层
好无聊啊!
回复

使用道具 举报

avatar 猥琐大叔求教pv | 2021-9-20 09:05:15 | 显示全部楼层
最近压力山大啊!
回复

使用道具 举报

avatar 沙941 | 2021-9-23 23:02:45 | 显示全部楼层
最近回了很多帖子,都没人理我!
回复

使用道具 举报

avatar 飘渺九月 | 2021-10-1 12:20:46 | 显示全部楼层
有内涵!
回复

使用道具 举报

avatar 龙的传人739 | 2021-10-4 09:42:17 | 显示全部楼层
admin楼主,您提前出院了?
回复

使用道具 举报

avatar 绘粹凭 | 2021-10-9 08:29:00 | 显示全部楼层
经典!
回复

使用道具 举报

avatar XY890 | 5 天前 | 显示全部楼层
怎么我回帖都没人理我呢?
回复

使用道具 举报

admin楼主发几张靓照啊!
回复

使用道具 举报

admin楼主给脑残下了定义!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则