C++ 模板机制与 string 类详解
一、模板基础
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. 类模板
类模板实例化需要在类名后跟 < >,例如 Stack<int> 才是真正的类型。
template <class T1, class T2> class MyClass {
// 成员定义
};
二、STL 简介
STL(Standard Template Library)是 C++ 标准库的核心,包含容器、算法和迭代器。学习 STL 主要关注空间配置器、分配器、迭代器、容器和算法五大板块。
三、string 类详解
std::string 本质上是 basic_string<char> 的 typedef。掌握它需要从接口使用和底层模拟两方面入手。
1. 构造函数
常用的构造方式包括默认构造、拷贝构造、C 字符串构造等。
// 无参构造
string s1;
// 拷贝构造
string s2(s1);
// C-string 构造
;
;
;


