前言:
此文章仅作本人学习笔记留存分享。如有出错欢迎指正。
正文:
C++ 语言的核心优势之一就是便于软件的重用, 而函数模板就很好地体现了这一优势。 假如设计一个求两参数最大值的函数,在实践中我们可能需要定义四个函数:int max ( int a , int b ) { return ( a > b ) ? a , b ; }
long max ( long a , long b ) { return ( a > b ) ? a , b ;}
double max( double a , double b ) { return ( a >b)? a , b ; }
char max ( char a , char b ) { return ( a > b ) ? a , b ;}
这些函数几乎相同,唯一的区别就是形参类型不同。
需要事先知道有哪些类型会使用这些函数,对于未知类型这些函数不起作用。
此时使用模板即可将上面函数抽象出来,统一用一个通用函数来表示。
模板(template)是C++的一个重要特性,它对具有 相同功能 的 函数或类 的再抽象,把数据类型参数化,用一种或多种抽象的类型来表示(称为类属类型),再用一个通用形式来表示多个功能相同而数据类型不同的函数或类,实现 代码重用 的目的。 实际使用时,再 用具体的类型去替代模板中的类属类型 ,这称为实例化。函数模板定义方式如下:
template < 模板形参表 >
返回值类型 函数名(形参表)
{
//函数体
};
代码实验:
.h头文件
//实例化的函数模板称为模板函数 //下面是一个简单的交换两值的模板函数 templatevoid Exchange(T &a, T &b) { T c; c = a; a = b; b = c; } //结构体,用于实验 struct Student { int id; //学号 float gpa; //平均分 }; //类,用于实验 class TA { int i; public: TA() {};//因为本例中Exchange里有T c实例化了一个对象,所以需要定义一个缺省构造函数 TA(int i) { this->i = i; } void setI(int i) { this->i = i; } void display() { cout << "TA:"<< i << endl; } };
.cpp文件main()函数
void main()
{
//int类型
int a = 1, b = 2;
cout << "交换前:" << "a:" << a << 't' << "b:" << b << endl;
Exchange(a, b);
cout << "交换后:" << "a:" << a << 't' << "b:" << b << endl;
//float类型
float a2 = 1.2, b2 = 2.1;
cout << "交换前:" << "a2:" << a2 << 't' << "b2:" << b2 << endl;
Exchange(a2, b2);
cout << "交换后:" << "a2:" << a2 << 't' << "b2:" << b2 << endl;
//结构体
Student s1{ 01, 4.5 };
Student s2{ 02, 3.5 };
cout << "交换前:"<< endl;
cout << "s1.ID:" << s1.id << 't' << "s1.GPA:" << s1.gpa << endl;
cout << "s2.ID:" << s2.id << 't' << "s2.GPA:" << s2.gpa << endl;
Exchange(s1, s2);
cout << "交换后:" << endl;
cout << "s1.ID:" << s1.id << 't' << "s1.GPA:" << s1.gpa << endl;
cout << "s2.ID:" << s2.id << 't' << "s2.GPA:" << s2.gpa << endl;
//类
TA ta1(1);
TA ta2(2);
cout << "交换前:"<< endl;
ta1.display();
ta2.display();
Exchange(ta1, ta2);
cout << "交换后:" << endl;
ta1.display();
ta2.display();
}
结果:



