一、模板基础
1. 函数模板
模板本质上是一种泛型机制,就像模具一样,只需倒入不同的材料(类型),就能获得不同材料的铸件。比如要实现一个交换函数很容易,但普通的交换函数只能处理整型。如果想支持浮点数或字符型,通过函数重载虽然可行,但代码重复度高,维护成本大。
这就是函数模板的价值所在——它是实现泛型编程的基础。泛型编程指编写与类型无关的通用代码,极大提升复用率。
template<typename T>
void Swap(T& a, T& b) {
T temp = a;
a = b;
b = temp;
}
template<typename T> 定义了一个模板,这里的 typename 也可以替换为 class,两者在大多数情况下等价,细微区别后续会涉及。函数模板代表了一个函数家族,使用时根据实参类型被参数化,生成特定版本。
2. 函数模板原理与实例化
函数模板本身不是函数,而是编译器生成具体函数的蓝图。在编译阶段,编译器会根据传入的实参类型推演并生成对应类型的函数。
实例化分为两种:
- 隐式实例化:让编译器根据实参自动推演类型。
- 显示实例化:在函数名后的
< >中显式指定类型。
3. 匹配原则
- 非模板函数和同名函数模板可以共存。若调用时条件相同,优先调用非模板函数。
- 如果模板能产生更好匹配的函数,则选择模板。
- 模板函数不允许自动类型转换,普通函数可以。
4. 类模板
类模板的定义格式如下:
template<class T1, class T2, ..., class Tn>
class ClassName {
// 成员定义
};
类模板实例化需要在类名后跟 < >,例如 Stack<int> st1;。类模板名字本身不是真正的类,实例化后的结果才是。
二、STL 简介
STL(Standard Template Library)是 C++ 标准库的核心,不仅包含可复用的组件库,更是一个包罗数据结构与算法的软件框架。主要学习五大模块,其中空间配置器通常直接使用即可。
三、String 详解
学习 string 需从两方面入手:理解接口用法,以及尝试模拟实现。string 本质上是 basic_string<char> 的 typedef,用于存储字符。
1. 构造函数
常用的构造方式包括无参构造、拷贝构造、C 字符串构造等。
// 无参构造
string s1;
// 拷贝构造
;
;
;
;


