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

这篇具有很好参考价值的文章主要介绍了【C++】泛型编程 ② ( 函数模板与普通函数区别 )。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。






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




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 . . .


【C++】泛型编程 ② ( 函数模板与普通函数区别 ),C++,c++,泛型,泛型编程,函数模板,template文章来源地址https://www.toymoban.com/news/detail-830961.html

到了这里,关于【C++】泛型编程 ② ( 函数模板与普通函数区别 )的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C++】泛型编程 ① ( 函数模板 | 函数模板概念 | 函数模板意义 | 函数模板定义语法 | 函数模板调用语法 | 显式类型调用 | 自动类型推导 )

    在 C++ 语言中 , 泛型编程 的 核心就是 函数模板 和 类模板 ; 函数模板 Function Template 是 C++ 语言 中的 重要特性 ; 函数模板概念 : 建立一个 \\\" 通用函数 \\\" , 不指定该函数的 函数返回值类型 和 函数参数类型 , 仅使用 \\\" 虚拟类型 \\\" 代表 上述 两种类型 , 该 \\\" 通用函数 \\\" 就是 \\\" 函数模

    2024年02月19日
    浏览(28)
  • C++、STL标准模板库和泛型编程 ——迭代器、 算法、仿函数(侯捷)

    侯捷 C++八部曲笔记汇总 - - - 持续更新 ! ! ! 一、C++ 面向对象高级开发 1、C++面向对象高级编程(上) 2、C++面向对象高级编程(下) 二、STL 标准库和泛型编程 1、分配器、序列式容器 2、关联式容器 3、迭代器、 算法、仿函数 4、适配器、补充 三、C++ 设计模式 四、C++ 新标准 五、

    2023年04月25日
    浏览(38)
  • 【C++】泛型编程——模板进阶

    在之前的文章里,我们进行了模板初阶的学习( 【C++】泛型编程——模板初阶),了解了什么是泛型编程,学习了函数模板和类模板。 那这篇文章,我们继续学习模板进阶的内容的学习。 首先我们来回顾一下: 我们在模板初阶的学习中,定义模板参数是怎么定义的? 是不

    2024年02月16日
    浏览(25)
  • C++泛型编程之模板

    目录 一、什么是泛型编程  二、函数模板 2.1函数模板的概念 2.2函数模板格式 2.3函数模板的原理  2.5函数模板的实例化 2.6模板参数的匹配原则 三、类模板 3.1类模板的定义格式 3.2 类模板的实例化 四、非类型模板参数 五、模板的特化 5.1模板特化的概念: 5.2函数模板特化 5

    2024年02月07日
    浏览(27)
  • 【C++】C++泛型编程 | 模板初阶

      🧑‍🎓 个人主页:简 料   🏆 所属专栏:C++   🏆 个人社区:越努力越幸运社区   🏆 简       介: 简料简料,简单有料~在校大学生一枚,专注C/C++/GO的干货分享,立志成为您的好帮手 ~ C/C++学习路线 (点击解锁) ❤️ C语言 ❤️ 初阶数据结构与算法 ❤️ C++ ❤️

    2024年02月08日
    浏览(64)
  • 【C++基础(十)】C++泛型编程--模板初阶

    💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:C++从入门到精通⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学习C++   🔝🔝 在学习数据结构时会遇见以下的情况 数据结构中存储的类型往往不能确定 所以在实现数据结构时往往是这样做的 在写代码时用DateType来表

    2024年02月13日
    浏览(22)
  • C++——模板初阶与泛型编程

    🌸作者简介: 花想云 ,在读本科生一枚,致力于 C/C++、Linux 学习。 🌸 本文收录于 C++系列 ,本专栏主要内容为 C++ 初阶、C++ 进阶、STL 详解等,专为大学生打造全套 C++ 学习教程,持续更新! 🌸 相关专栏推荐: C语言初阶系列 、 C语言进阶系列 、 数据结构与算法 本章我们

    2023年04月17日
    浏览(29)
  • 【c++ primer 笔记】第 16章 模板与泛型编程

    🎉作者简介:👓 博主在读机器人研究生,目前研一。对计算机后端感兴趣,喜欢 c + + , g o , p y t h o n , 目前熟悉 c + + , g o 语言,数据库,网络编程,了解分布式等相关内容 textcolor{orange}{博主在读机器人研究生,目前研一。对计算机后端感兴趣,喜欢c++,go,python,目前熟悉c+

    2024年02月20日
    浏览(27)
  • C++、STL标准模板库和泛型编程 ——适配器、补充(侯捷)

    侯捷 C++八部曲笔记汇总 - - - 持续更新 ! ! ! 一、C++ 面向对象高级开发 1、C++面向对象高级编程(上) 2、C++面向对象高级编程(下) 二、STL 标准库和泛型编程 1、分配器、序列式容器 2、关联式容器 3、迭代器、 算法、仿函数 4、适配器、补充 三、C++ 设计模式 四、C++ 新标准 五、

    2023年04月27日
    浏览(59)
  • C++核心编程——详解函数模板

    纵有疾风起,人生不言弃。本文篇幅较长,如有错误请不吝赐教,感谢支持。 ①为什么有模板? 在C++程序中,声明变量、函数、对象等实体时,程序设计者需要指定数据类型,让编译器在程序运行之前进行类型检查并分配内存,以提高程序运行的安全性和效率。 但是这种强

    2024年02月09日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包