C++模板深入理解:函数模板与类模板
需积分: 9 124 浏览量
更新于2024-07-14
收藏 1.29MB PPT 举报
"类模板实例-cpp的魔板数据"
C++中的模板是泛型编程的核心,它允许程序员编写能够处理多种数据类型的通用代码。模板分为两种主要类型:函数模板和类模板。在这个实例中,我们关注的是类模板,它是创建一类具有相同行为但操作不同数据类型对象的类的蓝图。
类模板的定义:
```cpp
template< typename T>
class Store {
private:
T item; //用于存放任意类型的数据
int haveValue; //用于标记item是否已被存入了内容
public:
Store(); //无参的构造函数
T GetElem(void ); //提取数据函数
void PutElem( T x); //存入数据函数
};
```
`Store` 类模板接受一个类型参数 `T`,表示它可以存储任何类型的数据。`T item` 是一个私有成员变量,用于存储用户插入的数据,`int haveValue` 用于标记 `item` 是否已存储了有效数据。
类模板的实例化:
```cpp
Store<int> S1, S2;
Store<Student> S3;
Store<double> D;
```
上述代码创建了四个不同类型的 `Store` 对象:`S1` 和 `S2` 存储整数,`S3` 存储 `Student` 结构体,`D` 存储双精度浮点数。通过实例化,模板参数 `T` 被具体的数据类型替换,生成了四个不同的类。
函数成员的实现:
```cpp
// 默认构造函数
template<typename T>
Store<T>::Store(void):haveValue(0){}
// 提取数据函数
template <typename T>
T Store<T>::GetElem(void)
{
if( haveValue == 0)
{
cout << "No item present!" <<endl;
exit(1);
}
return item;
}
// 存入数据函数
template <typename T>
void Store<T>::PutElem( T x )
{
haveValue++;
item = x;
}
```
这些函数成员都使用了模板参数 `T`,使得它们可以处理任何类型的 `T`。
模板参数推断:
在模板使用时,编译器能够自动推断模板参数的类型,例如在调用 `Store` 的 `PutElem` 和 `GetElem` 函数时,编译器根据传入的参数类型推断出 `T` 的具体类型。
模板的实例化和具现化:
当模板被实例化时(如 `Store<int>`),编译器会产生一个新的类,这个类与原始模板完全相同,只是 `T` 被实际的类型(如 `int`)所替换,这个过程称为模板具现。这意味着每个模板实例都是独一无二的,就像单独为每个类型编写了特定的类一样。
模板的这种特性使得C++的代码更具通用性,降低了代码重复,提高了效率。同时,模板的使用需要精确的语法和理解,因为它们涉及到类型系统和编译时的元编程。在实际编程中,模板与标准模板库(STL)相结合,可以创建出强大且高效的容器(如 `std::vector`)、算法和迭代器。
2024-04-10 上传
点击了解资源详情
点击了解资源详情
点击了解资源详情
点击了解资源详情
点击了解资源详情
点击了解资源详情