c++ 函数指针

来源:互联网 发布:最花钱的游戏知乎 编辑:程序博客网 时间:2024/06/05 16:51

在c++中,  函数指针虽然并不常用, 但还是非常有必要了解的

1.函数指针和其他指针一样, 指向某种特定类型. 函数指针的类型由它的返回类型和形参类型共同决定, 与函数名无关, 例如:

bool lengthCompare(const string&, const string&);bool (*pf)(const string&, const string&);  // 未初始化

2.把函数名作为一个值使用时, 该函数自动地转换成指针.例如

pf = lengthCompare;pf = &lengthCompare;

3.函数指针作为形参的写法

// 虽然第三个形参是函数类型, 但它会自动转换成指向函数的指针void useBigger(const string &s1, const string &s2,                bool pf(const string&, const string&);   void useBigger(const string &s1, const string &s2,                bool (*pf)(const string&, const string&);


4.函数指针的类型别名

直接使用函数指针类型显得冗长而繁琐, 可以为它定义类型别名, 通常我们使用第三种写法

// func和Func2是函数类型  typedef bool func(const string&, const string&);typedef decltype(lengthCompare) Func2;// FuncP和FuncP2是指向函数的指针typedef bool(*FuncP)(const string&, const string&);typedef decltype(lengthCompare) *FuncP2;

此时, useBigger可以重新声明为

void useBigger(const string&, const string&, Func);void useBigger(const string&, const string&, FuncP2)


5.不能返回一个函数, 但是能返回指向函数的指针.必须注意的是, 与函数类型的形参不一样, 我们必须把返回类型写成指针形式, 编译器不会自动地将函数返回类型当成对应的指针类型处理.

例如我们要定义一个形参为一个int, 返回一个FuncP类型的函数,代码如下

FuncP f1(int);   // 正确func *f1(int);   // 正确func f1(int);    // 错误


6.类的成员函数指针

必须注意的是,:

在定义类的成员函数指针时, 必须加上"类名::", 而调用类的非静态函数时都有一个隐含的this指针, 如果使用this调用, 则格式为(this->*pFunc)(实参列表),

或(该类对象指针->*pFunc)(实参列表)

假如CTest类有函数func1~func3和 invoke, invoke函数内部可能需要调用func1~func3中的其中一个, 我们的代码如下

class CTest{public:    CTest();private:    void func1()    {        std::cout << __PRETTY_FUNCTION__ << std::endl;    }    void func2()    {        std::cout << __PRETTY_FUNCTION__ << std::endl;    }    void func3()    {        std::cout << __PRETTY_FUNCTION__ << std::endl;    }    typedef void (CTest::*FuncPointer)();    void invoke(FuncPointer func)    {        (this->*func)();    }};


0 0