您的位置:首页 > 编程语言 > C语言/C++

C++中的函数指针

2015-10-23 14:23 441 查看

玩法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()
a492
;
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->*指针变量名)(形参列表);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: