当前位置: 首页 > news >正文

C++学习笔记之 模板|函数模板|类模板

函数模板

类模板

  • 定义:函数模板是建立一个通用函数,它所用到的数据的类型(包括返回值类型、形参类型、局部变量类型 )可以不具体指定,而是用一个虚拟的类型来代替(用标识符占位),在函数调用时,编译器根据传入实参自动推断数据类型 。
  • 语法格式
    template <typename T> // 也可用class代替typename ,T为类型参数,可多个,用逗号分隔
    返回值类型 函数名(T 参数) {
        // 函数体
    }

    例如,实现交换两个变量值的函数模板

    template <typename T> 
    void Swap(T& a, T& b) {
        T temp = a;
        a = b;
        b = temp;
    }

  • 使用方式:编译器根据调用时传入的实参类型,对函数模板进行实例化,生成具体类型的函数。比如int num1 = 1, num2 = 2; Swap(num1, num2);,编译器会生成void Swap(int&, int&) 这样针对int类型的函数实例 。也可显式指定类型,如Swap<double>(3.14, 2.71); 。
  • 作用:避免为不同数据类型重复编写功能相似的函数,提高代码复用性 ,减少代码冗余。
  • 定义:类模板将数据的类型参数化,用于创建通用类,使类的成员函数和成员变量能适应多种数据类型 。
  • 语法格式
    • 类声明
          template <typename T1, typename T2, ...> // 类型参数可多个,用逗号分隔
      class 类名 {
          // 类的成员变量和成员函数声明
      };

      类外定义成员函数

      template <typename T1, typename T2, ...> 
      返回值类型 类名<T1, T2, ...>::函数名(参数列表) {
          // 函数体
      }

      例如,定义一个表示坐标的类模板:

      template <typename T1, typename T2>
      class Point {
      public:
          Point(T1 x, T2 y) : x(x), y(y) {}
          void print() const;
      private:
          T1 x;
          T2 y;
      };
      
      template <typename T1, typename T2>
      void Point<T1, T2>::print() const {
          std::cout << "x: " << x << ", y: " << y << std::endl;
      }

    • 使用方式:使用类模板创建对象时,必须显式指明具体的数据类型,编译器据此实例化出具体类。如Point<int, int> p(1, 2); ,编译器会用int替换模板中的T1T2 ,生成针对int类型的Point类实例 。
    • 作用:能针对不同数据类型创建相似功能的类,避免为每种类型单独编写类,提高代码的可维护性和复用性 。

二者区别

  • 实例化方式:函数模板可由编译器根据实参自动实例化,也可显式指定类型;类模板必须显式指定类型参数来实例化 。
  • 功能侧重:函数模板主要针对可通用化的函数逻辑;类模板关注的是创建通用类,涵盖数据成员和成员函数 。
http://www.dtcms.com/a/111242.html

相关文章:

  • 嵌入式学习笔记——ARM-中断与异常
  • R5周:天气预测
  • linux 进程/线程设置核亲和性
  • MySQL统计信息
  • JS dom修改元素的style样式属性
  • 删除Linux服务器上多余的系统启动项,并重装Ubuntu系统
  • Java 连接 WebSocket 入门教程
  • 【Web 服务器】的工作原理
  • 第十八节课:Python编程基础复习
  • wx206基于ssm+vue+uniapp的优购电商小程序
  • NLP高频面试题(三十五)——LLaMA / ChatGLM / BLOOM的区别
  • AI + 慢病逆转 1
  • USB传输(Transaction)过程简介
  • swift-oc和swift block和代理
  • ElasticSearch JavaRestClient查询之高亮显示
  • JS用ES6和ES5分别实现:8字节长整数和字节数组的互转
  • 软考系统架构师 — 4 嵌入式软件
  • H.266/VVC SCC技术学习:块差分脉冲编码调整(block differential pulse coded modulation, BDPCM)
  • 生信入门:专栏概要与内容目录
  • AI算法大全初见面
  • Redisson使用详解
  • 《Maven高级应用:继承聚合设计与私服Nexus实战指南》
  • 嵌入式学习笔记——SPI协议
  • “一路有你”公益行携手《东方星动》走进湖南岳阳岑川镇中心小学
  • AI Agent设计模式二:Parallelization
  • 【新能源汽车整车动力学模型深度解析:面向MATLAB/Simulink仿真测试工程师的硬核指南】
  • PyTorch:解锁AI新时代的钥匙
  • Python基于时间序列分析的降雨量预测系统的设计与实现【附源码、文档说明】
  • 一周学会Pandas2 Python数据处理与分析-Jupyter Notebook安装
  • C++类的特殊成员函数:构造、拷贝构造与析构函数详解