C++——模板初阶

一、模板的核心概念(大白话解释)

C++ 模板的本质是代码复用的工具,可以理解为 “代码的模具”—— 你定义一个通用的代码框架,编译器会根据你传入的不同类型(如 int、double、自定义类),自动生成对应类型的具体代码,避免重复写功能相同但类型不同的代码。
模板主要分两类:
  1. 函数模板:解决 “同一功能的函数,适配不同数据类型” 的问题(比如写一个通用的交换函数,既能交换 int,也能交换 double)。
  2. 类模板:解决 “同一类结构,适配不同数据类型” 的问题(比如写一个通用的数组类,既能存 int 数组,也能存 string 数组)。

二、函数模板(最常用,入门优先掌握)

1. 基本语法

cpp
 
运行
 
 
 
 
// 模板声明:template + 模板参数列表(typename/class 表示类型参数)
template <typename T>  // T是类型占位符,可自定义名称(如Type),typename和class等价
T mySwap(T& a, T& b) { // 通用交换函数,返回值和参数类型都是T
    T temp = a;
    a = b;
    b = temp;
    return a; // 示例返回值,可根据需求调整
}

// 测试代码
#include <iostream>
using namespace std;

int main() {
    // 编译器自动推导类型:T=int
    int a = 10, b = 20;
    mySwap(a, b); 
    cout << "int交换后:a=" << a << ", b=" << b << endl;

    // 显式指定类型:T=double
    double c = 3.14, d = 6.28;
    mySwap<double>(c, d); 
    cout << "double交换后:c=" << c << ", d=" << d << endl;

    return 0;
}
 

2. 输出结果

plaintext
 
 
 
 
 
int交换后:a=20, b=10
double交换后:c=6.28, d=3.14
 

3. 关键说明

  • template <typename T> 是模板的 “声明头”,必须写在函数 / 类定义前;
  • T 是类型参数,编译器会在调用时根据传入的实参类型,生成对应版本的函数(比如mySwap(int&, int&)mySwap(double&, double&));
  • 调用时可自动推导类型(推荐),也可显式指定(如mySwap<double>(c, d))。

三、类模板(入门核心)

1. 基本语法

cpp
 
运行
 
 
 
 
// 类模板:通用的数组封装类
template <typename T>
class MyArray {
private:
    T* arr;    // 数组指针,类型为T
    int size;  // 数组大小
public:
    // 构造函数
    MyArray(int s) : size(s) {
        arr = new T[size]; // 动态分配对应类型的数组
    }

    // 赋值函数
    void setValue(int index, T value) {
        if (index >= 0 && index < size) {
            arr[index] = value;
        }
    }

    // 获取值函数
    T getValue(int index) {
        if (index >= 0 && index < size) {
            return arr[index];
        }
        return T(); // 返回T类型的默认值
    }

    // 析构函数
    ~MyArray() {
        delete[] arr;
    }
};

// 测试代码
int main() {
    // 显式指定类型:T=int,创建int类型的数组
    MyArray<int> intArr(3);
    intArr.setValue(0, 10);
    intArr.setValue(1, 20);
    cout << "int数组第1个值:" << intArr.getValue(0) << endl;

    // 显式指定类型:T=string,创建string类型的数组
    MyArray<string> strArr(2);
    strArr.setValue(0, "C++模板");
    cout << "string数组第1个值:" << strArr.getValue(0) << endl;

    return 0;
}
 

2. 输出结果

plaintext
 
 
 
 
 
int数组第1个值:10
string数组第1个值:C++模板
 

3. 关键说明

  • 类模板必须显式指定类型(如MyArray<int>),编译器无法自动推导;
  • 类内的成员变量、成员函数都可使用模板参数T,实现类型通用化;
  • 动态分配内存时,new T[size]会根据T的类型,分配对应大小的内存(比如 int 占 4 字节,string 占更多)。

四、模板的核心优势(初阶必懂)

  1. 代码复用:一套模板适配所有类型,不用写swapIntswapDoubleIntArrayStringArray等重复代码;
  2. 类型安全:编译器生成代码时会做类型检查,避免手动转换类型导致的错误;
  3. 高效:模板是编译期处理的,生成的是具体类型的代码,运行效率和手写的专用代码一样,无额外开销。

总结

  1. C++ 模板是编译期代码生成工具,核心是用类型参数T替代具体类型,实现代码复用;
  2. 函数模板可自动推导类型,类模板必须显式指定类型;
  3. 初阶重点掌握函数模板的定义 / 调用,以及类模板的基本封装和使用,这是后续学习模板进阶(如模板特化、非类型参数)的基础。
posted @ 2025-12-24 10:23  福寿螺888  阅读(2)  评论(0)    收藏  举报