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