C++除了面向对象的思想之外,还有就是用到了泛型编程,泛型编程的主要技术就是模板。
1.模板的概念
模板就是建立通用的模具,大大提高复用性
C++有两种模板:函数模板和类模板
2.函数模板
通过建立一个通用函数,其函数返回值类型和形参类型可以不具体指定,用一个虚拟的类型来代表。
语法:
template<typename T>
函数申明或定义
下面分别不使用以及使用模板来实现swap函数。当不使用模板时,交换数据类型不同时,得再写一个函数,使用模板,大大提高了代码的复用性。
#include<iostream>
using namespace std;
//函数模板
//两个整型交换函数
void swapInt(int &a, int &b)
{
int temp;
temp = a;
a = b;
b = temp;
}
//交换两个浮点型函数
void swapDouble(double &a, double &b)
{
double temp;
temp = a;
a = b;
b = temp;
}
//函数模板
template<typename T> //申明一个模板,告诉编译器后面代码中紧跟着的T不要报错,T是一个通用数据类型
void mySwap(T &a, T &b)
{
T temp;
temp = a;
a = b;
b = temp;
}
void test01()
{
int a = 10, b = 20;
swapInt(a, b);
cout << a << ' ' << b<<endl;
double c = 1.1, d = 2.2;
swapDouble(c, d);
cout << c << ' ' << d << endl;
//用函数模板实现交换
//两种方式使用函数模板
//1.自动类型推导
mySwap(a, b);
cout << a << ' ' << b << endl;
//2.显示指定类型
mySwap<int>(a, b); //指定T的类型是int型
}
int main()
{
test01();
system("pause");
return 0;
}
总结:
- 函数模板利用关键字template
- 使用函数模板有两种方式:自动推导型、显示指定型
- 模板的目的是为了提高代码复用性,将类型参数化
函数模板案例:实现通用的数组排序
#include<iostream>
using namespace std;
//通用的交换函数
template<typename T>
void Myswap(T &a, T &b)
{
T temp;
temp = a;
a = b;
b = temp;
}
//实现通用 对数组进行排序的函数
//规则 从大到小
template<typename T>
void mySort(T arr[], int len)
{
for (int i = 0; i < len; i++)
for (int j = 0; j < len - i-1; j++)
{
if (arr[j] < arr[j + 1])
Myswap(arr[j],arr[j+1]);
}
}
void test01()
{
//测试char数组
char charArr[] = "asdfrg";
mySort(charArr, sizeof(charArr) / sizeof(char));
for (int i = 0; i < 6; i++)
cout << charArr[i]<<endl;
}
void test02()
{
//测试int数组
int a[] = {2,3,1,7,5,8};
mySort(a, sizeof(a)/sizeof(int));
for (int i = 0; i < 6; i++)
cout << a[i] << endl;
}
int main()
{
//test01();
test02();
system("pause");
return 0;
}