【足迹C++primer】14、函数匹配、函数指针

函数匹配

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容器一起使用的。

















  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值