C++中的函数指针

玩法1 – 函数指针的基本定义方式与使用方法

示例
void func1()
{
    cout << __FUNCTION__ << endl;
}
int main()
{
    void (*funcPtr1)() = func1;
    funcPtr1();
    return 0;
}
输出结果:

func1

最简单的函数指针使用方法。定义函数指针时,指针类型必须与所要指向的函数类型一致,其后的参数类型也必须一致。使用函数指针时,只需将函数指针看作所指向的函数即可,相当于给函数起了个别名。

玩法2 – 函数指针更常用的定义方式

示例
typedef void (*FuncPtr2)();
void func2()
{
    cout << __FUNCTION__ << endl;
}
int main()
{
    FuncPtr2 funcPtr2 = func2;
    funcPtr2();
    return 0;
}
输出结果:

func2
这里是将函数指针重新做了定义,相当于一个新的类型。一般也都是使用这种方式,因为更加简单、直观。

玩法3 – 函数指针做形参

示例
typedef void (*FuncPtr3)();
void func3_1()
{
    cout << __FUNCTION__ <<endl;
}
void func3_2()
{
    cout << __FUNCTION__ <<endl;
}
void func3_3()
{
    cout << __FUNCTION__ <<endl;
}
void func3(FuncPtr3 func)
{
    func();
}
int main()
{
    func3(func3_1);
    func3(func3_2);
    func3(func3_3);
    return 0;
}
输出结果:

func3_1
func3_2
func3_3

玩法4 – 函数返回值为函数指针

示例
typedef void (*FuncPtr4)();
void func4_1()
{
    cout << __FUNCTION__ <<endl;
}
FuncPtr4 func4()
{
    return func4_1;
}
int main()
{
    FuncPtr4 func = func4();
    func();
    return 0;
}
输出结果:

func4_1
函数func4()中将另一个函数func4_1()的名字作为了返回值,外部通过一个函数指针接收并调用该函数。

玩法5 – 将函数指针加入map中

示例
typedef void (*FuncPtr5)();
void func5_1()
{
    cout << __FUNCTION__ <<endl;
}
void func5_2()
{
    cout << __FUNCTION__ <<endl;
}
void func5_3()
{
    cout << __FUNCTION__ <<endl;
}
int main()
{
    map<string, FuncPtr5> m;
    m.insert(pair<string, FuncPtr5>("func1", func5_1));
    m.insert(pair<string, FuncPtr5>("func2", func5_2));
    m.insert(pair<string, FuncPtr5>("func3", func5_3));
    m.find("func1")->second();
    FuncPtr5 func = m.find("func3")->second;
    func();
    return 0;
}
输出结果:

func5_1
func5_3
除了map外,其他容器均可类似地使用函数指针。

玩法6 – 函数指针所指向的函数为成员函数

示例
class Func6Class
{
public:
    typedef void (Func6Class::*FuncPtr6)();
    void func6_1()
    {
        cout << __FUNCTION__ <<endl;
    }
    void func6()
    {
        FuncPtr6 func = &Func6Class::func6_1;
        (this->*func)();
    }
};
int main()
{
    Func6Class func;
    func.func6();
    return 0;
}
输出结果:

func6_1
需要特别注意的是在FuncPtr6 func = &Func6Class::func6_1;语句中, 必须有&,否则编译会报错:
error: cannot convert 'Func6Class::func6_1' from type 'void (Func6Class::)()' to type 'Func6Class::FuncPtr6 {aka void (Func6Class::*)()}'
在调用时也不能像之前直接使用func(),而必须使用(this->*func)();,否则报错:
error: must use '.*' or '->*' to call pointer-to-member function in 'func (...)', e.g. '(... ->* func) (...)'
至于原因,应该可以参考《C++ 必知必会》第16条:
指向成员函数的指针并非指针

玩法7 – 在类外调用指向成员函数的函数指针

示例
class Func7Class
{
public:
    void func7()
    {
        cout << __FUNCTION__ <<endl;
    }
};
typedef void (Func7Class::*FuncPtr7)();
Func7Class func;
    FuncPtr7 funptr = &Func7Class::func7;
    (func.*funptr)();
输出结果:

func7
与之前不同的是,这里需要通过对象来调用函数指针。而前面使用的是this。

总结:

函数指针类型定义:

非成员函数:
  • typedef 函数返回类型 (*函数指针名)(参数类型列表);
成员函数:
  • typedef 函数返回类型 (类名::*函数指针名)(参数类型列表);

函数指针定义:

非成员函数:
  • 函数指针名 指针变量名 = 函数名;
成员函数:
  • 函数指针名 指针变量名 = &类名::函数名;

函数指针使用:

非成员函数:
  • 指针变量名(形参列表);
成员函数:
  • (对象.*指针变量名)(形参列表);
  • (对象指针->*指针变量名)(形参列表);
类体内:
  • (this->*指针变量名)(形参列表);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值