C++——模板初阶
一、模板的核心概念(大白话解释)
C++ 模板的本质是代码复用的工具,可以理解为 “代码的模具”—— 你定义一个通用的代码框架,编译器会根据你传入的不同类型(如 int、double、自定义类),自动生成对应类型的具体代码,避免重复写功能相同但类型不同的代码。
模板主要分两类:
- 函数模板:解决 “同一功能的函数,适配不同数据类型” 的问题(比如写一个通用的交换函数,既能交换 int,也能交换 double)。
- 类模板:解决 “同一类结构,适配不同数据类型” 的问题(比如写一个通用的数组类,既能存 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 占更多)。
四、模板的核心优势(初阶必懂)
- 代码复用:一套模板适配所有类型,不用写
swapInt、swapDouble、IntArray、StringArray等重复代码; - 类型安全:编译器生成代码时会做类型检查,避免手动转换类型导致的错误;
- 高效:模板是编译期处理的,生成的是具体类型的代码,运行效率和手写的专用代码一样,无额外开销。
总结
- C++ 模板是编译期代码生成工具,核心是用类型参数
T替代具体类型,实现代码复用; - 函数模板可自动推导类型,类模板必须显式指定类型;
- 初阶重点掌握函数模板的定义 / 调用,以及类模板的基本封装和使用,这是后续学习模板进阶(如模板特化、非类型参数)的基础。

浙公网安备 33010602011771号