c++私有静态成员函数 将函数指针传给外部变量

最后修改时间:2022-02-23 12:30

1、c++ 对于类内部的 私有静态成员函数,将其函数指针作为参数 传递到外面普通变量,依旧可以正常执行的现象。直接看代码。

#include <stdio.h>
typedef void (*PrintFunc) ();

// 全局变量
PrintFunc print_func;

// 类
class AA{
public:
    AA(){
        printf("AA(), func addr:%p\n", AA::Print);
        print_func = AA::Print;
    }

private:
    static void Print(){
        printf("call Print(), num:%d\n", num_);
    }

    static int num_;
};

int AA::num_ = 101;

int main(){
    AA aa;

    printf("main(), func addr:%p\n", print_func);
    print_func();

    return 0;
}

上面程序执行结果:


27520964-92ba4e9720a317e8.png

2、对于做回调函数参数,依旧可以正常执行,看代码。

#include <stdio.h>
typedef void (*PrintFunc) (int);

void DealWithOutside(PrintFunc func){
    int deal_result = 1+1;
    printf("DealWithOutside(), func addr:%p\n", func);
    //回调 AA类的私有静态成员函数
    func(deal_result);
    return ;
}

class AA{
public:
    void DealWith(){
        printf("DealWith(), func addr:%p\n", AA::Print);
        // deal....
        DealWithOutside(AA::Print);
    }

private:
    static void Print(int result){
        printf("call Print(), num:%d, deal result:%d\n", num_, result);
    }

    static int num_;
};

int AA::num_ = 101;

int main(){
    AA aa;
    aa.DealWith();

    return 0;
}

执行结果:


27520964-ad6de789fa80c9a8.png

编译使用的是:gcc 10.3.0、gcc 8.3.1 ,生成的程序都可以正常运行。

2022-05-24修改:静态变量本身就长时间驻留在内存,拿到其指针使用对应的内存,没有触发违规的操作,
私有属性只是属于类,只要指针操作的区域是属于当前进程的,并且已经申请空间了,就可以使用。

-完结-----------------------------------

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容