# 五. 模板
模板是实现代码重用机制的一种工具,它可以实现类型参数化,即把类型定义为参数,从而实现真正的代码重用
函数模板
格式:
template <class 类型参数>
//template是声明模板的关键字。class 或typename,表示任何类型,也可用于自定义类
返回类型 函数名(模板形参表)
{ 函数体 }
如:
template <typename T> //T为类型名 T getmax(T a,T b) { if(a>b) return a; else return b; }
1
2
3
4
5
6写两种功能不同的函数模板时,即使参数列表相同,也需要在每个函数模板前写 “ template <class 类型参数> ”
模板函数
函数模板的实例化
当编译系统发现有一个函数调用: 函数名(模板实参表);时,将根据模板实参表中的类型生成一个函数,叫模板函数,该模板函数的函数体与函数模板的函数定义体相同
如:
getmax(6,7); //实例化为getmax(int,int)
getmax('u','p'); //实例化为getmax(char,char)
1
2
2
类模板
格式:
template <类型形参列表>
class 类模板名
{ 类模板体定义 };
类模板的成员函数可以放在类模板中定义,也可以放在类模板外部定义,类模板的成员函数其实都是函数模板
一般形式:
template <类型形参列表>
函数返回类型 <u>类模板名 <类型名表>::</u>函数名(形参表)
{ 函数体 }
如:
#include <iostream> // 类模板,接受三个类型参数 T1, T2, T3 template <typename T1, typename T2, typename T3> class TripleTemplate { private: T1 data1; T2 data2; T3 data3; public: // 构造函数 TripleTemplate(T1 val1, T2 val2, T3 val3) : data1(val1), data2(val2), data3(val3) {} // 打印数据的成员函数 void printData() const { std::cout << "T1: " << data1 << ", T2: " << data2 << ", T3: " << data3 << std::endl; } // 示例:一个接受三个相同类型参数的函数(这里只是为了演示) // 注意:这个函数并不要求T1, T2, T3必须是相同的类型 void someFunction(T1 arg1, T2 arg2, T3 arg3) { // 这里可以添加一些逻辑处理 arg1, arg2, arg3 // 但为了简单起见,我们只是打印它们 std::cout << "Arguments: " << arg1 << ", " << arg2 << ", " << arg3 << std::endl; } }; int main() { // 实例化 TripleTemplate,使用 int, double, std::string 类型 TripleTemplate<int, double, std::string> tt(10, 3.14, "Hello"); //!!!!!!!!!!先实例化参数,再定义对象 // 调用成员函数 tt.printData(); tt.someFunction(1, 2.0, "World"); // 注意这里我们传递了不同类型的参数给 someFunction return 0; }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
← 类和对象 new和delete →