> 文档中心 > 函数指针、typedef void (WorkThreadObject::*PFUNC)();

函数指针、typedef void (WorkThreadObject::*PFUNC)();

目录

前言:

小编第一次见到这个的时候有点懵了!!!是什么东东?函数指针我好像知道,typedef我好像也知道,但是又来一个类名是怎么回事?归根结底还是对知识不太熟悉。现在小编就来讲讲下面这行代码吧,原则就是个函数指针,加上typedef的起别名的重用。

一、函数指针

1、一般函数指针

2、类成员函数指针

二、关键字typedef

三、指针函数


前言:

小编第一次见到这个的时候有点懵了!!!是什么东东?函数指针我好像知道,typedef我好像也知道,但是又来一个类名是怎么回事?归根结底还是对知识不太熟悉。现在小编就来讲讲下面这行代码吧,原则就是个函数指针,加上typedef的起别名的重用。

typedef void (WorkThreadObject::*PFUNC)();

看!去掉类名和域作用符是不是就是我们熟悉的函数指针了,到时候用的时候直接PFUNC即可代替该类里面的void型无参数的函数了 !!

现在我们就来看看函数指针和typedef吧!!

 

一、函数指针

我们进行的各种函数调用,本质上都是操作这一个地址。而每一个函数名,就如同数组名一样,实际上都是一个地址。

函数指针,其本质是一个指针变量,该指针指向这个函数。总结来说,函数指针就是指向函数的指针。
声明格式:类型说明符  (*函数名) (参数);

1、一般函数指针

int ( *pf ) ( int);

这是一个有int参数的函数,返回值为int的函数指针变量pf

为什么*pf需要用()呢?

因为*的运算符优先级比()低,如果不用()就成了*(pf(int))了。

for example:

int NormalFunc(char c, int i, float f ){    cout << "Normal Func"<< c << i << f << endl;    return 0;}int (*pfunc)(char,int ,float );pfunc = NormalFunc;//或者pfunc = &NormalFuncpfunc(1,2,3);//或者(*pfunc)(1,2,3);

如果觉得上面的函数指针定义的方式太麻烦了,也可以直接使用typedef 

typedef int(*PFUNC)( char, int, float );PFUNC pfunc;

2、类成员函数指针

在指针前加入一个域限定符,并指定成员函数对应的类实例 

即:typedef  原函数类型名  (*类名::指针名)(参数);

for example:

class TEST{    public: ……    typedef int (TEST::*PFUNC)();//如此便定义了一个类成员函数指针 PFUNC maps[2];//类成员函数指针数组    voidtest()    {  (this->*maps[1])();//类内部调用    }};

使用时,在类内部需要加入this指针,在类外部则一定要指定对应的类实例. 

 

二、关键字typedef

在C语言中,typedef可以为现有类型名另起一个新的名字,语法一般是:

typedef oldTypeName newTypeName;

这里要敲黑板的是,是类型二字,typedef是为类型起别名而不是变量名,这里不要搞错了哦!!

我们经常能看到typedef的地方大概是在c里面定义一个结构体的时候了。

比如在没加typedef之前,定义一个结构体

struct qweiqwrieqrieuioewre{    ……};

在c里面定义该结构体类型的数据的时候,就必须

struct qweiqwrieqrieuioewre stu1;

这样是不是特别冗长且麻烦,这时候就体现出了typedef的好处了

typedef struct qweiqwrieqrieuioewre{    ……}QSTU;//示例:QSTU stu1;

这样看起来是不是书写就很方便了,所有说没有对比就没有伤害有木有,捶桌.jpg。

当然typedef还可以为其他类型其别名,如下:

/*-----------1 数组-----------*/typedef char ARRy[10];//表示 ARRAY20 是类型char [20]的别名。//接着可以用 ARRy 定义数组:ARRy a1, a2;//等价于:char a1[20], a2[20];//注意,数组也是有类型的。例如char a1[20];定义了一个数组 a1,它的类型就是 char [20]。/*-----------2 指针类型-----------*/typedef int (*PTR)[4];//表示PTR是类型int *[4]的别名,它是一个二维数组指针类型。//接着可以使用 PTR_TO_ARR 定义二维数组指针:PTR p1, p2;/*-----------3 函数指针类型-----------*/typedef int (*FUNC)(int, int);FUNC pfunc;

 

三、指针函数

指针函数,简单的来说,就是一个返回指针的函数,其本质是一个函数,而该函数的返回值是一个指针。
声明格式为:*类型标识符 函数名(参数表);

指针函数的写法:

int *fun(int x,int y);int * fun(int x,int y);int* fun(int x,int y);//这种写法贴合定义来看,比较容易理解