非常棒的主题!以下是《C++从入门到实战(十三)C++函数模板与类模板初阶讲解》的完整教学文案,适合用于视频讲解、图文课程、PPT编写或公众号推文。内容通俗清晰,注重实战和理解。
💡C++从入门到实战(十三):C++函数模板与类模板初阶讲解
C++ 模板是泛型编程的核心。学会它,你将能写出更灵活、可复用、类型无关的代码!这一章,我们一起从函数模板讲起,逐步掌握类模板,为掌握 STL 奠定基础!
🧠 一、什么是模板?
模板(Template)是 “泛型编程” 的核心技术,它允许函数或类处理任意类型的数据。
📌为什么要用模板?
- 编写通用代码,减少重复
- 提升程序可维护性
- 是
STL(标准模板库)
的基础 - 函数和类都可以模板化
🔧 二、函数模板入门
✅ 定义语法
template<typename T>
T Max(T a, T b) {
return a > b ? a : b;
}
✅ 使用方式
int main() {
std::cout << Max(3, 5) << std::endl; // 推导出 T=int
std::cout << Max(2.5, 7.1) << std::endl; // 推导出 T=double
}
📌注意事项:
- 模板会根据实参自动推导类型
- 可以手动指定类型:
Max<int>(3, 5);
- 两个参数类型必须相同(或能隐式转换)
💡 三、函数模板 vs 函数重载
int Max(int a, int b) {
return a > b ? a : b;
}
double Max(double a, double b) {
return a > b ? a : b;
}
⬆️写两个函数不如写一个模板函数⬇️
template<typename T>
T Max(T a, T b) {
return a > b ? a : b;
}
🧱 四、类模板入门
✅ 定义语法
template<typename T>
class Box {
private:
T value;
public:
Box(T v) : value(v) {}
T getValue() const { return value; }
};
✅ 使用方式
int main() {
Box<int> intBox(100);
Box<std::string> strBox("Hello");
std::cout << intBox.getValue() << std::endl;
std::cout << strBox.getValue() << std::endl;
}
🧰 五、类模板中的成员函数实现
✅ 类外实现写法
template<typename T>
class Box {
private:
T value;
public:
Box(T v);
T getValue() const;
};
template<typename T>
Box<T>::Box(T v) : value(v) {}
template<typename T>
T Box<T>::getValue() const {
return value;
}
📌注意:每个成员函数定义都要写上 template<typename T>
和 Box<T>::
🔍 六、模板参数支持多个类型
template<typename T1, typename T2>
class Pair {
public:
T1 first;
T2 second;
Pair(T1 a, T2 b) : first(a), second(b) {}
};
int main() {
Pair<int, std::string> p(1, "One");
std::cout << p.first << ", " << p.second << std::endl;
}
🔄 七、模板的自动推导 & 显式指定
函数模板中可以:
template<typename T>
T add(T a, T b) { return a + b; }
int main() {
std::cout << add(2, 3) << std::endl; // 自动推导为 int
std::cout << add<double>(2, 3.5) << std::endl; // 显式指定为 double
}
🧩 八、实战案例:通用排序函数模板
template<typename T>
void mySwap(T& a, T& b) {
T temp = a;
a = b;
b = temp;
}
template<typename T>
void mySort(T arr[], int size) {
for (int i = 0; i < size - 1; ++i)
for (int j = i + 1; j < size; ++j)
if (arr[i] > arr[j])
mySwap(arr[i], arr[j]);
}
int main() {
int arr[] = {5, 2, 8, 3};
mySort(arr, 4);
for (int i : arr)
std::cout << i << " ";
}
✅ 不同类型都可用:mySort<double>()
、mySort<std::string>()
🎯 九、模板常见问题汇总
问题 | 解答 |
---|---|
可以多个模板参数吗? | 可以,常见于 Pair、Map 等 |
类模板可嵌套使用吗? | 可以,例如 std::vector<std::pair<int, int>> |
模板能用于成员函数吗? | 可以,且可类内或类外实现 |
模板能指定默认类型吗? | 可以,template<typename T = int> |
✅ 十、本节小结
内容 | 要点 |
---|---|
函数模板 | 实现通用算法 |
类模板 | 封装泛型类,如 Box、Pair |
关键语法 | template<typename T> ,类外需加 Box<T>:: |
使用场景 | 写通用容器、算法、工具类 |
📚 下一节预告:
第十四讲:深入 STL 容器模板设计思想,探秘 vector / list / map 的模板内部结构
如你需要这套教程的 Markdown 源码、PDF、配套 PPT 或配图思维导图,也可以告诉我,我能帮你完整整理!是否要继续下一讲?
发表回复