C++ 面向对象(类和对象)—— 函数模板

06-01 438阅读

C++ 面向对象(类和对象)—— 函数模板

C++ 面向对象(类和对象)—— 函数模板

​ 🎁个人主页:工藤新一¹

​ 🔍系列专栏:C++面向对象(类和对象篇)

​ 🌟心中的天空之城,终会照亮我前方的路

​ 🎉欢迎大家点赞👍评论📝收藏⭐文章

文章目录

  • 模板
    • 一、模板简介
    • 二、函数模板
      • 2.1函数模板的基本语法
        • 2.1.1函数模板的调用方式
        • 2.2函数模板的注意事项
        • 2.4函数模板案例
        • 2.5普通函数和函数模板的区别
        • 2.5.1隐式类型转换
        • 2.6普通函数和函数模板的调用规则
        • 2.7模板的局限性
          • 2.7.1运算符重载
          • 2.7.2具体化模板

            模板

            • 本阶段主要针对于==C++范式编程和STL技术==进行详细讲解,探讨 C++ 更深层的应用

              template — 类模板

              template — 函数模板

              这两种模板的形式,在作用上是无差别的,唯一用法可能只是在于对函数模板和类模板的区分


              一、模板简介

              1. 类型安全:模板提供了类型安全,因为编译器会在编译时检查类型错误。
              2. 代码重用:通过使用模板,你可以编写一次代码,然后对多种类型重用它,从而减少代码重复,提高复用性。
              3. 性能:模板在编译时实例化,这意味着没有运行时开销,性能通常比使用虚函数或动态类型识别(如 typeid)更好。

              模板就是建立通用的摸具,大大提高复用性

              C++ 面向对象(类和对象)—— 函数模板

              • 模板的特点:
                • 模板不可以直接使用,它只是一个框架
                • 模板的通用并不是万能的

                  二、函数模板

                  • C++的另一种编程思想叫做泛型编程,主要利用的技术就是模板
                  • C++提供两种模板机制:函数模板 和 类模板

                    2.1函数模板的基本语法

                    • 函数模板的作用:

                      ​ 建立一个通用函数,其函数返回值类型和形参类型可以不具体制定,用一个虚拟类型来代表

                      C++
                      	void func(int a);
                      	 |         |
                       返回值类型   形参类型
                           T         T   使用虚拟类型T来代表
                      

                      语法:template + 后紧跟 + 函数声明或定义

                      紧跟的这一部分(函数声明或定义)就叫做函数模板

                      • template ---> 声明创建模板
                      • typename ---> 表示其后面的符号是一种数据类型,也可以使用class代替
                      • T ---> 通用的数据类型,名称可替换

                        模板存在的意义:数据类型的参数化


                        • 当我们打算实现两数交换,但我们并不明确两数的数据类型,我们可以写出无数种方式
                          C++
                              内置数据类型
                              void SwapInt(int& x, int& y)
                          	{
                                  int temp = x;
                                  x = y;
                          		y = temp;
                          	}
                          	void SwapDouble(double& x, double& y)
                          	{
                          		double temp = x;
                          		x = y;
                          		y = temp;
                          	}
                          	
                          	自定义数据类型
                          	void SwapPerson(Person& x, Person& y);...
                          
                          • 但是,我们发现,除返回值类型与参数的数据类型不同外,其余代码逻辑都是相同的
                          • 于是函数模板就实现了
                            2.1.1函数模板的调用方式
                            C++
                                //声明一个模板,告诉编译器T是一个通用的数据类型,及告诉编译器模板T后紧跟着的那段代码不要报错!
                                template
                                void My_Swap(T& x, T& y)
                            	{
                                	T temp = x;
                                	x = y;
                                    y = x;
                            	}
                            --->模板的使用方式:
                            	int main()
                                {
                                    //1.自动类型推导
                                    My_Swap(参数1, 参数2);
                                    
                                    //2.显示指定类型(推荐 - 隐式类型转换) - 明确告诉编译器你想要的数据类型
                                    My_Swap(参数1, 参数2);--->(a, b);
                                }
                            

                            2.2函数模板的注意事项

                            注意事项:

                            • 自动类型推导,必须推导出一致的数据类型T
                            • 模板必须要确定T的数据类型

                              1.自动类型推导,必须推导出一致的数据类型T

                              C++
                                  template
                                  void My_Swap(T& x, T& y)
                              	{
                              		...	
                              	}
                              int main()
                              {
                                  int a = 1, b = 2;
                                  char c = 'a';
                                  My_Swap(a, b);--->true
                                  My_Swap(a, c);--->false
                                  return 0;
                              }
                              

                              C++ 面向对象(类和对象)—— 函数模板


                              2.模板必须要确定T的数据类型

                              C++
                                  template
                              	void func()--->函数体 func() 是函数模板,但没有指定模板参数  T 的具体类型
                              	{
                              		cout
                              		func();---也没有在调用 func 时提供类型参数
                                          
                              //如果想调用func(),那么可以给模板显示指定一个数据类型
                                      func这样,就可以调用到func()
                              		return 0;
                              	}
                              

                              C++ 面向对象(类和对象)—— 函数模板


                              2.4函数模板案例

                              案例描述:

                              • 利用函数模板封装一个排序的函数,可以对不同的数据类型进行排序

                              • 排序规则从大到小,排序算法为选择排序

                              • 分别用char数组和int数组进行排序

                                1.逐一解决模板,首先我们需要先建立一个排序模板

                                #include
                                using namespace std;
                                template
                                void My_Sort(T arr[], int len)
                                {
                                	for (int i = 0; i  
                                

                                2.在我们搭建排序模板的过程中,我们发现我们还需要一个支持两数交换的模板

                                C++
                                	template
                                	void My_Swap(T& x, T& y)
                                	{
                                		T temp = x;
                                		x = y;
                                		y = temp;
                                	}
                                

                                3.当我们所有的算法步骤解决后,我们就可以再次利用模板的方式来输出结果了

                                C++
                                	//输出模板
                                	template
                                	void My_Print(T arr[], int len)
                                	{
                                		for (int i = 0; i 
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。

相关阅读

目录[+]

取消
微信二维码
微信二维码
支付宝二维码