C/C++:06. 模板

2023-11-17


前言

C++的模板是被迫推出的,最直接的动力来源于对数据结构的封装。数据结构关乎的是数据的存储,以及存储后如何进行增加、删除、修改和查询操作,在实际开发中有着非常广泛的应用。C++开发者们希望为线性表、链表、图、树等常见的数据结构都定义一个类,并把它们加入到标准库中,这样以后程序员就不用重复造轮子了,直接拿来就可以使用。


一、函数模板

所谓函数模板,实际上是建立一个通用函数,它所用到的数据的类型(包括返回值类型、形参类型、局部变量类型)可以不具体指定,而是用一个虚拟的类型来代替(实际上是用一个标识符来占位),等发生函数调用时再根据传入的实参来逆推出真正的类型。这个通用函数就称为函数模板(Function Template)。
一但定义了函数模板,就可以将类型参数用于函数定义和函数声明了。说得直白一点,原来使用 int、float、char 等内置类型的地方,都可以用类型参数来代替。

#include <iostream>
using namespace std;
template<typename T> void Swap(T *a, T *b){
    T temp = *a;
    *a = *b;
    *b = temp;
}
int main(){
    //交换 int 变量的值
    int n1 = 100, n2 = 200;
    Swap(&n1, &n2);
    cout<<n1<<", "<<n2<<endl;
   
    //交换 float 变量的值
    float f1 = 12.5, f2 = 56.93;
    Swap(&f1, &f2);
    cout<<f1<<", "<<f2<<endl;
    return 0;
}

二、类模板

C++除了支持函数模板,还支持类模板(class Template),目的同样是为了将数据的类型格式化。声明类模板的语法如下:

// 这里的参数类型不能为空
template<typename T1, typename T2,...>
class 类名{
// TODO;
};

一旦使用了类模板, 原来使用int,float,char等内置类型的地方,都可以用类型参数来替代。

  • 类的定义:
template<typename T1, typename T2>  //这里不能有分号
class Point{
public:
    Point(T1 x, T2 y): m_x(x), m_y(y){ }
public:
    T1 getX() const;  //获取x坐标
    void setX(T1 x);  //设置x坐标
    T2 getY() const;  //获取y坐标
    void setY(T2 y);  //设置y坐标
private:
    T1 m_x;  //x坐标
    T2 m_y;  //y坐标
};
  • 成员函数的定义
template<typename T1, typename T2>  //模板头 必须要带着
T1 Point<T1, T2>::getX() const /*函数头 必须包含参数类型*/ {
    return m_x;
}

template<typename T1, typename T2>
void Point<T1, T2>::setX(T1 x){
    m_x = x;
}

template<typename T1, typename T2>
T2 Point<T1, T2>::getY() const{
    return m_y;
}

template<typename T1, typename T2>
void Point<T1, T2>::setY(T2 y){
    m_y = y;
}
  • 使用类模板创建对象
Point<int, int> p1(10, 20);
Point<int, float> p2(10, 15.5);
Point<float, char*> p3(12.4, "东经180度");
Point<float, float> *p1 = new Point<float, float>(10.6, 109.3);
Point<char*, char*> *p = new Point<char*, char*>("东经180度", "北纬210度");

三、函数模板重载

问题:数组可以模板化吗?
如果传递进去的是一个数组指针,可以用模板类型的方式遍历数组中的每一个元素吗?答案是不行的,因为遍历数组中的每一个值需要知道数组的长度。
如下来交换两个数组:

#include <iostream>
using namespace std;
template<class T> void Swap(T &a, T &b);  //模板①:交换基本类型的值
template<typename T> void Swap(T a[], T b[], int len);  //模板②:交换两个数组
void printArray(int arr[], int len);  //打印数组元素
int main(){
    //交换基本类型的值
    int m = 10, n = 99;
    Swap(m, n);  //匹配模板①
    cout<<m<<", "<<n<<endl;
    //交换两个数组
    int a[5] = { 1, 2, 3, 4, 5 };
    int b[5] = { 10, 20, 30, 40, 50 };
    int len = sizeof(a) / sizeof(int);  //数组长度
    Swap(a, b, len);  //匹配模板②
    printArray(a, len);
    printArray(b, len);
    return 0;
}
template<class T> void Swap(T &a, T &b){
    T temp = a;
    a = b;
    b = temp;
}
template<typename T> void Swap(T a[], T b[], int len){
    T temp;
    for(int i=0; i<len; i++){
        temp = a[i];
        a[i] = b[i];
        b[i] = temp;
    }
}
void printArray(int arr[], int len){
    for(int i=0; i<len; i++){
        if(i == len-1){
            cout<<arr[i]<<endl;
        }else{
            cout<<arr[i]<<", ";
        }
    }
}


总结

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C/C++:06. 模板 的相关文章

随机推荐

  • VS编译程序缺失msvcp140d.dll、vcruntime140d.dll和ucrtbased.dll解决方法

    今天编译的一个程序到客户现场电脑上运行闪退 查看发现缺少msvcp140d dll vcruntime140d dll以及ucrtbased dll 总结一下解决办法 供大家参考 方式一 找到对应的 msvcp140d dll vcrunt
  • Java的SSH连接远程服务器

    在我们的示例中 我们将首先打开SSH连接 然后执行一个命令 读取输出并将其写入控制台 最后关闭SSH连接 我们将使示例代码尽可能简单 2 JSch JSch 是SSH2的Java实现 它使我们可以连接到SSH服务器并使用端口转发 X11转发
  • 记几个数据查询语句

    查看某用户所在的表空间SELECT USERNAME DEFAULT TABLESPACE FROM DBA USERS WHERE USERNAME GISAP 查看用户表分区select from user tab partitions
  • java中 instanceof 关键字 作用 和 实际用途

    instanceof 闲聊一下 所谓看书只看前三章 基础java决定上限 所以说基础很重要 Java也是基础扎实决定你的上限 1 instanceof 是Java中的一个关键字 Java中的关键子都是小写 2 instanceof关键字的作
  • 【不忘初心】Windows11 22000.652 X64 四合一[纯净精简版][2.68G](2022.5.3)

    此版可正常更新补丁关闭按流量计费 WIN11全新的UI界面出炉 可以说这一次Windows 11全新升级 无论是从Logo上还是UI界面设计 都有很大的变化 母版来自UUP WIN11 22000 652 为了保证稳定初心的系统全部都是离线
  • 【模拟集成电路】电荷泵(CP)设计

    电荷泵 CP 设计 前言 一 电荷泵 CP 原理 1 电流失配问题 2 开关管的时钟馈通问题 3 电荷注入问题 二 电荷泵 CP 电路 三 电荷泵性能测试 测试原理图 充电测试 放电测试 参考文献 各部分链接链接 前言 本文主要内容是对电荷
  • NLP 算法工程师面试问答-DeepLearningAlgorithm

    关于生成对抗网络GAN 那些你不知道的事 一 动机 之前我们提到玻尔兹曼机 Boltzmann machine 波尔茨曼机作为一种基于能量函数的概率模型 因为能量函数比较复杂 所以存在较多的限制 虽然受限玻尔兹曼机 Restricted B
  • C#通过读取appconfig文件连接数据库

    以Oracle为例 C 连接数据库的时候 需要一些连接字符串 一开始写在程序中 这样会有两个问题 通用性不太好 如果程序具有普遍性 但是连接字符串写死了 每次替换很麻烦 一个工程有很多个项目 每个项目都需要连接字符串 每次更改或者设置也很麻
  • 手机一键制作u盘启动盘_老毛桃U盘启动盘制作教程

    制作前准备 1 准备一个U盘 建议U盘内存8G以上 因为制作时会格式化 请注意备份U盘原资料 2 下载老毛桃U盘装机工具套装 官网 www laomaotao net 老毛桃U盘装机工具下载链接 www laomaotao net 制作过程
  • django 报错:urllib3.exceptions.ConnectTimeoutError 问题解决方法

    问题描述 django项目运行时报错 urllib3 exceptions ConnectTimeoutError
  • opkg 更新软件

    opkg 不同的版本存在不同的配置文件 一般常用的是 etc opkg conf etc opkg customfeeds conf 和 etc opkg distfeeds conf三个 这三个配置文件将会影响opkg运行时软件资源的取向
  • iOS 对象信息保存、转化JSON、JSON生成对象的模型方案记录

    目标 将对象的一些信息提取保存起来 然后转化成JSON 再上传到服务器 或其他保存本地的用途 从服务器接收或从本地读取 然后通过JSON的信息生成指定的对象 方案代码 KeepLabelInfoModel h TestViewXIB Cre
  • AHB VIP Example 的tb_ahb_svt_uvm_basic_ral_sys中关于slave和master接口连接的问题

    AHB 的tb ahb svt uvm basic ral sys中关于slave和master接口连接的问题 这里代码不完整太多没有截完 一 原始使用方法 hdl interconnect中文件的DUT的部分内容是 DUT外面还做了封装
  • element ui表单验证失效原因分析

    1 model 和 v model 需要区分开 model是element ui中的一个属性 而v model才是双向绑定 多表单验证时 model form 中的值不一样 2 prop
  • 浅谈H5的理解

    1 h5广义的概念 描述的是网页技术一次重要的更新迭代 更新的特征包括HTML语言的新特性 CSS的新特性 JavaScript 的新特新 浏览器新特新标准等等 html中新增了语义化标签 表单新增特性 更加简洁的文档声明 媒体标签 vid
  • 【Vue】实现无限滚动加载

    文章目录 法一 ElemntUI的InfiniteScroll 法二 直接操作window窗口的滚轮事件 先提前预告一下 如果需要的是单个确定高度的容器组里进行无限滚动刷新 则使用InfiniteScroll最方便 而如果无限滚动依赖的是整
  • 一目了然的node.js

    node js基础知识入门 1 模块化 导出命令 导入命令 2 文件系统 异步读文件 同步读文件 异步写文件 同步写文件 在fs模块中 提供同步方法是为了方便使用 那我们到底是应该用异步方法还是同步方法呢 3 HTTP模块 模块导入 参数含
  • 团体程序设计天梯赛 -- 练习集 (L1合集)

    文章目录 L1 001 Hello World 5 分 L1 002 打印沙漏 20 分 L1 003 个位数统计 15 分 L1 004 计算摄氏温度 5 分 L1 005 考试座位号 15 分 L1 006 连续因子 20 分 L1 0
  • 免费的 XShell 替代品,我推荐这5款软件,一个比一个香!

    点击上方 Java基基 选择 设为星标 做积极的人 而不是积极废人 每天 14 00 更新文章 每天掉亿点点头发 源码精品专栏 原创 Java 2021 超神之路 很肝 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析 网络应用框
  • C/C++:06. 模板

    文章目录 前言 一 函数模板 二 类模板 三 函数模板重载 总结 前言 C 的模板是被迫推出的 最直接的动力来源于对数据结构的封装 数据结构关乎的是数据的存储 以及存储后如何进行增加 删除 修改和查询操作 在实际开发中有着非常广泛的应用 C