函数模板
类模板
- 定义:函数模板是建立一个通用函数,它所用到的数据的类型(包括返回值类型、形参类型、局部变量类型 )可以不具体指定,而是用一个虚拟的类型来代替(用标识符占位),在函数调用时,编译器根据传入实参自动推断数据类型 。
- 语法格式:
template <typename T> // 也可用class代替typename ,T为类型参数,可多个,用逗号分隔 返回值类型 函数名(T 参数) {// 函数体 }
例如,实现交换两个变量值的函数模板
template <typename T> void Swap(T& a, T& b) {T temp = a;a = b;b = temp; }
- 使用方式:编译器根据调用时传入的实参类型,对函数模板进行实例化,生成具体类型的函数。比如
int num1 = 1, num2 = 2; Swap(num1, num2);
,编译器会生成void Swap(int&, int&)
这样针对int
类型的函数实例 。也可显式指定类型,如Swap<double>(3.14, 2.71);
。 - 作用:避免为不同数据类型重复编写功能相似的函数,提高代码复用性 ,减少代码冗余。
- 定义:类模板将数据的类型参数化,用于创建通用类,使类的成员函数和成员变量能适应多种数据类型 。
- 语法格式:
- 类声明:
template <typename T1, typename T2, ...> // 类型参数可多个,用逗号分隔 class 类名 {// 类的成员变量和成员函数声明 };
类外定义成员函数
template <typename T1, typename T2, ...> 返回值类型 类名<T1, T2, ...>::函数名(参数列表) {// 函数体 }
例如,定义一个表示坐标的类模板:
template <typename T1, typename T2> class Point { public:Point(T1 x, T2 y) : x(x), y(y) {}void print() const; private:T1 x;T2 y; };template <typename T1, typename T2> void Point<T1, T2>::print() const {std::cout << "x: " << x << ", y: " << y << std::endl; }
- 使用方式:使用类模板创建对象时,必须显式指明具体的数据类型,编译器据此实例化出具体类。如
Point<int, int> p(1, 2);
,编译器会用int
替换模板中的T1
和T2
,生成针对int
类型的Point
类实例 。 - 作用:能针对不同数据类型创建相似功能的类,避免为每种类型单独编写类,提高代码的可维护性和复用性 。
- 类声明:
二者区别
- 实例化方式:函数模板可由编译器根据实参自动实例化,也可显式指定类型;类模板必须显式指定类型参数来实例化 。
- 功能侧重:函数模板主要针对可通用化的函数逻辑;类模板关注的是创建通用类,涵盖数据成员和成员函数 。