0%
boxmoe_header_banner_img

加载中

模版初阶


avatar
mizuki 2026年6月7日 2026年6月7日 36

引言

C语言与C++其中有一个很大的不同点,就是C++中引出了模版这个概念,节省了许多重复代码的书写,这篇文章将为你初步介绍模版

1. 模版

  • 1.1. 模版意义

本质上是一种泛型编程,编写与类型无关的通用代码

  • 1.2. 类型

1. 函数模版

2. 类模版

2. 函数模版

  • 2.1 格式

这里先给一个加法的例子,然后再详细讲解

temoplate<class A>
A Add(A a, A b)
{
    return a + b;
}

首先来解析第一行,template相当于一个关键字,是模版的核心,后接的“<class A>”,这里的A则是一个模版类型会根据不同情况自动实例化为相对应的类型,“<>”中也可以写多种类型,如“<class A, class B, class C>”都是可以的,还需注意的是class可以换成typename

我们再看第二行,A就作为Add函数返回的类型,参数也是A类型,其他的按照正常函数的写法写就好了

  • 2.2 模版实例化

模版实例化分为隐式实例化和显式实例化

1. 隐式实例化

      指的是编译器根据情况自动推导类型,这里给出一个例子:

      temoplate<class A>
      A Add(A a, A b)
      {
          return a + b;
      }
      
      void test()
      {
          int a = 0;
          int b = 1;
          int c = Add(a, b);
      }

      这里Add函数将会自动推导A类型为int类型

      2. 显式实例化

      指的是我们强制规定了模版中的类型,具体使用方法如下

      temoplate<class A>
      A Add(A a, A b)
      {
          return a + b;
      }
      
      void test()
      {
          int a = 0;
          int b = 1;
          int c = Add<int>(a, b);
      }

      与隐式实例化不同的是,Add后加上了<int>,这样就规定了Add中A的类型为int,如果有多个类型就多写多个

      • 2.3 模版与重载函数同时存在

      当出现这种情况时,会优先走符合条件的函数,这里给出一个例子:

      temoplate<class A>
      A Add(A a, A b)
      {
          return a + b;
      }
      
      int Add(int a, int b)
      {
          return a + b;
      }
      
      void test()
      {
          int a = 0;
          int b = 1;
          int c = Add(a, b);
      }

      这里的Add函数将调用第二个,因为这里符合int类型,不需要编译器再进行推导,因此将会直接调用已存在的重载函数

      3. 类模版

      • 3.1 格式

      与函数模版相同,这里先给出一个例子,再进行解析

      tempalate<class A>
      class List
      {
         typedef List<A> List;
      private:
        A _key; 
        List* _next;
        List* _prev;
      }

      这里的第一行不作过多解释,与函数模版相同,接着在类的内部,就可以将A看作一个类型进行使用,其他也没什么特别的

      • 3.2 特点

      1.类模版都需要显式实例化,不能隐式实例化,就如例子中一般“List<A> List”,在正常使用中也需要这样,就像这样写:List<int> l

      2.类模版中的模版函数不可以将声明和定义分离在不同的.h和.cpp文件中,这样会造成链接错误,编译器会报错

      3.按需实例化

      指的是如果没有调用到类模版中的函数,只要函数没有大错误都不会报错,所以我们一定要在写完函数后去调用测试一下,以防埋下大隐患

      总结

      模版初阶的内容虽然没有多少,但是模版确实C++十分重要的部分,大家一定要熟练掌握

      C++
      上一次更新已经跑远了✨ 计算中...
      (‾◡◝) 本内容里的一些消息,可能已经跟不上时间啦~


      评论(0)

      查看评论列表

      暂无评论


      发表评论

      表情 颜文字

      插入代码
      小园得志

      北京时间 (Asia/Shanghai)

      后退
      前进
      刷新
      复制
      粘贴
      全选
      删除
      返回首页
      0%
      目录
      顶部
      底部
      📖 文章导读