C++中的函数指针

来源:互联网 发布:手机校音器软件 编辑:程序博客网 时间:2024/06/08 04:20

玩法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->*指针变量名)(形参列表);
0 0
原创粉丝点击