函数匹配
1、实参类型转换
1.精确匹配
2.通过const转换实现的匹配
3.通过类型提升实现的匹配
4.通过算术类型转换或者指针转换
5.通过类类型转换实现的匹配
函数匹配和const实参
如果重载函数的区别在于它们的引用类型的形参是否引用了const,或者指针类型的形参是否指向const,则当调用发生时编译器通过实参是否是常量来决定选择哪个类型。
函数指针
使用函数指针
当我们吧函数名作为一个值来使用时,该函数自动转换为指针。
这里有三个等价的调用
bool (*pf)(const string &, const string &);
bool b1=pf("hello", "goodbye");
bool b2=(*pf)("hello", "goodbye");
bool b3=lengthCompare("hello", "goodbye");
重载函数的指针
void ff(int *);
void ff(unsigned int);
返回指向行数的指针
//使用类型别名
using F=int(int*, int); //F是函数类型,不是指针
using PF=int(*)(int*, int); //PF是指针类型
PF f1(int); //正确:PF是指向函数的指针,f1返回指向函数的指针
F f1(int); //错误:F是函数类型,f1不能返回一个函数
F *f1(int); //正确:显示地制定返回类型是指向函数的指针
讲auto和decltype用于函数指针类型
牢记当我们将decltype作用于某个函数的时候,它返回的不是指针类型,因此我们有必要在函数前面显示地加上*
decltype(sumLength) *getFcn(const string &);
/*
* 功能:编写函数声明,接受两个int形参并且返回类型也是int,声明一个vector对象,令其元素师指向该函数的
* 指针。编写4个函数,分别对两个int值执行加减乘除运算,在vector中保存指向这些函数的指针。
* 调用上述vector对象中的每个元素并输出其结果
* 时间:2014年5月27日12:39:50
* 作者:cutter_point
*/
#include <iostream>
#include <vector>
using namespace std;
//练习6.54
typedef int fun(int, int);
//vector<fun*> v1;
//练习6.55
int sum(int a, int b)
{
return a+b;
}
int reduce(int a, int b)
{
if(a >= b)
return a-b;
else
return b-a;
}
int ride(int a, int b)
{
return a*b;
}
int divide(int a, int b)
{
return a/b;
}
int main()
{
int a=10,b=5;
vector<fun*> v1;
v1.push_back(&sum);
v1.push_back(&reduce);
v1.push_back(&ride);
v1.push_back(÷);
vector<fun*>::iterator it=v1.begin(); //用迭代器来准确定位vector的尾置
for(;it != v1.end(); ++it)
{
cout<<((*it)(a,b))<<endl;
}
return 0;
}
//借鉴资料来自 http://www.07q.net/read/2032.html
PS:好样的,一个程序解决了三个题,这次有点小心得,那就是我到现在认为iterator迭代器是和vector容器一起使用的。