首页 > 编程语言 >C++_25_函数模板和类模板 - 重写版

C++_25_函数模板和类模板 - 重写版

时间:2023-11-05 23:23:16浏览次数:60  
标签:25 函数 数据类型 C++ 参数 类型 模板 定义

模板:

  在C++中允许函数重载,但函数重载每次都必须完全对上参数的顺序,类型和数量。
  所以C++提供了另一种代码重用机制——“模板”,可以作为同一种类型函数的统一调用接口。

    模板机制下可划分:1、函数模板
                     2、类模板

  模板的语法 

template <typename T>                 //单个数据类型
template <typename T,typename P> //多个数据类型

 

    template    关键字,表示后面跟的是模板的声明
    typename     关键字表示后面接的是模板中声明的数据类型,可以用class替代
    T        自定义变量数据类型,表示未知的数据类型
    模板实质上是对函数中数据类型的替换
  注意事项
    (1)模板函数中的参数类型、顺序和个数都需要与调用时的函数保持一致。
    (2)如果需要强制指定传入的参数类型,可以使用 函数名<类型名>(参数)。
    (3)对于模板函数而言,如果没有指明参数类型,是无法运行的。如果运行,需要加上<类型名>

        int x = 10; 
        int y = 20;
                  //调用函数myswap函数实参a,b 必须与模板函数中的形参a,b保持一致
        myswap<int>(x, y);   //1 函数模板 显示类型 调用   
        myswap(x, y);        //2 自动类型 推导  x,y类型已经致命,系统默认自行补全,效果一样

 

 

函数模板:

  函数模板:就是建立一个通用函数,函数类型和形参类型用虚拟的类型来代表的函数。
  凡是函数体相同的函数都可以用这个模板来代替,不必定义多个函数,只需在模板中定义一次即可。
  在调用函数时系统会根据实参的类型来取代模板中的虚拟类型,从而实现了不同函数的功能。

  函数模板与普通函数的区别
      1、普通函数是存在隐式类型转换。(传参强制转换,不需要特殊声明相纸转换,默认隐藏)
      2、函数模板不存在隐式类型转换,必须使用 <类型名> 的方式确定数据类型。(必须显示声明)

  函数模板与普通函数的调用机制
    (1)当函数模板和普通函数同时完全满足调用需求,优先使用普通函数运行程序。
    (2)如果普通函数在满足调用时需要进行隐式类型转换,而函数模板不用,则优先调用函数模板
    (3)如果调用不符合函数模板的要求,则按照普通函数隐式转换来运行。
    (4)当普通函数完全符合调用标准的情况下,仍然使用函数模板,则加上 <>(2和4相互印证)

  函数模板的局限性
       当函数模板中的数据类型是结构体或者类时,需要去重载运算符或重载函数。



 

类模板

template <class T1,class T2>
class 类名{
   T1   成员属性1
   T2   成员属性2
};

  定义对象 

 类名   <类型1,类型2>对象名(参数)

  定义模板类时,可以为模板类提供默认参数类型,
    当存在默认参数类型时,定义的对象可以直接使用<>来定义 
  

  类模板中函数定义的时机
    类模板中的函数是在程序运行时才确定的,在编译过程中没有固定下来。

  类模板在函数中的传参
    传参方式一共有3种
      (1)在参数中明确模板的数据类型
      (2)把函数也设置为模板函数
      (3)把传入的参数设置为模板类

   类模板的继承
    基类为类模板的时候,派生出的子类必须对基类的数据类型有明确的规定,
      否则派生类也必须写成类模板
  

  类模板成员函数的类外定义和多文件编译
  

  语法格式

返回值  类名 <类型> :: 函数名(参数)

    模板的多文件编译,它的函数定义和函数声明应该放在同一个文件里面,
      并且放在一起的时候,文件后缀名是.hpp。(hpp = .h + .cpp) 

  类模板的友元
    (1)在类内定义友元函数。
    (2)在类外定义友元函数,必须额外再template一个模板,把全局函数当成模板函数。

   

 

标签:25,函数,数据类型,C++,参数,类型,模板,定义
From: https://www.cnblogs.com/zlxxc/p/17811538.html

相关文章

  • C++_28_空指针、野指针、智能指针 - 重写版
     野指针:没有明确执向的指针,可能会胡乱指向任意一个变量;编程的时候绝不允许出现野指针;int*p;//错误,未初始化指向一块地址,会变成野指针如果确实需要先不指定到需要使用的内存,那就先定义一个空指针;-------》宁愿指向为空也不要为野;因为野指针你把握不住; 空指针:让指针指向N......
  • C++_02_命名空间和作用域运算符 - 重写版
    命名空间在C++中命名空间(namespace)的作用:命名空间,就是为了解决同一个源代码中相同命名的变量或者函数之间相互冲突的问题,就是要避免这种冲突,让程序代码中可以多次使用同一个标识符而存在的。对于一名开发者而言,代码量过于庞大,或多或少会忘记之间之前用过的变量名或函......
  • C++_01_初步认识C++语言 - 重写版
    一、认识“C++语言”一、首先聊聊什么是语言?语言是一套具有“语法”、“词法”规律的系统,是思维的工具。计算程序设计语言是计算机可以识别的语言,用于描述解决问题的方法,供计算机阅读和执行。语言由低级到高级依次分为4类:1、机器语言     (由......
  • 2023-2024-1 20231425《计算机基础与程序设计》第六周学习总结
    2023-2024-120231425《计算机基础与程序设计》第六周学习总结作业信息所属课程2023-2024-1-计算机基础与程序设计作业要求在哪里2023-2024-1计算机基础与程序设计第六周作业作业目标学习教材《计算机科学概论》第7章《C语言程序设计》第5章并完成云......
  • C++_28_重载、重写、重定义
    1、重载同一作用域的同名函数,重复定义;参数格式、参数顺序或者参数类型不同;函数重载和函数的返回值没有任何关系 2、重写  3、重定义......
  • C++U2-第11课-单元复习(二)
    上节课作业部分(点击跳转) 单元复习(二)[【字符串】作者名]【思路分析】1、定义字符串s2、使用cin>>s,输入字符串3、输出字符串的第一个字符s[0],因为第一个作者名前面没有-4、遍历字符串,遇到-的位置,输出此位置的下一个位置【参考代码】#include<iostream>#in......
  • java 模板
    1.添加依赖:<dependencies><!--支持模板--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-freemarker</artifactId></dependency></dependencies>注:......
  • 大二快乐日记10.25
    匹配优先级Servlet虚拟路径的匹配优先级顺序为:全路径匹配(精确匹配)>目录匹配>扩展名匹配>缺省匹配(默认匹配)。Servlet容器会从优先级高的虚拟路径开始匹配,匹配成功后就会立刻将请求交给相应的Servlet进行处理,不会再关注其他虚拟路径是否匹配成功。......
  • 【C++】关于全局变量和局部变量问题
    1#include<iostream>2usingnamespacestd;34voidfunc(void);56staticintcount=10;78intmain(){9while(count--){10func();11}1213return0;14}1516voidfunc(void){17staticinti=5;......
  • ACM竞赛常用算法模板(C++)
    1.快速排序AcWing785.快速排序:https://www.acwing.com/problem/content/787/题目描述给定你一个长度为n的整数数列。请你使用快速排序对这个数列按照从小到大进行排序。并将排好序的数列按顺序输出。输入格式输入共两行,第一行包含整数n。第二行包含n个整数(所有整数均在1∼10......