【C++】 56_函数模板的概念和意义
C++ 中有几种交换变量的方法?
交换变量的方法
- 定义宏代码块
- 定义函数
编程实验: 变量的交换
#include <iostream> #include <string> using namespace std; #define SWAP(t, a, b) \ { \ t c = a; \ a = b; \ b = c; \ }while{0} void Swap(int& a, int& b) { int c = a; a = b; b = c; } void Swap(double& a, double& b) { double c = a; a = b; b = c; } void Swap(string& a, string& b) { string c = a; a = b; b = c; } int main() { int a = 0; int b = 1; Swap(a, b); cout << "a = " << a << endl; cout << "b = " << b << endl; double m = 2; double n = 3; Swap(m,n ); cout << "m = " << m << endl; cout << "n = " << n << endl; string d = "D.T."; string t = "Software"; Swap(d, t); cout << "d = " << d << endl; cout << "t = " << t << endl; return 0; }
输出: a = 1 b = 0 m = 3 n = 2 d = Software t = D.T.
定义宏代码块
- 优点: 代码复用,适合所有的类型
- 缺点:编译器不知道宏的存在,缺少类型检查
定义函数
- 优点: 真正的函数调用,编译器对类型进行检查
- 缺点: 根据类型重复定义函数,无法代码复用
新的需求:
C++ 中有没有解决方案集合两种方法的的优点呢?
泛型编程
泛型编程的概念
- 不考虑具体数据类型的编程方式
对于 Swap 函数可以考虑下面的泛型写法
void Swap(T& a, T& b) { T t = a; a = b; b = t; }
Swap 泛型编程中的 T 不是一个具体的数据类型,而是泛指任意的数据类型。
函数模板
C++ 中泛型编程
函数模板
- 一种特殊的函数可用不同类型进行调用
- 看起来和普通函数很相似,区别是类型可被参数化
template<typename T> void Swap(T& a, T& b) { T t = a; a = b; b = t; }
函数模板的语法规则
- template 关键字用于声明开始进行泛型编程
- typename 关键字用于声明泛指类型
函数模板的使用
- 自动类型推导调用
- 具体类型显示调用
void code() { int a = 0; int b = 1; Swap(a, b); // 自动推导 float c = 2; float d = 3; Swap<float>(c, d); // 显示调用 }
编程实验: 函数模板使用初探
#include <iostream> #include <string> using namespace std; template < typename T > void Swap(T& a, T& b) { T c = a; a = b; b = c; } template < typename T > void Sort(T a[], int len) { for(int i=0; i<len; i++) { for(int j=i; j<len; j++) { if( a[i] > a[j] ) { Swap(a[i], a[j]); } } } } template < typename T > void Println(T a[], int len) { for(int i=0; i<len; i++) { cout << a[i] << ", "; } cout << endl; } int main() { int a[5] = {5, 4, 3, 2, 1}; Println<int>(a, 5); Sort<int>(a, 5); Println<int>(a, 5); string s[5] = {"Java", "C++", "Pascal", "Ruby", "Basic"}; Println(s, 5); Sort(s, 5); Println(s, 5); return 0; }
输出: 5, 4, 3, 2, 1, 1, 2, 3, 4, 5, Java, C++, Pascal, Ruby, Basic, Basic, C++, Java, Pascal, Ruby,
小结
- 函数模板是泛型编程在 C++ 中的应用方式之一
- 函数模板能够根据实参对参数类型进行推导
- 函数模板支持显示的指定参数类型
- 函数模板是 C++ 中重要的代码复用方式
以上内容参考狄泰软件学院系列课程,请大家保护原创!
相关推荐
chensen 2020-11-14
lwnylslwnyls 2020-11-06
ATenhong 2020-10-15
yanzhelee 2020-10-13
佛系程序员J 2020-10-10
guojin0 2020-10-08
佛系程序员J 2020-10-08
bluewelkin 2020-09-16
wwzaqw 2020-09-04
zhongdaowendao 2020-09-02
favouriter 2020-08-18
奎因amp华洛 2020-08-15
一青年 2020-08-13
千锋 2020-08-10
nangongyanya 2020-08-09
dongxurr 2020-08-08
明天你好 2020-08-03
kyelu 2020-08-03
Ashes 2020-08-03