当前位置: 首页 > article >正文

模板初阶(C++)

初识模板

模板分为 函数模板和类模板这两种,模板可以理解为是一套固有的方法,通过改变里面不同的载体( 参数类型)进而调高代码的复用性。这是一个经典案例,在不使用模板的情况下,若遇见不同类型的参数,需要不断的编写函数。这样不利于提高代码的编写效率。
void Swap(int& left, int& right)
{
int temp = left;
left = right;
right = temp;
}
void Swap(double& left, double& right)
{
double temp = left;
left = right;
right = temp;
}
void Swap(char& left, char& right)
{
char temp = left;
left = right;
right = temp;
}

函数模板

template是模板函数的关键字有的也会写成class,(但是两者在后面会有明显的区别后面会结合具体案例进行介绍这里不进行深入介绍),typename 指的是类型名称 ,这里的T是取自type的简写,T可以置换成其他字母也是可以的。模板参数的类型是根据传入的参数进行自动识别类型,在遇见传入参数类型不同,需要为不同的类型进行分别做标记

//调用相同类型的模板

template<typename T>

//调用不同类型的模板

template<typename T1,typename T2>

 函数模板使用案例:

1.调用相同类型

#include<iostream>
using namespace std;
template<typename T>
void Swap(T& left, T& right)
{
    T temp = left;
    left = right;
    right = temp;
    cout << left <<" " << right << endl;

}
int main()
{
    int a = 2, b = 3;
    double c = 3.3, d = 4.4;
    Swap(a, b);
    Swap(c, d);
}
运行结果

 2.调用不同类型

 这里是模板参数类型不同的情况,a和c的类型不同,这里有两种解决办法。1.用户自身进行转换。2.就是进行显式实例化。我这里用了用户自身强制转换。

 函数模板的原理

上面案例,我们会产生一个疑问使用函数模板调用的是同一个函数吗?这里我们可以通过反汇编观察一下底层代码函数是如何进行调用的,这里可以看出调用的并不是一个函数,而是两个函数。

反汇编角度下的函数模板原理

 

显式实例化

在函数名+ <> 中指定模板参数的实际类型

隐式实例化

隐式实例化是通过自动识别的,隐式实例化如果遇见参数列表中,参数不同时就会报错。

 为什么当出现同名,同条件时会优先调用非函数模板

在调用函数模板的时候会首先,要分别自动识别各个参数的类型,在识别后才会进行函数的调用,而非函数模板是不用调用可以直接执行的。所以会优先调用非函数模板。如果出现调用参数类型与非函数模板不同时就会优先调用函数模板。

int add(int left, int right)
{
	return (left + right)*2;
}
template<typename T>
T add( T left,  T right)
{
	return left + right;
}
int main()
{
	int a = 2, b = 3;
	cout << add(a,b) << endl;

	return 0;
}

类模板

template<typename/class T,typename/class T,.....>

class 类名

{

}

 类模板的实例化

类模板的类型:类模板名字<参数类型>

 补充:类模板只能显示实例化,因为类模板并未进行构造传参。所以类的类型的书写形式是 类模板名字<参数类型>。

如何在类模板范围之外使用类模板

在类模板中声明和定义不能分离,因为类模板使用的范围只能在类的里面出了就不能再进行使用,如果使用就会进行报错

 解决方案:

 总结

以上就是本次知识点总结主要涉及函数模板和类模板基础知识点,以及使用的语法细节,最后期待能留下你的一键三连(点赞,关注,收藏)。


http://www.kler.cn/news/319750.html

相关文章:

  • 适合二开的web组态软件
  • Redis入门介绍
  • JAVA大学期末考试真题(带答案)
  • C++(9.23)
  • Profinet通讯电能计量装置 功能介绍
  • 智慧体育馆可视化:实时监控与智能管理
  • 滑动窗口算法第一弹(长度最小的子数组,无重复字符的最长子串 最大连续1的个数III)
  • C++: 继承
  • grafana 使用常见问题
  • Unity数据持久化4——2进制
  • Flink的反压机制:底层原理、产生原因、排查思路与解决方案
  • MySQL高阶1949-坚定地友谊
  • 查询最近正在执行的sql(DM8 : 达梦数据库)
  • 【艾思科蓝】Spring Boot实战:零基础打造你的Web应用新纪元
  • 漫谈 Kubernetes 的本质
  • 网络安全:腾讯云智、绿盟、美团、联想的面经
  • [WMCTF2020]Make PHP Great Again 2.01
  • 使用 Python 绘制 BTC 期权的波动率曲面
  • ③无需编程 独立通道 Modbus主站EtherNet/IP转ModbusRTU/ASCII工业EIP网关串口服务器
  • 单词搜索问题(涉及递归等)
  • docker多阶段镜像制作,比如nginx镜像,编译+制作
  • 【SpringBoot整合Redis测试Redis集群案例】
  • 【QT 5 调试软件+Linux下调用脚本shell-无法调度+目录拼写+无法找目录+sudo权限(2)+问题解决方式+后续补充】
  • linux网络编程8
  • 【JavaScript】算法之贪心算法(贪婪算法)
  • C++之文件操作
  • 考虑电网交互及禁止运行区的风电、光伏与火电互补调度运行(MATLAB-Yalmip-Cplex全代码)
  • uniapp webview清理缓存
  • 华为云徐峰:AI赋能应用现代化,加速软件生产力跃升
  • 聚合函数count 和 group by