重庆营销型网站随做的好处,网站建设公司谁管,网站的流程,媒介盒子加qq1126137994 微信#xff1a;liu1126137994 一起学习更多技术#xff01;#xff01;#xff01;
1、问题引入#xff1a;
C中有几种变量交换的方法#xff1f;
定义宏代码块和定义函数
#include iostream
#include stringusing namespace std;#d…加qq1126137994 微信liu1126137994 一起学习更多技术
1、问题引入
C中有几种变量交换的方法
定义宏代码块和定义函数
#include iostream
#include stringusing namespace std;#define SWAP(t, a, b) \
do \
{ \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 Delphi;string t Tang;Swap(d, t);cout d d endl;cout t t endl;return 0;
}
上述函数是分别用宏定义与几个函数实现的变量的交换的方法
下面我们来分析一下他们两个的优缺点 定义宏代码块 优点 代码复用适合所有的类型 缺点 宏定义是在预处理阶段替换的编译器不知道宏的存在无法做类型安全检查
定义函数 优点 真正的函数调用编译器会对类型检查 缺点 根据类型重复定义函数无法实现代码复用
2、解决方案
解决上述两种方案的缺点泛型编程 泛型编程不考虑具体数据类型的编程方式
对于上述Swap函数可以写成下面这样
void Swap(T a,T b)
{T t a;a b;b t;
}
上述的T不是指某一个数据类型而是泛指任意的数据类型
在C中泛型编程指的就是函数模板 函数模板
一种特殊函数可用不同类型进行调用看起来和普通函数类似区别是类型可被参数化
template typename T
void Swap(T a, T b)
{T t a;a b;b t;
}
函数模板的语法规则
template 关键字用于声明开始进行泛型编程typename 关键字用于声明泛指类型 函数模板的使用有两种调用方法
自动类型推导调用具体类型显示调用 下面看一个具体的示例
#include iostream
#include stringusing 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; ilen; i){for (int j i; jlen; j){if (a[i] a[j]){Swap(a[i], a[j]);}}}
}template typename T
void Println(T a[], int len)
{for (int i 0; ilen; i){cout a[i] , ;}cout endl;
}int main()
{int a[5] { 5, 3, 2, 4, 1 };Println(a, 5);Sort(a, 5);Println(a, 5);string s[5] { Java, C, Pascal, Ruby, Basic };Println(s, 5);Sort(s, 5);Println(s, 5);return 0;
}
运行结果为 从而可以看出函数模板的强大我们只需要写出一个函数就可以使用任意的数据类型
3、总结
函数模板是泛型编程在C中的应用之一函数模板能够根据实参对参数类型进行推导函数模板支持显示的指定参数类型函数模板是C中重要的代码复用的方式