C++ 模板初阶总结

1. 泛型编程

  • 目标:编写与类型无关的通用代码,提高代码复用性。

  • 问题:传统函数重载需为每种类型编写重复代码,维护成本高。

  • 解决方案:使用模板(Template),通过编译器自动生成特定类型的代码。


2. 函数模板

定义:

复制代码
template<typename T>
void Swap(T& left, T& right) {
    T temp = left;
    left = right;
    right = temp;
}
  • typename 或 class 声明模板类型参数。

原理:

  • 编译器根据实参类型生成具体函数(如 Swap<int>、Swap<double>)。
  • 模板是代码生成的 "模具",避免手动编写重复代码。

实例化:

  • 隐式实例化 :编译器自动推导类型。
    *

    复制代码
      Swap(1, 2);  // T 推导为 int
    • 显式实例化 :手动指定类型。

      复制代码
      Swap<double>(3.14, 2.71);  // 显式指定 T 为 double
      Swap(3, (doouble)2.71);  //强转 double
    • 匹配原则

      • 非模板函数与模板函数可共存,优先调用非模板函数。
      • 模板函数不支持自动类型转换,普通函数支持。

3. 类模板
  • 定义

    复制代码
    template<typename T>
    class Stack {
    public:
        Stack(size_t capacity = 4);
        void Push(const T& data);
    private:
        T* _array;
        size_t _capacity, _size;
    };
  • 实例化

    复制代码
    Stack<int> st1;   // 实例化为 int 类型的栈
    Stack<double> st2; // 实例化为 double 类型的栈
  • 注意事项

    • 类模板的声明和定义需放在同一文件中,否则可能导致链接错误。

    • 成员函数在类外定义时需保留模板参数:

      复制代码
      template<typename T>
      void Stack<T>::Push(const T& data) {
          _array[_size++] = data;
      }

4. 关键特性
  • 类型安全:模板在编译期检查类型,避免运行时错误。
  • 灵活性:支持动态指定类型,适应多种场景。
  • 代码复用:一套模板代码适配所有类型,减少冗余。

5. 常见问题
  • 类型推导冲突 :当实参类型不一致时,需显式实例化或强制类型转换。

    复制代码
    Add(1, 2.0);  // 错误,类型不匹配
    Add<double>(1, 2.0);  // 正确,显式指定类型
  • 分离编译问题 :类模板的声明和定义不能分离到 .h.cpp 文件,否则链接失败。


6. 应用场景
  • 容器类(如栈、队列)。
  • 通用算法(如排序、查找)。
  • 元编程 (编译期计算,如 Factorial 模板)。

通过模板,C++ 实现了泛型编程,显著提升了代码的可维护性和复用性。

相关推荐
Cosmoshhhyyy39 分钟前
《Effective Java》解读第49条:检查参数的有效性
java·开发语言
棋子入局40 分钟前
C语言制作消消乐游戏(2)
c语言·开发语言·游戏
布谷歌1 小时前
常见的OOM错误 ( OutOfMemoryError全类型详解)
java·开发语言
WangJunXiang61 小时前
GFS分布式文件系统
开发语言·php
民乐团扒谱机1 小时前
【微实验】基于matlab的音频提取与信号滤波处理
开发语言·matlab·音视频
6Hzlia1 小时前
【Hot 100 刷题计划】 LeetCode 739. 每日温度 | C++ 逆序单调栈
c++·算法·leetcode
SomeB1oody1 小时前
【Python深度学习】3.4. 循环神经网络(RNN)实战:预测股价
开发语言·人工智能·python·rnn·深度学习·机器学习
良木生香1 小时前
【C++初阶】:STL——String从入门到应用完全指南(1)
c语言·开发语言·数据结构·c++·算法
Bug 挖掘机1 小时前
一篇理清Prompt,Skill,MCP之间的区别
开发语言·软件测试·python·功能测试·测试开发·prompt·ai测试
寒秋花开曾相惜2 小时前
(学习笔记)4.1 Y86-64指令集体系结构(4.1.4 Y86-64异常&4.1.5 Y86-64程序)
开发语言·jvm·数据结构·笔记·学习