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

基于AQS驱动的ReentrantLock公平锁和非公平锁实现原理解析 本文通过代码调试分析了ReentrantLock的可重入特性及其底层AQS实现机制。重点解析了: 通过state变量记录锁重入次数,加锁时CAS递增,解锁时递减; 以NonfairSync为例展示了非公平锁的直接抢锁逻辑; 揭示了AQS通过volatile state变量和CAS操作实现同步状态管理; 完整跟踪了lock()/unlock()方法的执行流程,说明AQS是JUC锁工具的底层基础。 阅读详情

Item 15. Pointers to Class Members Are Not Pointers


Pointers to Class Members:指向类成员的指针

注:本条中只涉及到非静态的数据成员
--------------------------------------------------------
1、类成员的指针之声明:
 class C {
  public:
    //...
    int a_;
 };
 int C::*pimC; //指向类C成员的指针,这里只是声明

2、类成员的指针之含义:
 
 类成员的指针用“指针”这个词来描述很容易引起混淆,因为类成员的指针和指针的含义大相径庭:
指针包含地址;而类成员的指针并不涉及到内存地址,它只是引用了一个类的某个成员,而不是一个具体的对象的某个成员,类没有内存地址,因此类成员的指针也不能指向内存的某个地方,它通常只是一个偏移量(offset)。然而由于标准C++没有定义类成员的指针的实现,因此各个编译器厂家的实现也不尽相同,但大多数是用一个整数来表示这个偏移量。

  pimC = &C::a_;   //获取成员a_在C中的偏移量,如果a_为静态成员则pimC指向C::a_的地址;如果a_为非静态成员则pimC代表此非静态成员在类当中的偏移量(一个整形的值)
 
3、访问偏移量对应的数据成员
  C aC;
  C *pC = &aC;
  aC.*pimC = 0;    //*pimC应用到了C的每一个对象上
  int b = pC->*pimC;
  有了一个类成员的偏移量,为了取得在这个偏移量上的数据成员,我们就需要该类的一个对象的地址。于是,“.*”和“->*”就粉墨登场了。
  aC.*pimC的含义: 访问对象aC在偏移量为pimC上的数据成员
  pC->*pimC的含义: 访问指针pC指向的对象在偏移量为pimC上的数据成员

4、当继承出现后……
  在继承体系中,子类对象的指针可以隐式的转换位父类对象的指针,反之需要显示的转换。
  但类成员的指针转换规则恰恰相反。
  不用奇怪,大家都遵循同一的规则:父类有的子类肯定有,子类有的父类未必有。
 
 class Shape {
    //...
    Point center_;
    //...
};
class Circle : public Shape {
    //...
    double radius_;
    //...
};

Point Circle::*loc = &Shape::center_; // OK
//double Shape::*extent =&Circle::radius_; // error!     

成员指针类型的转换必须要先用成员指针的类型变量把它存储,然后再把成员指针类型转换成其他的类型(最好时转换成int*)

还是举个例子吧:

 

#define MEMBER_OFFSET(type, member) ((unsigned long) (&((type*)0)->member))

Point

{

    //...

    int x,y,z....;

    //

};

 

int Point::* pim;

int main()

{

    Point obj;

    pim = &Point::z;   //关键

    //int *tmp = (int *) &Point::z;  这个是怎么转也转不过来的

    printf("&obj.z= %p/t&obj+&Point::z = %p/n", &obj.z, reinterpret_cast<char *>(&obj) + *(char *)(&pim));

    //第二种方式转换

    unsigned log = MEMBER_OFFSET(Point, z);

    printf(("&obj.z= %p/t&obj+&Point::z = %p/n", &obj.z, reinterpret_cast<char *>(&obj) + log );

    return 0;

}

 

2025年数学建模国赛高教社杯A题、B题、C题、D题、E题详细思路和代码 模型||插值与拟合 核心思想:构造一个精确通过所有已知离散数据点(xi, yi)的函数y = f(x),并以此函数来估算或预测未知点的值。基本假设:我们认为已知的数据点是100%精确、无误差的(或者误差可忽略不计),比如理论计算值、高精度仪器测量值等。我们的目标是“还原”或“重建”出点与点之间的真实函数关系。关键特征精确性:曲线或曲面必须穿过每一个样本点。局部性:插值结果严重依赖于局部数据点的分布和数值。用途:用于“补全”数据、填充缺失值、进行函数近似等。常见方法多项式插值:拉格朗日插值、牛顿插值。 阅读详情

相关推荐

海康威视iVMS-4200在银河麒麟系统部署全攻略与疑难排解

在信创国产化进程中,软件兼容性是关键挑战之一。以安防监控领域广泛使用的海康威视iVMS-4200客户端为例,其从Windows环境迁移到银河麒麟等国产操作系统时,面临架构适配、依赖库匹配等核心兼容性问题。这涉及到跨平台软件部署的通用原理:不同CPU架构(如ARM的飞腾、x86的兆芯)和操作系统底层API的差异,要求软件必须进行针对性编译和优化。解决这类问题的技术价值在于保障专业软件在国产化环境中的稳定运行,是信创产业落地的重要环节。具体到应用场景,如在基于银河麒麟V10的安防监控项目中,通过获取对应架构的.

weixin_33423874的博客 1447

Item 15.指向类数据成员的指针

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

力为的博客 1318

Pytest 常见问题及其解决方案

Pytest 是一个强大且灵活的测试框架,但初学者在使用过程中难免会遇到各种问题。希望通过这篇文章,你能更好地应对常见的挑战,写出更高效、更稳定的测试代码。测试不是负担,而是保障。写好测试不仅能提高代码质量,还能让你在面对变更时更加从容自信。

qq_52137592的博客 900

2021-07-08 stm32f103 点灯错误

#define PERIPH_BASE ((unsigned int)0x40000000) #define APB2PERIPH_BASE (PERIPH_BASE + 0x10000) #define GPIOA_BASE (APB2PERIPH_BASE + 0x800) typedef unsigned int uint32_t; typedef unsigned short uint16_t; typedef struct { uint32_t CRL; uint32_t CRH;

fl19372的博客 1450

Pytorch入门实战(7):基于BERT实现文本隐喻二分类(Kaggle入门题目)

Bert入门实战,文本二分类问题

iioSnail的博客 4055

Android Studio 简单生成so文件并调用过程解决

网上其他借鉴写的步骤都不全,中间还有很多错误要去一点点解决。我把完整版的方法写出来,供大家参考。 1、什么是NDK? 通俗的讲NDK就是编译类似C、C++写的代码供android调用的工具。 2、什么是JNI?为什么使用JNI? JNI的全称是Java Native Interface,它提供了若干的API实现了Java和其他语言的通信(主要是C和C++)。JNI的目的是使java方法能够...

dcju002的专栏 1436

具身大小脑全栈全网独家复现|LLM链式推理+边缘VLA感知+毫秒级运动小脑、优化人形步态僵硬运动滞后、打通思考-行走-操作全链路适配居家工业多场景落地

高层决策大脑(异步10Hz,GPU算力):轻量化机器人微调LLM+RhinoVLA边缘视觉大模型,负责自然语言链式工序拆解、全局环境语义感知、目标物体筛选、跨机器人动作适配,输出粗粒度运动目标,不介入底层伺服计算;依托View Registry实现异构机器人动作对齐,适配多形态机器人切换;中层调度小脑(硬实时1kHz,CPU算力)

qq_36130719的博客 255

Env问题记录以及知识点

逢场作戏 终究是客

钞sir的博客 4031

【ubuntu24.04】auto remove后,重启,kernel panic ,please reboot your computer vfs unable to mount root fs

Ubuntu 24.04系统在运行auto remove后出现内核恐慌(kernel panic)无法启动,显示"VFS: unable to mount root fs"错误。该问题是由于当前内核被清除导致系统无法挂载根分区。解决步骤包括:1)尝试用GRUB菜单中的旧内核启动;2)在GRUB中临时编辑启动参数;3)使用Ubuntu启动盘进行chroot修复;4)使用Boot-Repair工具一键修复。成功启动后,需要重新安装linux-generic等元包,重建initramfs并更新

突围 1212

2026.1.11:WSL2中Ubuntu发行版的完全卸载干净指南

摘要:本文详细介绍在WSL2中彻底卸载Ubuntu发行版的步骤。首先通过wsl -l -v确认安装的发行版,使用wsl --terminate终止运行后,推荐使用wsl --unregister命令完全删除发行版(包括所有数据)。还可手动检查残留文件位置(如%LOCALAPPDATA%目录),并提供了备份建议(使用wsl --export)。最后说明验证卸载的方法和可选的高级重置操作。整个过程确保彻底清理相关数据并释放磁盘空间。(

拥抱具身智能,昇腾Ascend C 2393

C语言指针学习与使用

C语言指针学习与使用 计算机存储 想要更好的使用指针,需要对计算机的存储有一定的概念和了解。下面的图片中展示了计算机的硬件结构: 存储设备除了上述的主存储器外,还有其他的一些在执行程序时可能会用到的存储设备,并根据各自的特点对其进行了层次划分: 使用主存储器进行数据存储时,如果每次存储都要编程人员准确找到存储单元的物理地址,那么不仅增加了工作量而且降低了工作效率。此时就有了虚拟内存的概念。 CPU在执行数据的读、写操作时,拿到的是虚拟地址,然后通过内存管理单元(MMU,Memory Managemen

Goallegoal的博客 932

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

指向类成员的指针(Pointers to Class Members)

<br />原文 http://old.blog.edu.cn/user2/wanglina/archives/2006/1241853.shtml <br /> 类成员的类型<br />指向成员函数的指针必须与向其赋值的函数类型匹配,不是两个而是三个方面都要匹配:1 .参数的类型和个数   2 .返回类型 3 .它所属的类类型<br />普通函数指针和成员函数指针:<br />函数指针存储函数的地址,可以被用来直接调用那个函数。成员函数指针首先必须被绑定在一个对象或者一个指针上,才能得到被调用对象的thi

生命不息, 战斗不止! 1038

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

指向类成员的指针 (pointers to class members)

很少看到指针的这种用法,下面借助MSDN开始介绍介绍.Pointers to Class MembersThese pointers define a type that points to a class member of a particular type. Such a pointer can be used by any object of the class type or a

zhangmiaoping23的专栏 1336

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

 Pointers to Class Members:指向类成员的指针

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

青青的专栏--C/C++ OOA/D Design Pattern 962

Using smart pointers for class members

1.  Using smart pointers for class members http://stackoverflow.com/questions/15648844/using-smart-pointers-for-class-members Question: I'm havingtrouble understanding the usage of smart pointers a

企鹅的自我修养 986

::* (The pointers to class members)

class A{public: int i; void f(){}};int main(void){ int A::*pvar = &A::i;    // (a) void (A::*pfunc)() = &A::f;    // (b) system("pause"); return 0;} 在ISO-IEC 14882 (2003)标准上,关于pointers to members的

Mind Mining ™ 2190

C++成员数据指针底层揭秘:从内存偏移到虚继承寻址

在C++编程中,指针是访问和操作内存的核心机制,它直接关联到对象的内存布局与寻址原理。普通指针存储的是绝对内存地址,而成员数据指针则是一种相对偏移的表示形式,它封装了成员变量在类对象内部的字节偏移信息,需要通过对象实例结合才能完成最终寻址。这种设计使得C++能够支持复杂的数据封装和继承体系,其技术价值在于实现类型安全的成员泛型访问,常用于序列化框架、反射机制和ORM映射等需要动态访问对象成员的场景。在单继承情况下,成员指针通常简化为一个偏移量;而在多继承和虚继承等复杂场景中,它需要携带额外的索引信息以应对基

dielucuan8830的博客 448

C++学习系列五:Classes(I)||uniform initialixzation||Pointers||struct||union

Classes(I) Classes are an expanded concept of data structures : like data structures, they can contain data members, but they can also contain funcitons as members. An object is an instantiation of a class. In terms of variables, a class would be the typ..

漫步量化 485

AQS学习

AQS(AbstractQueuedSynchronizer)是Java并发包的核心框架,用于构建锁和同步器(如ReentrantLock、Semaphore等)。其核心原理基于CLH队列变体:当共享资源空闲时分配线程,被占用时通过队列管理阻塞线程。AQS通过int类型的state变量表示同步状态,提供CAS原子操作保障线程安全。CLH队列采用虚拟头节点和原子操作实现高效入队/出队,并通过prev/next链接处理取消和唤醒机制。条件变量使用相同节点但独立队列。AQS的灵活设计使其成为Java并发编程的基础

ywl470812087的博客 967

CPU 缓存 | 原理、映射、一致性

……

u013669912的博客 410

Rage(PC) Modding Notes 狂怒 (pc)制作模组 指南 一

从rage狂怒的mod笔记资料来看中看的出来,跟doom3和quake3的很多东西已经完全不一样了,我觉得乃是在doom3源代码的基础之上,不断的改进,基本上大部分都改动过了 ________________________________________ Rage(PC) Modding Notes ___________________________

tailiangliang的专栏 7936

MYSQL SQL 执行系列2

-> open_and_process_table (为 Table_ref 获取 MDL 锁并打开表或视图)|-> open_table (对于基表)-> open_table (对于基表)所以open_table是真正打开一个的地方(视图、派生表、临时表有其他处理函数)。是 MySQL 服务器中的核心分发函数。它接收已经解析并填充好的LEX结构(语法树),根据的值(如等),调用相应的内部处理函数完成实际的数据操作、元数据变更或管理命令。该函数位于之后,是查询执行流程的最终入口。

Piemon&Anokata的博客 299

C++ 数据结构 9 大查找算法实战:从折半查找到散列表,LeetCode 真题解析

本文深入解析C++中9大经典查找算法,包括折半查找、散列表等,结合LeetCode真题进行实战演练。通过详细的代码实现和性能对比,帮助开发者掌握高效查找技术,提升编程题解决能力,适用于算法实训和技术面试准备。

weixin_33997389的博客 456
上一篇: 类中的static data member以及static member functions的用法
下一篇: 常对象与常成员函数的关系
bical
博客等级 码龄20年 13粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值