c++知识点之 函数指针

声明函数指针: 

void (*fp)  (int,int);
void h(int a, int b); 
fp = 0;     //ok
fp = h;     //ok 
fp = &h;  //ok 

用typedef简化一个函数指针定义

typedef void (*pFunc)(int);

即可使用pFunc指代函数类型声明  pFunc p;

调用

 fp(a, b);     //ok      or   (*fp) (1, 2)


函数指针形参:

void function(int a, int b, void(*)(int x));
void function(int a, int b, void (int x));

返回指向函数的指向

int (*ff(int))(int ,int);
ff是一个函数,有一个int型的参数,返回值一个函数指针:int (*) (int, int);


将一个函数的地址初始化或赋值给一个函数指针时,无需显示的取函数地址,编译器知道隐式的获得函数的地址,即&可以省略。

注意: 

1、 void*指针可以指向任何类型的数据,但是不存在可以指向任何类型函数的通用指针,声明的时候就确定了“ 返回值” 和 “参数”

2、还要注意的是,非静态成员函数的地址不是一个指针,因此不可以将一个函数指针指向一个非静态成员函数。

3、 函数指针指向内联函数是合法的,但是通过函数指针调用内联函数不会导致内联式的函数调用,编译器无法再编译期间确定函数指针调用什么函数。

4、函数指针持有一个重载函数的地址时:

void jumpIn();
void jumpIn(int x);

void (*func) () = 0;
void (*func1) (int) = 0;
func = jumpIn();
func1 = jumpIn(2);


可以将函数指针强制转换成void指针,然后通过函数参数传递,代码如下:

#include<stdio.h>

void test(){
    printf("success");
}
void test2(void *arg){
    void (*func)() = (void (*)()) arg;
    func();
}
int main()
{
    void (*func)() = test;
    void * t =(void *) func;
    test2(t);
    return 1;
}


指向成员函数的指针并非指针


在获取非静态成员函数的地址时,得到的不是一个地址,而是一个指向成员函数的指针


class Shape{
public:
    void moveTo(Point newLocation);
    bool validate() const;
    virtual bool draw ()const = 0;
};

class Circle : public Shape{
    bool draw()const;
};

void (Shape::*mf1) (Point) = &Shape::moveTo; //不是指针
需要使用classname::*而不是*来指明说指向的函数时classname的一个成员,指向成员函数的指针可以指向一个常量成员函数:

bool (Shape::* mf2)() const = &Shape::validate();
为了对一个指向成员函数的指针进行解引用,需要一个对象或一个指向对象的指针

Circle circ;
Shape *pShare = &circ;
(pShare->*mf2)();
(circ.*mf2) (); 

注意:一个指向成员函数的指针的实现自身必须存储一些信息,诸如它所指向的成员函数是虚拟的还是非虚拟的,到哪儿去找到适当的虚函数表指针等等等。。

静态成员函数和简单的指向函数的指针就一样的效果了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值