【C++】泛型编程 ② ( 函数模板与普通函数区别 )

文章目录

  • 一、函数模板与普通函数区别
    • 1、函数模板与普通函数区别
    • 2、代码示例 - 函数模板与普通函数区别






一、函数模板与普通函数区别




1、函数模板与普通函数区别


函数模板与普通函数区别 : 主要区别在于它们能够处理的 数据类型数量 和 灵活性 ;

  • 自动类型转换 :

    • 函数模板 不允许 自动类型转化 , 会进行严格的类型匹配 ;
    • 普通函数 能够进行 自动类型转换 , 内含隐式的类型转化 ;
  • 参数 / 返回值 数据类型 :

    • 普通函数 只接受 特定类型 参数 , 如 : int / double / bool / string 等类型 ;
    • 函数模板 可以接受 任何类型 的参数 , 函数模板在 C++ 编译器 编译时 将类型参数实例化 , 生成对应的 普通函数 ;
  • 灵活性 :

    • 普通函数 对于 不同的 数据类型参数 需要单独定义 ; 例如 : 定义一个加法函数 , 接收参数类型分别是 int 和 float 类型 , 此时需要定义 2 个不同的函数 ;
    • 函数模板 只需要定义一个函数 , 就可以接收任何数据类型的参数 ;
  • 语法不同 :

    • 普通函数 直接定义 返回类型 , 函数名 , 参数列表 , 函数体 , 即可 完成函数定义 , 如 : int add(int a, int b){} ;
    • 函数模板 先使用 template <typename T> 声明泛型 , 后面跟着 返回类型 , 函数名 , 参数列表 , 函数体 , 等内容 , 在 函数的 参数列表 返回类型 中可使用 声明的 泛型类型 , 如 : T add(T a, T b){} ;
  • 函数模板实例化 : 使用函数模板时 , C++ 编译器会根据 实际传入的 参数类型 自动实例化相应的函数 ; 如 : 定义的 T add(T a, T b) 类型的 函数模板 , 如果传入 int 类型的参数 , 会自动创建 int add(int a, int b) 普通函数 ;

  • 函数模板弊端 - 复杂性 / 维护难度高 :

    • 复杂性 : 函数模板 需要为每一种可能的类型生成一个函数实例 , 所以 如果使用函数模板处理很多类型 , 需要创建很多普通函数实例 , 会导致编译时间增加 , 代码库增大 ;
    • 维护难度高 : 如果错误地使用 函数模板 可能会导致难以查找的错误 , 普通函数 更简单、更易于理解和维护。

2、代码示例 - 函数模板与普通函数区别


在下面的函数中 , 第一个调用场景 , 完全符合 普通函数 的 调用要求 , 优先调用 普通函数 ;

	int a = 10, b = 20;
	// 调用普通函数
	// 如果符合普通函数要求 优先调用普通函数
	int c = add(a, b);

第二个调用场景 , 因为使用了 函数模板 的显式调用 , 必须使用 函数模板 ;

	int i = 30, j = 40;
	// 调用函数模板
	// 函数模板 显式类型调用
	int k = add<int>(i, j);

第三个调用场景 , 参数类型不符合普通函数调用 , 符合 函数模板 的调用规则 , 这里使用 函数模板 ;

	double x = 50.0, y = 60.0;
	// 调用函数模板
	// 函数模板 自动类型推导
	double z = add(x, y);

代码示例 :

#include "iostream"
using namespace std; 

// 使用 template 关键字 声明函数模板 
// 告诉 C++ 编译器 开始使用 泛型编程 
// 定义的 T 是泛型类型 
// 声明了多个泛型, 可以只使用其中的部分类型
// 使用函数模板时 , 显式类型调用 必须 显式指定所有 泛型类型 的实际类型
template <typename T>
T add(T a, T b) {
	cout << "调用函数模板 T add(T a, T b)"<< endl;
	return a + b;
}

// 函数模板的 重载函数
// 重载是发生在 同一个作用域中
// 重写是发生在 父类 与 子类 之间
// C++ 编译器优先 调用 符合要求的 普通函数
// 如果普通函数不符合要求 , 则考虑调用 函数模板
int add(int a, int b) {
	cout << "调用普通函数 int add(int a, int b)" << endl;
	return a + b;
}

// 普通函数 , 函数模板 调用 优先级
// 函数模板 会进行 严格类型匹配 , 不会进行 类型转换 ; 
// 
// 如果 符合 普通函数类型参数要求 , 优先调用普通函数 ; 
// 如果 没有 符合要求的 普通函数 , 则查看 模板函数 能否匹配 ; 
// 如果 模板函数 仍不能匹配 , 则查看 普通函数 类型转换能否匹配 ; 

int main() {

	int a = 10, b = 20;
	// 调用普通函数
	// 如果符合普通函数要求 优先调用普通函数
	int c = add(a, b);
	cout << "c = " << c << endl;

	int i = 30, j = 40;
	// 调用函数模板
	// 函数模板 显式类型调用
	int k = add<int>(i, j);
	cout << "k = " << k << endl;

	double x = 50.0, y = 60.0;
	// 调用函数模板
	// 函数模板 自动类型推导
	double z = add(x, y);
	cout << "z = " << z << endl;
	
	// 控制台暂停 , 按任意键继续向后执行
	system("pause");

	return 0;
}

执行结果 :


调用普通函数 int add(int a, int b)
c = 30
调用函数模板 T add(T a, T b)
k = 70
调用函数模板 T add(T a, T b)
z = 110
Press any key to continue . . .


在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/149451.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

程序员进阶之路,该怎么走?

时代洪流&#xff0c;大浪淘沙。 逆水行舟&#xff0c;不进则退。 如果你游的速度慢于水流&#xff0c;要么你就是被剩下的沙子&#xff0c;要么就是即将被打翻的行舟了。。。 身为程序员时刻保持危机感&#xff0c;然后陷入内卷...... 卷又卷不赢&#xff0c;躺又躺不平。 …

基于stm32f103系列的简单软件I2C和硬件I2C通讯

这篇文章主要分为三个部分来阐述&#xff0c;分别是I2C的基本知识&#xff0c;软件I2C通讯&#xff0c;硬件I2C通讯。I2C的基本知识这一块&#xff0c;部分讲解以及图表来自b站江科大的up&#xff0c;很感谢这位up&#xff0c;大家可以关注一波。操作实现的时候&#xff0c;up使…

2022年06月 Scratch(一级)真题解析#中国电子学会#全国青少年软件编程等级考试

一、单选题(共25题,每题2分,共50分) 第1题 广场中有声控喷泉,当声音的音量大于60的时候,喷泉就会喷出水,现在的音量为30,下列哪个选项可以让喷泉喷出水? A: B: C: D: 答案:B 当前声音的音量为30,需要将声音增加到60以上就可以让喷泉喷出水,选项A将声音…

cadence virtuoso layout drc error

问题&#xff1a; The BORDER layer must enclose all chip layout patterns, which all chip layout patterns include seal ring if seal ring has been added by designers. This rule checking includes the layers of DNW,AA,NW,NC,PC,MVN, MVP,DG,GT,SN,SP,SAB,CT,M1,V1…

Java 轻松删除PDF指定页、空白页 (免费工具分享)

对PDF页面的增删通常需要借助专门的工具&#xff0c;而这些工具一般需要付费才能使用。那么我们可以通过Java代码免费实现这一功能吗&#xff1f;答案是肯定的。这篇文章就教大家如何使用一个免费的国产Java库来删除PDF中的指定页面或者删除PDF中的空白页。 使用Java快速删除PD…

2022年03月 Scratch(一级)真题解析#中国电子学会#全国青少年软件编程等级考试

一、单选题(共25题,每题2分,共50分) 第1题 天天收到了一个语音机器人,当天天说“a”的时候,机器人会说“apple”,当天天说“b”的时候,机器人会说“banana”, 当天天说“c”的时候,机器人会说“cat”,如果天天说其它内容,机器人就会说“I don’t know”。机器人可…

【论文精读】VOYAGER: An Open-Ended Embodied Agent with Large Language Models

Understanding LSTM Networks 前言Abstract1 Introduction2 Method2.1 Automatic Curriculum2.2 Skill Library2.3 Iterative Prompting Mechanism 3 Experiments3.1 Experimental Setup3.2 Baselines3.3 Evaluation Results3.4 Ablation Studies3.5 Multimodal Feedback from …

Vue3实现 SKU 规格

效果图 1 HTML 基本结构 1.1 遍历 SKU 规格数据 <template><div class"productConten"><div v-for"(productItem, productIndex) in specifications" :key"productItem.name"><div class"productTitle">{…

OpenCV的应用——道路边缘检测

OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源的计算机视觉库&#xff0c;它提供了丰富的图像处理和计算机视觉算法&#xff0c;使得开发者可以便捷地进行图像处理、对象识别、图像分割等任务。道路边缘检测是计算机视觉中的重要应用之一&…

Hive入门--学习笔记

1&#xff0c;Apache Hive概述 定义&#xff1a; Hive是由Facebook开源用于解决海量结构化日志的数据统计&#xff0c;它是基于大数据生态圈Hadoop的一个数据仓库工具。 作用&#xff1a; Hive可以用于将结构化的数据文件【映射】为一张表&#xff0c;并提供类SQL查询功能。 H…

前端实现RSA非对称加密及生成RSA公私密钥

前端实现RSA非对称加密 RSA简介安装jsencryptRSA加密RSA解密如何生成公私秘钥&#xff08;windows&#xff09; RSA简介 RSA用于保密性时&#xff0c;就是公钥加密&#xff0c;私钥解密。 因为公钥是可以公开了&#xff0c; 那么任何人都可以使用公钥对信息进行加密&#xff0…

嵌入式Linux开发,NFS文件系统挂载

在嵌入式linix的开发中&#xff0c;经常会需要在pc端和板端互相传输文件&#xff0c;优先可选择ftp传输&#xff0c;但是有些嵌入式板端不支持&#xff0c;只能使用nfs这种方式&#xff0c;即pc端作为服务端&#xff0c;板端作为客户端&#xff0c;将pc端的某个文件夹挂载到板端…

时间序列预测各类算法探究上篇

前言&#xff1a; 最近项目需要对公司未来业绩进行预测&#xff0c;以便优化决策&#xff0c;so 研究一下时序算法。纯个人理解&#xff0c;记录以便备用&#xff08;只探究一下原理&#xff0c;所有算法都使用基本状态&#xff0c;并未进行特征及参数优化&#xff09;。 环境…

Windows本地配置带GPU的Pytorch环境

首先需要安装并配置好Anaconda环境&#xff0c;安装教程教程随便找一个就好。 第一步&#xff1a;安装好之后创建conda虚拟环境&#xff1a; conda create -n your_env_name pythonx.x 第二步&#xff1a;安装需要版本的pytorch&#xff1a;pytorch下载链接 cu100/torch-1.2…

很多工程师,最后都是被生活裹挟,没法一直在技术路径走到极致

最近比较少更了&#xff0c;但内容一直在写&#xff0c;只是从长文变成了短文&#xff0c;直接发朋友圈了。 如果喜欢我写的内容&#xff0c;请移步到朋友圈。 我是一个不喜欢讲哲理的人&#xff0c;感觉哲学都是理论&#xff0c;都是鸡血&#xff0c;很难落地&#xff0c;我…

Android开发中遇到的问题请求帮助分析解决

本篇文章主要寻求广大的网友&#xff0c;对我遇到的问题进行分析解答&#xff0c;希望能给出更好的&#xff0c;更优化的方法。话不多说先上遇到的问题的流程图的分析&#xff1a; 以上就是流程分析图&#xff0c;希望能够尽快解决&#xff0c;希望得到大家的支持。再次本人非常…

(Matalb回归预测)GWO-BP灰狼算法优化BP神经网络的多维回归预测

目录 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 亮点与优势&#xff1a; 二、实际运行效果&#xff1a; 三、部分代码&#xff1a; 四、完整程序数据使用说明下载&#xff1a; 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 本代码基于Mata…

比特币上的人工智能

以感知机为例 人工智能&#xff0c;尤其是机器学习形式的人工智能&#xff0c;最近取得了巨大的进步&#xff0c;应用范围从人脸识别到自动驾驶汽车。我们建议将 AI 与比特币区块链结合起来&#xff0c;以获得许多其他方式无法实现的显着优势&#xff1a; 公开透明&#xff1a…

腾讯云新用户优惠券如何领取?详细教程来了!

腾讯云一直致力于为广大用户提供优质、高效的云计算服务。为了吸引新用户&#xff0c;腾讯云推出了新用户专属优惠券&#xff0c;本文将详细介绍如何领取腾讯云新用户优惠券&#xff0c;助力大家轻松上云&#xff01; 一、腾讯云新用户优惠券领取 领券入口&#xff1a;https:/…

《Linux从练气到飞升》No.28 Linux中的线程同步

&#x1f57a;作者&#xff1a; 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux菜鸟刷题集 &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f3c7;码字不易&#xff0c;你的&#x1f44d;点赞&#x1f64c;收藏❤️关注对我真的…