【C++】泛型编程 ④ ( 函数模板 与 普通函数 调用规则 | 类型自动转换 | 类型自动转换 + 显式指定泛型类型 )

news2024/11/26 2:43:59

文章目录

  • 一、普通函数 与 函数模板 的调用规则 - 类型自动转换
    • 1、函数模板和重载函数
    • 2、类型自动转换
    • 3、代码示例 - 类型自动转换
  • 二、普通函数 与 函数模板 的调用规则 - 类型自动转换 + 显式指定泛型类型
    • 1、类型自动转换 + 显式指定泛型类型
    • 2、代码示例 - 类型自动转换 + 显式指定泛型类型






一、普通函数 与 函数模板 的调用规则 - 类型自动转换




1、函数模板和重载函数


定义了 函数模板 , 该 函数模板 可以接收 任意类型的参数 T , 但是要求这两个参数类型 T 和 返回值类型 T 必须是相同的 ;

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

此外还定义了 函数模板 的 重载函数 , 该重载函数 接收两个 int 类型的参数 , 同时返回 int 类型的返回值 ;

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

2、类型自动转换


当 函数模板 有 重载的 普通函数时 , 普通函数 调用 优先级 高于 函数模板 ;

函数模板 会进行 严格类型匹配 , 不会进行 类型转换 ;

普通函数 如果 遇到 参数不匹配的情况 , 会将 函数参数 进行类型自动转换 ;


函数模板 与 普通函数 在 类型自动转换 方面调用规则如下 :

  • 首先 , 如果 符合 普通函数类型参数要求 , 优先调用普通函数 ;
  • 然后 , 如果 没有 符合要求的 普通函数 , 则查看 模板函数 能否匹配 ;
  • 最后 , 如果 模板函数 仍不能匹配 , 则查看 普通函数 类型转换能否匹配 ;

3、代码示例 - 类型自动转换


代码示例 :

#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; 
	char x = 'A', y = 'B';

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

	// 调用 函数模板
	// 普通函数类型不匹配, 查看 模板函数 能否匹配
	// 模板函数可以匹配
	int d = add(x, y);
	cout << "d = " << d << endl;

	// 调用 普通函数
	// 普通函数类型不匹配, 查看 模板函数 能否匹配
	// 模板函数不可以匹配 , 继续查看 普通函数 类型自动转换
	// x 可以转为 int 类型 , 这样就可以符合普通函数参数要求
	int e = add(a, x);
	cout << "e = " << e << endl;

	// 控制台暂停 , 按任意键继续向后执行
	system("pause");

	return 0;
}

执行结果 :

调用普通函数 int add(int a, int b)
c = 30
调用函数模板 T add(T a, T b)
d = -125
调用普通函数 int add(int a, int b)
e = 75
请按任意键继续. . .

在这里插入图片描述





二、普通函数 与 函数模板 的调用规则 - 类型自动转换 + 显式指定泛型类型




1、类型自动转换 + 显式指定泛型类型


在上面示例的前提下 , 如果 传入参数 类型分别是 int 和 char , 并且强行指定 泛型类型 , 这样必须使用函数模板 , 此时 函数模板 也可以进行 类型自动转换 ;

	int a = 10, b = 20; 
	char x = 'A', y = 'B';

	// 调用 函数模板
	// 函数模板 显式类型调用 , 强行使用 函数模板
	int k = add<int>(a, x);
	cout << "k = " << k << endl;

2、代码示例 - 类型自动转换 + 显式指定泛型类型


代码示例 :

#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; 
	char x = 'A', y = 'B';

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

	// 调用 函数模板
	// 普通函数类型不匹配, 查看 模板函数 能否匹配
	// 模板函数可以匹配
	int d = add(x, y);
	cout << "d = " << d << endl;

	// 调用 普通函数
	// 普通函数类型不匹配, 查看 模板函数 能否匹配
	// 模板函数不可以匹配 , 继续查看 普通函数 类型自动转换
	// x 可以转为 int 类型 , 这样就可以符合普通函数参数要求
	int e = add(a, x);
	cout << "e = " << e << endl;

	// 调用 函数模板
	// 函数模板 显式类型调用 , 强行使用 函数模板
	int k = add<int>(a, x);
	cout << "k = " << k << endl;

	// 控制台暂停 , 按任意键继续向后执行
	system("pause");

	return 0;
}

执行结果 :

调用普通函数 int add(int a, int b)
c = 30
调用函数模板 T add(T a, T b)
d = -125
调用普通函数 int add(int a, int b)
e = 75
调用函数模板 T add(T a, T b)
k = 75
请按任意键继续. . .

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第14届蓝桥杯青少组python试题解析:22年10月选拔赛

选择题 T1. 执行print (5%3) 语句后&#xff0c;输出的结果是 ( ) 0 1 2 3 T2. 以下选项中&#xff0c;哪一个是乘法运算符?&#xff08;&#xff09; % // * ** T3. 已知x3&#xff0c;求x//2x**2的运算结果? 7.5 10 8 10.5 T4. 以下选项中&#xff0c;对下面程序的打印…

P6入门:项目初始化11-项目详情之计算Calculations

前言 使用项目详细信息查看和编辑有关所选项目的详细信息&#xff0c;在项目创建完成后&#xff0c;初始化项目是一项非常重要的工作&#xff0c;涉及需要设置的内容包括项目名&#xff0c;ID,责任人&#xff0c;日历&#xff0c;预算&#xff0c;资金&#xff0c;分类码等等&…

python科研绘图:P-P图与Q-Q图

目录 什么是P-P图与Q-Q图 分位数 百分位数 Q-Q图步骤与原理 Shapiro-Wilk检验 绘制Q-Q图 绘制P-P图 什么是P-P图与Q-Q图 P-P图和Q-Q图都是用于检验样本的概率分布是否服从某种理论分布。 P-P图的原理是检验实际累积概率分布与理论累积概率分布是否吻合。若吻合&#xf…

基于ChatGPT的文本生成艺术框架—WordArt Designer

WordArt Designer是一个基于gpt-3.5 turbo的艺术字生成框架&#xff0c;包含四个关键模块:LLM引擎、SemTypo、Styltypo和TextTypo模块。由gpt-3.5 turbo驱动的LLM引擎可以解释用户输入&#xff0c;从而将抽象概念转化为具体的设计。 SemTypo模块使用语义概念优化字体设计&…

Qt 5.15.11 源码windows编译

1.下载qt5.15.11源码 https://download.qt.io/official_releases/qt/5.15/5.15.11/single/qt-everywhere-opensource-src-5.15.11.zip 2.解码源码到桌面 3.安装cmake ,python ,perl, Visual Studio 2019 Strawberry Perl for Windows Win flex-bison download | SourceForge…

把大模型装进手机,总共分几步?

年初ChatGPT爆火的时候&#xff0c;我去上海参加华为春季新品发布会&#xff0c;用一页keynote提到了大模型技术与手机硬件的结合。虽然只有短短的一两分钟&#xff0c;但我专门发了一条朋友圈&#xff0c;看好自然语言交互能力在手机上的应用。 当时我就有预感&#xff0c;大语…

CSDN每日一题学习训练——Python版(输入起始和结束的正整数,求其两个正整数之间的偶数和、两数相加)

版本说明 当前版本号[20231115]。 版本修改说明20231115初版 目录 文章目录 版本说明目录输入起始和结束的正整数&#xff0c;求其两个正整数之间的偶数和。题目解题思路代码思路参考代码 两数相加题目解题思路代码思路参考代码 输入起始和结束的正整数&#xff0c;求其两个…

51单片机应用从零开始(三)

51单片机应用从零开始&#xff08;一&#xff09;-CSDN博客 51单片机应用从零开始&#xff08;二&#xff09;-CSDN博客 详解 KEIL C51 软件的使用建立工程-CSDN博客 详解 KEIL C51 软件的使用设置工程编绎与连接程序-CSDN博客 目录 1. 用单片机控制第一个灯亮 2. 认识单片…

<MySQL> 查询数据进阶操作 -- 联合查询

目录 一、什么是笛卡尔积&#xff1f; 二、什么是联合查询&#xff1f; 三、内连接 3.1 简介 3.2 语法 3.3 更多的表 3.4 操作演示 四、外连接 4.1 简介 4.2 语法 4.3 操作演示 五、自连接 5.1 简介 5.2 自连接非必要不使用 六、子查询(嵌套查询) 6.1 简介 6.…

C语言:简单的用二维数组打印杨氏三角

杨辉三角&#xff0c;又称帕斯卡三角&#xff0c;是一个数学上的规律图形。它的构造规则如下&#xff1a; 每一行的两个端点数字是1。从第三行开始&#xff0c;每个数字是它上方两个数字的和。每一行数字左右对称。 #include<stdio.h> int main() {int arr[50][50];//定…

应用架构的演进 I 使用无服务器保证数据一致性

在微服务架构中&#xff0c;一个业务操作往往需要跨多个服务协作完成&#xff0c;包含了读取数据和更新多个服务的数据同时进行。在数据读取和写入的过程中&#xff0c;有一个服务失败了&#xff0c;势必会造成同进程其他服务数据不一致的问题。 亚马逊云科技开发者社区为开发者…

笔试面试相关记录(13)

&#xff08;1&#xff09;一个链表&#xff0c;当一个结点为偶数&#xff0c;且它前面的结点为奇数时&#xff0c;将这个节点合并到前面的结点中&#xff0c;一直执行这个操作&#xff0c;知道没有满足条件的结点时。 输入如下&#xff1a;{2,3,4,1,2,2,3} 输出&#xff1a;…

windiws docker 部署jar window部署docker 转载

Windows环境下从安装docker到部署前后端分离项目(springboot+vue) 一、前期准备 1.1所需工具: 1.2docker desktop 安装 二、部署springboot后端项目 2.1 部署流程 三、部署vue前端项目 3.1相关条件 3.2部署流程 四、前后端网络请求测试 一、前期准备 1.1所需工具: ①docke…

炒现货黄金怎么做?挖掘黄金的投资机会

黄金一直以来都是备受投资者追捧的避险资产&#xff0c;其价值和潜力是无法忽视的。而炒现货黄金作为一种快速获取收益的投资方式&#xff0c;备受关注。那么&#xff0c;如何在炒现货黄金中找到投资机会呢&#xff1f;为您详细解析&#xff0c;简单易懂&#xff0c;帮助您开启…

[PyTorch][chapter 63][强化学习-QLearning]

前言&#xff1a; 这里结合走迷宫的例子,重点学习一下QLearning迭代更新算法 0,1,2,3,4 是房间&#xff0c;之间绿色的是代表可以走过去。 5为出口 可以用下图表示 目录&#xff1a; 策略评估 策略改进 迭代算法 走迷宫实现Python 一 策略评估 强化学习最终是为了…

247:vue+openlayers 根据坐标显示多边形(3857投影),计算出最大幅宽

第247个 点击查看专栏目录 本示例是演示如何在vue+openlayers项目中根据坐标显示多边形(3857投影),计算出最大幅宽。这里先通过Polygon来显示出多边形,利用getExtent() 获取3857坐标下的最大最小x,y值,通过ransformExtent转换坐标为4326, 通过turf的turf.distance和计算…

Winodws核心编程 多线程

目录 一、基本概念 二、线程创建函数 三、Windows内核对象与句柄 四、简单的多线程案例 五、线程同步 - 互斥对象 六、多线程实现群聊的服务端和客户端 七、线程同步 - 事件对象 八、事件对象 与 互斥对象区别 九、线程同步 - 信号量 十、线程同步 - 关键代码段 十一…

HC^2:基于混合对比学习的多场景广告预估建模

1. 摘要 多场景广告预估建模旨在利用多场景的数据来训练统一的预估模型&#xff0c;以提高各个场景的效果。尽管现有研究方法在推荐/广告领域已取得了不错的提效&#xff0c;但现有的建模方式仍然缺乏跨场景关系的考虑&#xff0c;从而导致模型学习能力的限制和场景间相互关系建…

企业APP软件定制开发的关键步骤|网站小程序搭建

企业APP软件定制开发的关键步骤|网站小程序搭建 在当今数字化快速发展的时代&#xff0c;企业越来越意识到拥有自己的APP软件对于提高业务效率和用户体验的重要性。然而&#xff0c;企业APP软件定制开发并不是一项简单的任务&#xff0c;它需要经过一系列关键步骤来确保最终的产…

vagrant+virtualbox的踩坑记录

vagrant virtualbox 文章目录 vagrant virtualbox一、导入虚拟机ova文件失败二、修改虚拟机的保存位置三、无法使用xshell等软件用密码进行连接四、vagrant up失败 一、导入虚拟机ova文件失败 背景&#xff1a;手动删除了虚拟机文件导致无法重新导入相同名称虚拟机的ova文件…