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

【C++】—通俗易懂的理解C++中的模板

在这里插入图片描述

文章目录

  • 前言:
  • 💞1.函数模板
    • 💞1.1 函数模板的概念
    • 💞1.2 函数模板的格式
    • 💞1.3 函数模板的原理
    • 💞1.4 函数模板的实例化
    • 💞1.5 模板参数的匹配原则
  • 💞2.类模板
    • 💞1.1 类模板的概念
    • 💞1.2 类模板的格式
    • 💞1.3 类模板的优点
  • 最后:

前言:

模板就相当于我们高中写作文时套用的作文模板,在大多数情况下是可以通用的。那么我们要是在编程中也想利用这种方式呢?那就不得不提起泛型编程——编写与类型无关的通用代码,是代码复用的一种体现。模板只是泛型编程的基础。模板又可以分为函数模板和类模板。

💞1.函数模板

💞1.1 函数模板的概念

  函数模板代表了一个函数的家族,这个函数不受类型的限制,比如可以传int类型也可以传double类型,在使用时被参数化,根据实参的类型而产生特定类型的函数。

💞1.2 函数模板的格式

template< typename T>
返回值类型 函数名(参数列表)
{}

template<typename T>
void Swap(T& left, T& right)
{T tmp = left;left = right;right = tnmp;
}

🎯注意:template是定义模板参数的关键字,也可以使用class但不能用struct代替class

💞1.3 函数模板的原理

函数模板并不是一个函数,而是编译器按使用方式而生成特定类型函数的一个摸具。
在这里插入图片描述
在编译阶段,编译器会根据传来的实参类型来生成出对应的类型函数以供使用。

💞1.4 函数模板的实例化

不同类型的参数使用模板时,称为函数模板的实例化,模板参数实例化又分为隐式实例化显式实例化

 🍒 隐式实例化:让编译器根据实参来推演出对应的函数类型

template<typename T>
T Add(T& a, T& b)
{return a + b;
}
int main()
{int x = 1; int y = 2;Add(x, y);  //隐式实例化double m = 2.0; double n = 3.0;Add(m,n); //隐式实例化//但不能像下面这样传,一个传int类型,一个传double类型,因为模板参数列表中只有一个T,编译器无法确定T为int还是double//Add(x,m);//如果非要传如何处理呢? 1.强制类型转化一下 2.使用显式实例化return 0;
}

 🍒 显式实例化:在函数名后加上指定类型

int main()
{int i = 10;double l = 30.0;Add<int>(i,l); //显式实例化return 0;
}

💞1.5 模板参数的匹配原则

1. 非模板函数和模板函数可以同时存在,模板函数可以被实例化成这个非模板函数,在调用时编译器会优先调用非模板函数

int Add(int left, int right)
{return left + right;
}template<typename T>
T Add(T left, T right)
{return left + right;
}int main()
{Add(1, 2);//调用非模板函数Add<int>(1,2);//调用编译器特化的Add版本return 0;
}

2.对于非模板函数和能实例化出同类型的模板函数,编译器会优先调用非模板函数,不会从模板函数产生一个实例。如果模板函数可以产生一个更匹配的函数,那么将选择模板函数。

//非模板函数int加法函数
int Add(int left, int right)
{return left + right;
}
//通用的加法函数
template<typename T1,typename T2>
T1 Add(T1 left, T2 right)
{return left + right;
}int main()
{Add(1,2); //与非模板函数匹配,不需要函数模板实例化Add(1,2.0);//模板函数可以生成更加匹配的函数,编译器会根据实参生成更加匹配的Add函数。return 0;
}

3. 模板函数不支持自动类型转换,但普通函数可以进行自动类型转换

💞2.类模板

💞1.1 类模板的概念

  类模板允许程序员编写与类型无关的代码,通过使用类模板,就可以生成特定类型的类,而无需为每种类型都编写特定的代码。

💞1.2 类模板的格式

template < typename T>
class 类模板名
{
 类中成员定义
};

//类模板
template<class T>
class Point 
{
public:T x, y;Point(T a,T b):x(a),y(b){}T distanceFromOrigin(){return std::sqrt(x * x + y * y);}
};

Print类模板中有两个变量xy,它们都是类型T.构造函数接受两个参数来初始化xydistanceFromOrigin计算并返回点到原点的距离。

要使用类模板,我们需要指定模板参数的类型,并且创建该类型的对象。例如:

int main()
{Point<int> a(3, 4);cout << a.distanceFromOrigin() << endl;Point<double> b(2.5,3.5);cout << b.distanceFromOrigin() << endl;return 0;
}

💞1.3 类模板的优点

&emsp;类模板的好处是提高了类型的安全性,减少了代码的重复量。通过使用类模板,我们可以编写与类型无关的代码,并在需要时生成特定的类。

最后:

以上就是对c++模板的介绍,如有错误望各位大胆指出,如果这篇文章帮助到了你,记得关注,点赞,收藏, 欲知下篇如何,关注我,请尽请期待


http://www.mrgr.cn/news/51361.html

相关文章:

  • 猫鼠游戏: KaijiK病毒入侵溯源分析
  • 宝宝学画画 4.3.0 |专为儿童设计的绘画启蒙软件
  • 无人机搭载激光雷达在地形测绘中的多元应用
  • 【FP60】林业害虫数据集——目标检测、图像分类
  • [NOIP2017]逛公园
  • 施磊C++ | 进阶学习笔记 | 5.设计模式
  • 接口是什么如何开展pycharm+requests接口自动化
  • 2024年食品安全管理员考试真题题库及答案
  • 进程间的通信(IPC机制)
  • 写论文再也不崩溃!学术救星ChatGPT教你轻松搞定
  • c#数组内数据打乱
  • VS2019 IDE,AddressSanitizer,检测C++代码内存问题
  • 时间序列预测(七)——梯度消失(Vanishing Gradient)与梯度爆炸(Exploding Gradient)
  • 智能电表是如何与远程控制系统连接的?
  • 【Matlab算法MATLAB实现的音频信号时频分析与可视化(附MATLAB完整代码)
  • Net Core发布文件没有View文件夹解决办法!
  • 【黑马redis基础篇】介绍和数据类型
  • WPF基础权限系统
  • Rust : FnOnce与线程池
  • 恺撒密码/置换密码案例