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

文章目录

  • 一、普通函数 与 函数模板 的调用规则 - 类型自动转换
    • 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.hqwc.cn/news/180391.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软件开发之路——关于架构师的一些书籍

文章目录 &#x1f4cb;前言&#x1f3af;什么是架构师&#x1f525;文末送书《高并发架构实战&#xff1a;从需求分析到系统设计》《中台架构与实现&#xff1a;基于DDD和微服务》《架构师的自我修炼&#xff1a;技术、架构和未来》《分布式系统架构&#xff1a;架构策略与难题…

Postman实现接口的加密和解密

近期在复习Postman的基础知识&#xff0c;在小破站上跟着百里老师系统复习了一遍&#xff0c;也做了一些笔记&#xff0c;希望可以给大家一点点启发。 1、目前市面上的加密的方式 对称式加密&#xff1a;DES&#xff0c;AES&#xff0c;Base64加密算法 非对称加密&#xff1a…

入门后端开发得学什么?这份超详细的后端开发学习路线图值得推荐!

后端开发, 无疑是一个极为关键的领域&#xff0c;涉及到我们每日互联网生活的每个细节。每当你在网上浏览、搜索或进行购物等活动时&#xff0c;背后都有大量的后端技术作为支撑。而随着技术的日益进步&#xff0c;人们对于高效、稳定和安全的网络服务的需求也越来越高。 另一…

自己动手实现一个深度学习算法——六、与学习相关的技巧

文章目录 1.参数的更新1&#xff09;SGD2&#xff09;Momentum3&#xff09;AdaGrad4&#xff09;Adam5&#xff09;最优化方法的比较6&#xff09;基于MNIST数据集的更新方法的比较 2.权重的初始值1&#xff09;权重初始值不能为02&#xff09;隐藏层的激活值的分布3&#xff…

Leadshop开源商城小程序源码 – 支持公众号H5

Leadshop是一款出色的开源电商系统&#xff0c;具备轻量级、高性能的特点&#xff0c;并提供持续更新和迭代服务。该系统采用前后端分离架构&#xff08;uniappyii2.0&#xff09;&#xff0c;以实现最佳用户体验为目标。 前端部分采用了uni-app、ES6、Vue、Vuex、Vue Router、…

vagrant+virtualbox的踩坑记录

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

C/C++最大质数 2021年9月电子学会青少年软件编程(C/C++)等级考试一级真题答案解析

目录 C/C比n小的最大质数 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 C/C比n小的最大质数 2021年9月 C/C编程等级考试一级编程题 一、题目要求 1、编程实现 对于给定的n&#xff0c;求比n小的质数中…

linux 系统下文本编辑常用的命令

一、是什么 Vim是从 vi 发展出来的一个文本编辑器&#xff0c;代码补全、编译及错误跳转等方便编程的功能特别丰富&#xff0c;在程序员中被广泛使用。 简单的来说&#xff0c; vi 是老式的字处理器&#xff0c;不过功能已经很齐全了&#xff0c;但是还是有可以进步的地方 而…

5. HTML中常用标签

5. html常用标签 5.1 标签语义 学习标签是有技巧的&#xff0c;重点是记住每个标签的语义。简单理解就是指标签的含义。即这个标签是用来干嘛的。 根据标签的语义&#xff0c;在合适的地方给一个最为合理的标签。可以让页面结构给清晰。 5.2 标题标签 <h1>-<h6>…

基于STM32的LoRaWAN无线通信网络设计与实现

LoRaWAN (Long Range Wide Area Network) 是一种低功耗的无线通信技术&#xff0c;用于构建广域物联网。本篇文章将介绍基于STM32微控制器的LoRaWAN无线通信网络的设计与实现&#xff0c;并提供相应的代码示例。 概述 LoRaWAN的无线通信技术采用低功耗长距离传输&#xff0c;…

STL—next_permutation函数

目录 1.next_permutation函数的定义 2.简单使用 2.1普通数组全排列 2.2结构体全排列 2.3string 3.补充 1.next_permutation函数的定义 next_permutation函数会按照字母表顺序生成给定序列的下一个较大的排列&#xff0c;直到整个序列为降序为止。与其相对的还有一个函数—…

春秋云境靶场CVE-2022-25578漏洞复现(利用htaccess文件进行任意文件上传)

文章目录 前言一、CVE-2022-25578靶场概述二、CVE-2022-25578复现需要知道的知识点1、什么是htaccess文件2、上传htaccess文件的条件是什么&#xff1f;3、htaccess文件的作用是什么&#xff1f; 三、CVE-2022-32991漏洞复现1、信息收集2、找上传点3、上传后蚁剑连接getshell 总…