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

小红书x-mini签名逆向实战:Frida动态Hook与算法还原 在移动App协议分析中,请求签名机制是保障接口安全的核心技术,其本质是客户端对请求参数、时间戳、设备指纹等要素进行加密认证的过程。理解签名原理需掌握Native层加密流程、JNI调用机制及密钥动态派生逻辑。Frida作为主流动态插桩工具,能绕过符号剥离、字符串加密和控制流混淆等反分析手段,在函数执行瞬间捕获寄存器状态、内存数据与调用上下文,实现签名算法的完整还原。该技术广泛应用于合规内容监测、API自动化调用与竞品协议研究等工程场景。本文聚焦小红书x-mini签名这一典型样本,详解从JNI_OnLoad定位 阅读详情
指向类成员函数的指针并非指针
参考<<C++必知必会>>的相关章节

"指向类成员函数的指针",这个术语中包含了"类成员函数"的术语,但是严格的说,这里的成员函数只是指非静态成员函数,这个术语中还包含了"指针"这个术语,但是严格的说,它即不包含地址,行为也不象指针,说得干脆点,那就是"指向类成员函数的指针"并非指针.尽管这个术语有很大的迷惑性,但是就其含义来说,可以把一组同类型的函数抽象为一个"指向函数的指针",同样的道理,可以把一组类中同类型的类成员函数抽象为一个"指向类成员函数的指针",两者是一致的"指向类成员函数的指针"和"指向函数的指针"有什么区别?从字面上就可以清楚的知道,前者是和类,对象相关的,而后者直接指向函数的地址我们首先复习一下"指向函数的指针"如何使用 ?

void print()

{

}

void (*pfun)(); //声明一个指向函数的指针,函数的参数是 void,函数的返回值是 void pfun = print; //赋值一个指向函数的指针

(*pfun)(); //使用一个指向函数的指针比较简单,不是吗?为什么*pfun 需要用()扩起来呢?因为*的运算符优先级比()低,如果不用 ()就成了 *(pfun())


"指向类成员函数的指针"比"指向函数的指针"就多了个类的区别:
struct CPoint
{
void plus(double x_, double y_){}
void minus(double x_, double y_){}
void mul(double x_, double y_){}
void dev(double x_, double y_){}
virtual void move(double x_, double y_){}
double x;
double y;
};
void Oper(CPoint* pPoint, void (CPoint::*pfun)(double x_, double y_), int x, int y)
{
(pPoint->*pfun)(x, y);
}
struct CPoint3d : public CPoint
{
void move(double x_, double y_){ }
};
int main(int argc, char* argv[])
{
CPoint pt;
void (CPoint::*pfun)(double x_, double y_);
int offset = 0;
pfun = &CPoint::plus;
offset = (int&)pfun;
(pt.*pfun)(10, 10);
Oper(&pt, pfun, 10, 10);
pfun = &CPoint::minus;
offset = (int&)pfun;
(pt.*pfun)(10, 10);
Oper(&pt, pfun, 10, 10);
pfun = &CPoint::move;
offset = (int&)pfun;
(pt.*pfun)(10, 10);
Oper(&pt, pfun, 10, 10);
CPoint3d pt3d;
void (CPoint3d::*p3dfun)(double x_, double y_);
p3dfun = &CPoint3d::move;
(pt3d.*p3dfun)(10, 10);
//p3dfun = pfun; //正确
//pfun = p3dfun; //错误
pfun = (void (CPoint::*)(double, double))p3dfun;
Oper(&pt3d, (void (CPoint::*)(double, double))p3dfun, 10, 10);
return 0;
}

void (CPoint::*pfun)(double x_, double y_);

这里是"指向类成员函数的指针"的声明,就是多了 CPoint::的限定

pfun = &CPoint::plus;

这里是"指向类成员函数的指针"的赋值,在赋值的时候必须用这种静态的方式

(pt.*pfun)(10, 10);

这里是"指向类成员函数的指针"的使用 ,记住,解引用必须有实际的 this 指针地址,因此必须用有地址的对象 pt 来解引用 ,.*的语法有些怪异,不过我宁愿把它拆解为 pt.和*pfun 两部分来理解

offset = (int&)pfun;

这里 offset=4198410,当然不同的项目 ,不同的编译器这个值是不同的,由此也可以知道,"指向类成员函数的指针"确实是一个指针,其实由 C++对象模型我们就应该知道这个结论了

,在 C++对象模型中,成员函数是全局的,并不属于对象有人想用这个值吗?或许可以用下面的代码:
void (CPoint::*pfun2)(double x_, double y_);
memcpy(&pfun2, &offset, sizeof(int));
Oper(&pt, pfun2, 10, 10);

不过,我还是忍不住奉劝各位,尽量不要直接使用这个值,这毕竟是编译器内部实现的细节,实在有太多的人喜欢这种黑客似的代码并四处炫耀,真正的"指向类成员函数的指针"的用法只应该包括声明 ,赋值和解引用

pfun = &CPoint::move;

注意到这里的 move 是虚函数,那么这里还支持虚函数的多态吗?没有问题,"指向类成员函数的指针"支持多态,当然了 ,代价是,这时候这个指针就必须扩展为一个结构了 ,C++为了

"指向类成员函数的指针"支持多态是要付出代价的

p3dfun = pfun; //正确

存在基类的"指向类成员函数的指针"到派生类的"指向类成员函数的指针"的隐式转换,其含义无疑是说基类的成员函数布局信息只是派生类中成员函数布局信息的一个子集,因此这样的转换应该是没有问题的,但是反过来呢?

//pfun = p3dfun; //错误

不存在派生类的"指向类成员函数的指针"到基类的"指向类成员函数的指针"的隐式转换,因为派生类中的成员函数并不一定能够在基类中找到"指向类成员函数的指针"基类和派生类的关系和"指向类对象的指针"基类和派生类的关系完全相反,就"指向类成员函数的指针"的本质来说,这是合理的,但是这样的话,我们就无法利用公共的 Oper 函数了 ,除非...

pfun = (void (CPoint::*)(double, double))p3dfun; //强制转换

我们做强制转换是可以的

Oper(&pt3d, (void (CPoint::*)(double, double))p3dfun, 10, 10);

而且也只有强制转换才可以利用公共的 Oper 函数了 ,这里的 Oper 调用的是 pt3d 中的 move

函数,没有错误的但是是否一定要这样做呢?这取决于程序员自己的选择

在linux上本地大模型部署与推理 您的Python脚本(客户端)可能在您的个人电脑上,而模型服务(服务器)在远程Linux服务器上。如果您的服务器有强大的NVIDIA GPU,并且您对性能有更高的要求(例如需要高吞吐量),vLLM是更好的选择。这种方式无需向公网暴露服务器端口,而是通过加密的SSH通道将服务器的端口“映射”到您的本地电脑上。我们将启动一个API服务器,它会加载您指定的模型,并等待您的代码前来调用。如果您直接在SSH窗口运行上面的命令,一旦您关闭窗口,服务就会停止。这是根据您的原始代码修改的版本,适配本地vLLM服务。 阅读详情

相关推荐

避开这些坑!baostock获取股票数据时最容易犯的5个错误(Python实战)

本文针对使用Python和baostock库获取股票历史数据时常见的五大陷阱,提供了实战解决方案。重点剖析了登录状态验证、参数配置、数据解析、批量操作效率及数据一致性校验等关键环节,帮助开发者构建稳健高效的数据获取流程,避免因细节疏忽导致的数据错误或性能瓶颈。

websocket5live的博客 1441

C++必知必会之(16)指向成员函数的指针并非指针

1、获取非静态成员函数的地址时,得到的不是一个地址,而是一个指向成员函数的指针。 class Shape  {     public:         //.....         void moveTo (Point   newLocation );         bool validate ( )    const;         virtual bool draw( )

woshibendangao的专栏 913

STM32F407+LWIP实战:手把手教你移植mbedtls库实现Modbus TCP双向认证

本文详细介绍了如何在STM32F407微控制器上移植mbedtls库,结合LWIP协议栈实现Modbus TCP的双向认证功能。通过TLS 1.2加密通道,有效提升工业物联网通信的数据安全性,涵盖证书管理、内存优化及性能调优等关键步骤,为嵌入式系统开发者提供了一套完整的解决方案。

weixin_28721917的博客 516

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

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

QuitePig的专栏 626

计组实验5:cache大小测量与 cache line 大小测量

前言 今天做了实验5,通过 c 语言测 cache 参数。其实按理来说挺简单的,只是我们班没给代码,纯靠自己。听说别的班有给代码 emm 因为《深入理解计算机系统》这本书上面给的代码是 Linux 平台下的,而且需要一个 fcyc2 头文件,可以在 https://github.com/fabiensanglard/CpuCacheMountainViewer 这里找到。 ⚠ 我没有在 Linux 下试过课本上面的代码。。。 我是在 win10 下测试的。。。 所以 。。。 我并不确定我的代码是否正确。

AKGWSB 's blog 1万+

Cadence Sigrity

目录 一、PowerSI 1、PowerSI仿真前设置 2、PowerSI提取S参数 (1)检查叠层 (2)选择需要提取的走线和GND (3)设置端口 (4)设置提取频率和提取方式 (5)运行仿真 一、PowerSI PowerSI是一个交流分析工具,适用于频域仿真。 S参数提取 电源阻抗提取 全波参数提取 阻抗、耦合检查 谐振分析 1、PowerSI仿真前设置 打开PCB文件: 打开后如图: 设置为单色后: 仿真前的设置:

fang_yang_wa的博客 3万+

指向类成员函数的指针(转)

原文:https://blog.youkuaiyun.com/jinjinClouded/article/details/5189540?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2&utm_source=distribute.pc_relevant.none-task-blog...

weixin_42525096的博客 806

基于stm32的数控恒压恒流电源设计方案

基于stm32的数控恒压恒流电源设计方案 基于stm32的数控恒压恒流电源设计方案 不包实物,可自己动手制作,可代做 本设计采用220V市电输入工频变压器,将220V交流电压降为24V交流电压,经过全桥整流加电容滤波,输出约32V直流电压.可调输出电压方案采用线性稳压调整器方案,即运放处于比较调整状态,运放输出驱动P型MOS管,电压输出端由电阻分压反馈至运放同相输入端,运放反相输入端由STM32单片机控制TLC5615数模转换器输入模拟电压,根据运放构成比较器原理,运放的同相端和反相端始终趋向于电压相等的特

m0_72265581的博客 7222

恼人的函数指针(二):指向类成员的指针

前面曾写过一篇恼人的函数指针(一),总结了普通函数指针的声明、定义以及调用,还有函数指针数组,函数指针用作返回值等。但是作为C++的研读,我发现我漏掉了一个最重要的内容,就是指向类成员的指针,这里将做相应补充(相关代码测试环境为vs 2010)。 指向类成员的指针总的来讲可以分为两大类四小类(指向数据成员还是成员函数,指向普通成员还是静态成员),下面一一做介绍: 一、指向类的普通成员的指针(非...

weixin_30872337的博客 350

20 硬件工程师笔面试高频考点真题解析——寄存器

摘要: 寄存器是由多个边沿触发的D触发器组成的多位存储单元,用于同步时序电路中的数据暂存、隔离毛刺、跨时钟域同步等。选型需考虑位宽、触发方式(边沿/电平)、异步控制、电气参数等。核心时序参数包括建立时间(Tsu)、保持时间(Thold)和时钟输出延迟(Tco)。寄存器广泛应用于时序逻辑、流水线分割、毛刺消除、跨时钟域同步及计数分频等场景。同步复位依赖时钟边沿,时序易收敛但需时钟支持;异步复位独立于时钟,上电可靠但需注意亚稳态风险。

XU157303764的博客 1342

PaddleOCR全版本完整指南:从入门到精通,全面解析安装部署与高级应用

摘要 本文详细介绍了PaddleOCR的完整安装与使用指南。首先讲解了环境准备步骤,包括Python 3.11虚拟环境创建和PaddlePaddle框架的CPU/GPU版本安装。接着介绍了PaddleOCR库的安装方式,可选功能模块(文档解析、信息抽取、翻译等)及其依赖组。通过示例代码演示了PPStructureV3文档解析功能的基本用法,并提供了安装验证方法。最后针对常见问题(Windows中文用户名报错、模型下载问题)给出解决方案。文章为从入门到精通的PaddleOCR用户提供了全面的技术指导。

算法工程师 1366

指向类成员函数的指针其实并非指针

与常规指针不同,一个指向成员的指针并不指向一个具体的内存位置,它指向的是一个类的特定成员,而不是指向特定对象里的特定成员。通常最清晰的做法是将指向数据成员的指针看做一个偏移量。这个偏移量告诉你,一个特定成员的位置距离对象的起点有多少个字节。 给定一个成员在类内的偏移量,为了访问位于那个偏移量的数据成员,我们需要该类的一个对象的地址。这时候就需要.和->的操作。pC->*pimC,请求将pC内的地址加

zjwson的博客 585

三极管、MOS管和晶体管综合对比——《器件手册--三极管、MOS管和晶体管》

IGBT(Insulated Gate Bipolar Transistor,绝缘栅双极型晶体管)是一种复合全控型电压驱动式功率半导体器件,结合了MOSFET的高输入阻抗、开关速度快的优点和双极型晶体管(BJT)的低导通压降、高电流密度的优点。例如,在NPN型三极管中,当基极电流增加时,集电极电流会按照一定的比例(放大倍数β)增加,这个比例通常在几十到几百之间。在NMOS管中,当栅极相对于源极的电压(Vgs)小于开启电压(Vth)时,漏极和源极之间没有导电沟道,电流无法通过,处于截止状态。

XU157303764的博客 2881

Pointers to Class Members Are Not Pointers(指向类成员函数的“指针”并非指针)

Item 15. Pointers to Class Members Are Not PointersPointers to Class Members:指向类成员的指针注:本条中只涉及到非静态的数据成员--------------------------------------------------------1、类成员的指针之声明: class C {  public:    //.

magicminglee's Blog 870

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

指向类成员的指针并非指针

指向类成员的指针并非指针     对于指向类成员的指针,必须紧记,指向类成员(非static)的指针并非指针。     1、与常规指针不同,一个指向成员的指针并不指向一个具体的内存位置,它指向的是一个类的特定成员, 而不是指向特定对象里的特定成员。通常最清晰的做法,是将指向数据成员的指针看作为一个偏移量。 这个偏移量告诉你,一个特定成员的位置距离对象的起点有多少

ljianhui的专栏 1544

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

指向类成员/函数的指针

C++扩展了指针在类中的使用,使其可以指向类成员,这种行为是类层面的,而不是对象层面的。 指向类成员/函数的指针的本质并不是取地址.而是利用了对象地址的偏移量 我们创建了一个类,假设我们要使用指针指向类中的成员 class Student { public: Student(string n,int nu):name{n},num{nu}{} void dis(int idx) {...

alex1997222的博客 6588

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

C++类成员函数指针使用介绍

前言 在之前写过的博客中有介绍过函数指针和指针函数的区别和简单用法(文章在这里),当时的Demo非常简单,都是C语言的写法,但是当在C++中直接像C那样使用类成员函数指针时就会报错:reference to non-static member function must be called 所以如果是C++中的成员函数指针其使用方法是有区别的,这里针对不同的场景做个补充说明。 类成员函数的指针(非...

luoyayun361的专栏 2万+

C++指向类成员函数的指针

     最近在开发中用到了函数指针,于是想整理了一下有关函数指针的概念。O(∩_∩)O~     首先 函数指针是指向一组同类型的函数的指针;而类成员函数我们也可以相似的认为,它是指向同类中同一组类型的成员函数的指针,当然这里的成员函数更准确的讲应该是指非静态的成员函数。前者是直接指向函数地址的,而后者我们从字面上也可以知道 它肯定是跟类和对象有着关系的。     函数指针实例:ty

Charon 1万+

详解函数指针和类成员函数指针

作者:倾夜·陨灭星尘 一.什么是函数指针? 函数指针,顾名思义即指向函数的指针。 如果要问,为什么能用一个指针指向一个函数呢?我觉得要理解这个问题,以及要理解后面的函数指针和类成员函数指针,没有什么比从计算机原理的角度来理解更容易了。这里就简要回顾一下相关知识。 众所周知,计算机(图灵机)执行程序的基本流程就是:取指令->执行指令->取下一条指令->……。取指令的位置由一个寄存器PC决定。

yyx112358的博客 1万+

C++指向类成员函数的指针详细解析

转自 首先 函数指针是指向一组同类型的函数的指针;而类成员函数我们也可以相似的认为,它是指向同类中同一组类型的成员函数的指针,当然这里的成员函数更准确的讲应该是指非静态的成员函数。前者是直接指向函数地址的,而后者我们从字面上也可以知道 它肯定是跟类和对象有着关系的。 typedef int (*p)(int,int);//定义一个接受两个int型且返回int型变量的函数指针类型 int fun...

janeqi1987的专栏 6382

对象数组和指向对象的指针 指向类成员的指针

1 对象数组               对象数组是指数组元素为对象的数组。这种对象数组与其它数据类型的数组定义方式相同。如:         X a[10];        它创建了一个对象数组a,有10个数组元素,每个数组元素a [i]都是一个对象,所以,需要10次调用构造函数。         C++语言不允许初始化对象数组,所以要创建一个类的对象数组,这个类必须具备以下三个条件

sky_clara的专栏 9628

对象数组和指向对象的指针 指向类成员的指针

1 对象数组               对象数组是指数组元素为对象的数组。这种对象数组与其它数据类型的数组定义方式相同。如:         X a[10];        它创建了一个对象数组a,有10个数组元素,每个数组元素a [i]都是一个对象,所以,需要10次调用构造函数。         C++语言不允许初始化对象数组,所以要创建一个类的对象数组,这个类必须具备以下三个条件

SzMing 2324

关于C++指向类成员函数的指针

疑惑:不知用处 解释: //全局函数 void fun1() {} void fun2() {} class D { //类成员函数 public: void fun1() {} void fun2() {} }; int main() { void(*point1)() = fun1;//指向全局函数,ok //void(*point3)() = &amp;D::fun1;/...

River的博客 3671

指向类成员的指针的用处

看了C++ Primer中“指向类成员的指针”一节,虽然觉得用这东西写出来代码挺炫,但不用它同样可以实现相同的功能。 于是我没有相处来用“指向类成员的指针”到底有什么好处,或者说在什么地方最好使用之,还是说它就只是一个噱头。 baidu了很多帖子,发现很多朋友也都有相同的疑问

站在巨人的肩膀上 1720

C++指向类成员的函数指针

定义:类成员函数指针(member function pointer),是 C++ 语言的一类指针数据类型,用于存储一个指定类具有给定的形参列表与返回值类型的成员函数的访问信息。基本上要注意的有两点:1、函数指针赋值要使用 & 2、使用 .* (实例对象)或者 ->*(实例对象指针)调用类成员函数指针所指向的函数 下面看两个例子:对于 nonstatic member function (非静态成员函数)取地址,获得该函数在内存中的实际地址对于 virtual function(虚函数), 其地址在编译时期

weixin_43488671的博客 3892

C++ 函数指针 & 类成员函数指针

一、函数指针 函数存放在内存的代码区域内,它们同样有地址.如果我们有一个int test(int a)的函数,那么,它的地址就是函数的名字,这一点如同数组一样,数组的名字就是数组的起始地址。 1、函数指针的定义方式:data_types (*func_pointer)( data_types arg1, data_types arg2, ...,data_types argn); 例如:

小邓笔记 2万+
上一篇: 计算星期几的方法
下一篇: 使 64位ubuntu 支持32位程序
Dable_cn
博客等级 码龄18年 4粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值