c++分离讲解模板的概念与使用

 更新时间:2022年04月24日 15:29:39   作者:一起慢慢变强  
人们需要编写多个形式和功能都相似的函数,因此有了函数模板来减少重复劳动;人们也需要编写多个形式和功能都相似的类,于是 C++ 引人了类模板的概念,编译器从类模板可以自动生成多个类,避免了程序员的重复劳动

泛类编程

学习模板,首先我们需要了解一下什么是泛类编程

#include<iostream>
using namespace std;
int add(int a, int b)
{
	return a + b;
}
double add(double a, double b)	//这两个add构成了函数重载
{
	return a + b;
}
int main()
{
	int a = 1;
	int b = 2;
	double c = 3;
	double d = 4;
	cout << add(a, b) << endl;	
	cout << add(c, d) << endl;	
	//假如我们想要实现不同类型变量的相加,可以创建不同的函数,构成函数重载来分别调用不同的函数
	return 0;
}

我们可以使用c++的函数重载来解决这个问题,但是函数重载本身就存在问题

1、函数重载仅仅类型不同,假如出现了新的类型,我们就需要重新写新的函数重载,代码的利用率低

2、代码可维护性低,一个出错可能会导致所有函数重载出错

泛型编程:编写与类型无关的通用代码,是代码复用的一种手段

所以c++提供了一种模板来解决这个问题

模板本质上:本来应该由你写的代码,然后不想重复写,你给了一个模板,编译器通过模板,帮你生成了对应的代码

函数模板

函数模板的概念

函数模板代表了一个函数家族,该函数模板与实参无关,当函数被使用时候会被实参初始化,从而产生不同的函数类型

函数模板的使用

函数模板的格式:

template<typename T1, typename T2, ......, typename Tn>	//函数模板的参数不止一个,可以有很多参数
//返回值类型 函数名(参数列表) {}

函数模板的使用: 

template<typename T>	//也可以用<class T>,效果和<typename T>一样,但是不能用struct
T add(T x, T y)
{
	return x + y;
}

注意:typename是函数模板的关键字,也可以使用class,但是不能使用struct

函数模板的实例化

当我们用不同的参数使用函数模板时,就称为函数模板的初始化

函数模板的实例化有两种:

1、隐式实例化(让编译器根据实参推演模板参数的实际类型)

#include<iostream>
using namespace std;
template<typename T>	
T add(T x, T y)
{
	return x + y;
}
int main()
{
	int a = 1, b = 2;
	double c = 3, d = 4;
	cout << add(a, b) << endl;	//使用了隐式实例化,由编译器自动推演实例化参数类型
	return 0;
}

2. 显式实例化(在函数名后的<>中指定模板参数的实际类型)

#include<iostream>
using namespace std;
template<typename T>	
T add(T x, T y)
{
	return x + y;
}
int main()
{
	int a = 1, b = 2;
	double c = 3, d = 4;
	cout << add<int>(a, c) << endl;	
	//由于a和c的类型不同,所以我们必须使用显示实例化,即函数名后面<type>括号中加上你想要实例化的类型
	return 0;
}

函数模板的匹配原则

1、模板模板可以和一个同名非函数模板同时存在 

2、假如模板函数和非模板函数同名,编译器会选择一个更匹配的类型进行使用

#include<iostream>
using namespace std;
int add(int x, int y)
{
	return x + y;
}
template<typename T>	
T add(T x, T y)
{
	return x + y;
}
int main()
{
	int a = 1, b = 2;
	double c = 3, d = 4;
	cout << add(a, b) << endl;	//因为a,b是整型,所以会调用非函数模板,因为有都是整型参数的非函数模板
	return 0;
}

3、模板函数不允许自动类型转换,但普通函数可以进行自动类型转换

#include<iostream>
using namespace std;
template<typename T>	
T add(T x, T y)
{
	return x + y;
}
int main()
{
	int a = 1, b = 2;
	double c = 3, d = 4;
	cout << add(a, (int)c) << endl;	
	return 0;
}

假如我们要使用函数模板的add,需显示实例化add,或者将c强制类型转换,函数模板不会自动转换,因为他不知道要如何转换的

类模板

类模板的定义格式

类模板的定义格式:

template<class T1, class T2, ..., class Tn>
class 类模板名
{
// 类内成员定义
};
template<class T>	//创建类模板
class Date
{
public:
	void init();
private:
	int _year;
};
template<class T>	//假如我们需要在类模板的类外面定义函数,需要添加模板列表
Date<int>init()	//还需要在类名后面<>中添加模板参数列表
{
	_year = 0;
}

类模板的实例化

//Date是类名,Date<int>是类型
Date<int> d;	//类模板的实例化需要在类模板名的后面<>中添加想要实例化的类型

到此这篇关于c++分离讲解模板的概念与使用的文章就介绍到这了,更多相关c++模板内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言队列和应用详情

    C语言队列和应用详情

    这篇文章主要介绍了C语言队列和应用详情,文章将让大家掌握掌握队列的原理和作用、掌握队列的写法、掌握队列在产品中的应用,需要的朋友可以参考一下
    2022-03-03
  • c++ chrono 获取当前时间的实现代码

    c++ chrono 获取当前时间的实现代码

    这篇文章主要介绍了c++ chrono 获取当前时间的实现代码,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-07-07
  • C语言实现爆炸展开的扫雷详解

    C语言实现爆炸展开的扫雷详解

    windows自带的游戏《扫雷》是陪伴了无数人的经典游戏,本文将利用C语言实现这一经典的游戏,文中的示例代码讲解详细,感兴趣的可以学习一下,这篇文章主要介绍了C语言实现爆炸展开的扫雷游戏
    2022-07-07
  • Qt实现两个独立窗口的信号通信

    Qt实现两个独立窗口的信号通信

    这篇文章主要为大家详细介绍了Qt实现两个独立窗口的信号通信,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • 一篇文章带你了解论C语言中算法的重要性

    一篇文章带你了解论C语言中算法的重要性

    最近一直在学数据结构与算法,深深的感受到我们学习语言,永远都只是一项工具,方法才是其中最重要的部分。这篇文章我将会通过几个例子来说明算法,也就是写程序的思路在程序中的重要意义
    2021-08-08
  • 使用C++制作GC Server过程详解

    使用C++制作GC Server过程详解

    这篇文章主要介绍了使用C++制作GC Server过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • Linux下Select多路复用实现简易聊天室示例

    Linux下Select多路复用实现简易聊天室示例

    大家好,本篇文章主要讲的是Linux下Select多路复用实现简易聊天室示例,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12
  • 利用C语言实践OOP,以及new,delete的深入分析

    利用C语言实践OOP,以及new,delete的深入分析

    本篇文章是对用C语言实践OOP,new,delete进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C++实现LeetCode(35.搜索插入位置)

    C++实现LeetCode(35.搜索插入位置)

    这篇文章主要介绍了C++实现LeetCode(35.搜索插入位置),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • C语言实现简单登录操作

    C语言实现简单登录操作

    这篇文章主要为大家详细介绍了C语言实现简单登录操作,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06

最新评论