C++模板深入理解:函数模板与类模板

需积分: 9 0 下载量 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`)、算法和迭代器。