C/C++外部函数指针指向类内部函数

PS:用函数指针访问类内部函数约束

1不能访问private

#include "iostream"
using namespace std;
class A
{
    private:
        void fun()
        {
            cout<<"this is 0"<<endl;
        }
    public:
        void fun1()
        {
            cout<<"this is 1"<<endl;
        }
        static void fun2()
        {
            cout<<"this is 2"<<endl;
        }
        virtual void fun3()
        {
            cout<<"this is 3"<<endl;
        }
};
int main()
{
    //方式1,访问类内部static函数
    typedef void (*pfun)();
    pfun p=A::fun2;
    (*p)();
    ///////////////////////////
    //方式2,访问类内部static函数
    void (*pf)();
    pf=A::fun2;
    (*pf)();
    ////////////////////////
    //方式3,访问类内部public函数
    void (A::*pf1)();
    A a;
    pf1=&A::fun1;
    (a.*pf1)();
    /////////////////////////
    //方式4,访问类内部virtual函数
    typedef void (A::*pf2)();
    pf2 pf2_1=&A::fun3;
    (a.*pf2_1)();
    return 1;
}


### C/C++函数指针的概念及用法 #### 1. 函数指针的基本概念 在C/C++中,函数指针是一种特殊的指针型,它可以指向具有特定返回值和参数列表的函数。通过函数指针,可以在运行时动态决定调用哪个函数,从而实现灵活的功能扩展[^1]。 例如,在某些场景下,可以通过传递不同的函数指针来改变程序的行为,这种机制常用于回调函数的设计。 #### 2. 定义与声明 函数指针的定义方式与其所指向函数原型密切相关。假设有一个函数 `int add(int a, int b)`,那么对应的函数指针可以这样声明: ```cpp // 声明一个指向返回值为int,参数为两个int型的函数指针 int (*funcPtr)(int, int); ``` 这里的关键在于括号的位置:`(*funcPtr)` 表示这是一个指针变量,而不是普通的函数名称。 #### 3. 赋值给函数指针 一旦声明了函数指针,就可以将其赋值为某个具体函数的地址。例如: ```cpp #include <iostream> using namespace std; int add(int a, int b) { return a + b; } int main() { // 将add函数的地址赋值给funcPtr int (*funcPtr)(int, int) = add; cout << funcPtr(3, 4) << endl; // 输出7 return 0; } ``` 上述代码展示了如何将函数 `add` 的地址赋予函数指针 `funcPtr` 并通过该指针调用函数。 #### 4. 使用简化形式 除了显式的解引用操作外,还可以直接像普通函数那样使用函数指针。这意味着无需写成 `(*funcPtr)(args...)` 形式,而是可以直接写作 `funcPtr(args...)`[^3]。 继续以上述例子为例: ```cpp cout << funcPtr(3, 4) << endl; // 同样输出7 ``` 这种方式更加简洁直观,因此被广泛采用。 #### 5. 动态选择函数 利用数组或者条件语句存储多个不同功能的函数指针,则可以根据实际需求切换执行逻辑。比如下面的例子实现了基于输入字符的不同计算方法的选择: ```cpp #include <iostream> using namespace std; double square(double x) { return x * x; } double cube(double x) { return x * x * x; } void process(char op, double value) { double (*operation)(double); if (op == 's') operation = square; else if (op == 'c') operation = cube; cout << "Result: " << operation(value) << endl; } int main(){ char choice='s'; double num=9; process(choice,num); // 如果choice是's'则打印81;如果是'c', 则打印729. return 0; } ``` 此案例说明了如何依据外部数据调整内部处理流程。 #### 6. 结合结构体或成员函数 当涉及到面向对象设计模式下的成员函数时,情况会稍微复杂一点,因为非静态成员函数还隐含了一个额外的this指针作为第一个参数传入其中。所以如果想创建这样的函数指针就需要特别注意其签名格式匹配问题[^2]。 对于这种情况通常推荐改用标准库提供的std::function配合lambda表达式或者其他高级特性来完成似任务而非传统意义上的裸露型函数指针[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值