c++重温之函数指针和模板篇

函数指针

引入: 何为函数指针,和普通指针有什么区别!函数也是一段二进制码而已,所以也是要占用存储空间的,只是它的空间比普通的空间更安全。所以我们可以用指针指向它。

常用自定义形式:

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;
}

来看一下结果哈:
在这里插入图片描述
总结: 结果正确!一点问题没有哈,是不是感觉非常愉快呢!!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值