函数指针
引入: 何为函数指针,和普通指针有什么区别!函数也是一段二进制码而已,所以也是要占用存储空间的,只是它的空间比普通的空间更安全。所以我们可以用指针指向它。
常用自定义形式:
typedef int(*ADD)(int, int) ;
using pADD = int(*)(int, int); //应该c++17可用
代码举例:
typedef int(*ADD)(int, int) ;
using pADD = int(*)(int, int);
int Add(int a, int b)
{
return a + b;
}
int main()
{
//第一种
ADD pAdd = Add; cout << pAdd(3, 6) << endl;
//第二种
pADD pAdd = Add; cout << pAdd(3, 6) << endl;
}
结果:
函数模板
引入: 为什么要引入函数模板的问题呢?还是为了解决代码重复性问题!
例如:
int Add(int a, int b) //int 加法
{
return a + b;
}
float Add(float a, float b) //float 加法
{
return a + b;
}
double Add(double a, double b) //double 加法
{
return a + b;
}
所以c++委员会引入了函数模板来解决这种尴尬的问题
函数模板格式:
//注意:template 和 typename 都是关键字 并且T只是个名字,可以修改
template <typename T>
T Add(T a, T b)
{
return a + b;
}
//常见格式的还有许多,例如:
template <typename T1,typename T2> //我们也可以要求多个类型名,要多少有多少
T1 Add(T1 a, T2 b)
{
return a + b;
}
//还有许多。。。。
模板也有尴尬?显式声明就ok!
接着,我们引入一个例子来说明一些常见问题:
template<typename T>
T Add(T a, T b)
{
return a + b;
}
int main()
{
//错误代码
//原因:因为编译器无法确定类型是int还是float
//cout << Add(1.000, 2.0f);
//正确代码
//通过显示声明类型来不让编译器烦恼
cout << Add<int>(1.000, 2.0f);
}
函数模板的例外处理
先引入个例子来说明:
template<typename T>
T Max(T a, T b)
{
return a>b?a:b;
}
int main()
{
int a{ 10 }, b{ 20 };
cout << "a=10;b=20 大的是几?答案:" << *Max(&a, &b);
}
来看一下结果:
追加: 惊不惊喜意不意外?当我们未来可能会出现这种情况时,就需要用到模板的例外处理就可以解决这种情况!!!
我们只需要添加以下代码就可解决:
template<> //尖括号内为空,代表例外处理
int* Max(int* a, int* b)
{
int* max = new int{ (*a) > (*b) ? (*a) : (*b) }; //防止返回局部变量的问题
return max;
}
再看结果:
函数模板与函数重载的优先级
引入: 若在未来的实际项目中,出现了一个重载函数和模板函数名相同时?会出现什么情况呢?我们来看看下面代码:
template<typename T>
T Avg(T a, T b)
{
return a + b;
}
int Avg(int a, int b)
{
return a > b ? a : b;
}
int main()
{
int a{ 10 }, b{ 20 };
cout << "Avg(a,b) = " << Avg(a, b) << endl;
}
来看一下结果:
追加: 所以我们可以看到函数重载的优先级时高级函数模板的!
函数模板中的函数重载
引入: 是不是听起来很玄乎么?才没有!模板函数也是函数呀,当然可以重载!下面给出代码让大家体会一下结合运用的快感!
template<typename T>
T Avg(T a, T b)
{
return (a + b)/2;
}
template<typename T>
T Avg(T a, T b,T c)
{
return (a + b + c) / 3;
}
int main()
{
int a{ 10 }, b{ 20 }, c{ 30 };
cout << "Avg(a,b) = " << Avg(a, b) << endl;
cout << "Avg(a,b,c) = " << Avg(a, b, c) << endl;
}
来看一下结果哈:
总结: 结果正确!一点问题没有哈,是不是感觉非常愉快呢!!