码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • C++初阶--类型模板


    文章目录

    • 泛型编程
    • 函数模板
      • 使用
      • 通用加法函数
      • 多模板参数
      • 必须用实例化
    • 函数模板的原理
    • 类模板
      • 使用
    • 注意事项

    泛型编程

    先看一个例子:
    在这里插入图片描述
    这是一些对于Swap重载的函数,区别是类型不同;
    虽然能够重载使用,但代码复用率比较低,如果我们让别人直接调用我们的函数,只使用整形类型的Swap(),那么其他函数就有点浪费了;
    而且代码的维护性比较低,一个出错可能会导致重载都出错。

    所以在C++中,就有了模板的概念。
    类似于你给一个普通模板,填入不同的数据,然后进行套用;
    在编程中我们称之为泛型编程。

    泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础。

    模板可以分类为:
    在这里插入图片描述

    函数模板

    函数模板是实现泛型编程的一种方式。通过函数模板,可以编写一种通用的函数,可以适用于多种类型的数据,可以在不同的上下文中进行重复使用。

    语法格式:
    template < typrname T >
    返回值类型 函数名(参数列表)
    {
    函数内容
    }

    在上述格式中,template < typrname T > 表示定义了一个模板,T是一个占位符类型,它可以代表任何类型。

    使用

    #include
    using namespace std;
    
    template<typename T>
    void Swap(T& left, T& right)
    {
    	T temp = left;
    	left = right;
    	right = temp;
    }
    
    //模板的演示
    int main()
    {
    	int a = 1, b = 2;
    	double c = 1.2, d = 3.4;
    
    	Swap(a, b);
    	Swap(c, d);
    
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    在这里插入图片描述

    注意:在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    通用加法函数

    template<class T>
    T Add(T a, T b)
    {
    	return a + b;
    }
    
    int main()
    {
    	int a = 1, b = 2;
    	cout<<Add(a, b)<<endl;
    	double c = 1.2, d = 2.4;
    	cout << Add(c, d) << endl;
    
    //显示实例化
    	cout<<Add<int>(1, 2)<<endl;
    	cout<<Add<double>(2, 3.44)<<endl;
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    在这里插入图片描述

    实例化:
    在这里插入图片描述

    注意:
    在这里插入图片描述
    我们可以使用多模板参数。

    多模板参数

    template<class X,class Y>
    void func(const X& x, const Y& y)
    {
    	cout << x <<" " << y << endl;
    }
    
    
    //多模板参数
    int main()
    {
    	func(1, 2.2);
    	func(1, 1);
    	func(2.2, 2.2);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    在这里插入图片描述

    必须用实例化

    template<class T>
    T* f(int n)
    {
    	T* p = new T[n];
    	return p;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述

    函数模板的原理

    当你使用函数模板进行函数调用时,编译器会根据传入的参数类型来确定需要实例化的模板参数类型。编译器会查找匹配的模板定义,并将实际的参数类型替换为函数参数类型,生成对应的函数代码。

    类模板

    template<class T1, class T2, ..., class Tn>
    class 类模板名
    {
     // 类内成员定义
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5

    使用

    template<class T>
    class Stack
    {
    private:
    	T* _a;
    	int _top;
    	int _capacity;
    public:
    	Stack(int capacity = 4)
    		:_a(new T[capacity]),
    		_top(0),
    		_capacity(capacity)
    	{
    		cout << "Stack(int capacity = 4)" <<endl;
    	}
    
    	~Stack()
    	{
    		cout << "~Stack()" << endl;
    
    		delete[] _a;
    		_a = nullptr;
    		_top = 0;
    		_capacity = 0;
    	}
    };
    
    int main()
    {
    	Stack<int> s1;
    	Stack<double> s2;
    
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    在这里插入图片描述

    注意事项

    在这里插入图片描述
    在这里插入图片描述

  • 相关阅读:
    bilibili和抖音之内容类型
    移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——13.map&&set
    详解K8s 镜像缓存管理kube-fledged
    oracle:记一次磁盘头故障处理
    mysql 查询
    【MATLAB教程案例50】通过VisualSFM工具箱提取360度等间隔环绕拍摄得到的图像序列点云数据,并进行目标三维重建matlab仿真
    小白学习,在kali里面用volatility3,一步一步细致操作,解决问题。建议电子取证选手好好看看。
    共享模型之无锁 - 08
    Using ‘C:\Users\administ\AppData\Local\ASP.NET\DataProtection-Keys‘ as ke
    Redis数据结构的奇妙世界:一窥底层存储机制【redis第一部分】
  • 原文地址:https://blog.csdn.net/m0_74068921/article/details/134540587
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号