指向类成员的指针

指向类成员函数的指针其实并非指针 对于指向类成员的指针,必须紧记,指向类成员(非static)的指针并非指针 立即下载

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

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

指向类成员的指针总的来讲可以分为两大类四小类(指向数据成员还是成员函数,指向普通成员还是静态成员),下面一一做介绍:

一、指向类的普通成员的指针(非静态)

1、指向类成员函数的指针

简单的讲,指向类成员函数的指针与普通函数指针的区别在于,前者不仅要匹配函数的参数类型和个数以及返回值类型,还要匹配该函数指针所属的类类型。总结一下,比较以下几点:

a)参数类型和个数

b)返回值类型

c)所属的类类型(特别之处)

究其原因,是因为非静态的成员函数必须被绑定到一个类的对象或者指针上,才能得到被调用对象的this指针,然后才能调用指针所指的成员函数(我们知道,所有类的对象都有自己数据成员的拷贝,但是成员函数都是共用的,为了区分是谁调用了成员函数,就必须有this指针,this指针是隐式的添加到函数参数列表里去的)。

明白了这点,接下来就简单了。

声明:与普通函数作为区分,指向类的成员函数的指针只需要在指针前加上类类型即可,格式为:

typedef 返回值 (类名::*指针类型名)(参数列表);

赋值:只需要用类的成员函数地址赋值即可,格式为:

指针类型名  指针名 = &类名::成员函数名;

注意:这里的这个&符号是比较重要的:不加&,编译器会认为是在这里调用成员函数,所以需要给出参数列表,否则会报错;加了&,才认为是要获取函数指针。这是C++专门做了区别对待。

调用:调用方法也很简单,针对调用的对象是对象还是指针,分别用.*和->*进行调用,格式为:

(类对象.*指针名)(参数列表);

(类指针->*指针名)(参数列表);

注意:这里的前面一对括号是很重要的,因为()的优先级高于成员操作符指针的优先级。

下面举个简单的例子就一目了然了:

复制代码
 1 class A;
 2 typedef void (A::*NONSTATICFUNCPTR)(int);    //typedef
 3 
 4 class A
 5 {
 6 public:
 7     void NonStaticFunc(int arg) 
 8     {
 9         nonStaticMember = arg; 
10         cout<<nonStaticMember<<endl;
11     }
12 private:
13     int    nonStaticMember;
14 };
15 
16 int main()
17 {
18     NONSTATICFUNCPTR funcPtr= &A::NonStaticFunc;
19 
20     A a;
21     (a.*funcPtr)(10);        //通过对象调用
22 
23     A *aPtr = new A;
24     (aPtr->*funcPtr)(10);    //通过指针调用
25 
26     return 0;
27 }
复制代码

2、指向类数据成员的指针

成员函数搞懂了,数据成员也就easy了,只要判断以下两点是否一致即可:

a)数据成员类型

b)所属的类类型

另外,声明、赋值还有调用方法等这些是和前面类似的,再举个例子吧:

复制代码
 1 class A;
 2 typedef int (A::*NONSTATICDATAPTR);        //typedef
 3 
 4 class A
 5 {
 6 public:
 7     A(int arg):nonStaticMember(arg){}
 8     int    nonStaticMember;
 9 };
10 
11 int main()
12 {
13     NONSTATICDATAPTR dataPtr= &A::nonStaticMember;
14     
15     A a(10);
16     cout<<a.*dataPtr;        //通过对象引用
17 
18     A *aPtr = new A(100);
19     cout<<aPtr->*dataPtr;    //通过指针引用
20 
21     return 0;
22 }
复制代码

运行结果,当然是各自输出10和100啦。

二、指向类的静态成员的指针

类的静态成员和普通成员的区别在于,他们是不依赖于具体对象的,所有实例化的对象都共享同一个静态成员,所以静态成员也没有this指针的概念。

所以,指向类的静态成员的指针就是普通的指针。

看下面的例子就明白了:

复制代码
 1 typedef const int *STATICDATAPTR;    
 2 typedef int (*STATICFUNCPTR)();        //跟普通函数指针是一样的
 3 
 4 class A
 5 {
 6 public:
 7     static int StaticFunc() { return staticMember; };
 8     static const int staticMember = 10;
 9 };
10 
11 int main()
12 {
13     STATICDATAPTR dataPtr = &A::staticMember;
14     STATICFUNCPTR funcPtr = &A::StaticFunc;
15     
16     cout<<*dataPtr;            //直接解引用
17     cout<<(*funcPtr)();    
18 
19     return 0;
20 }
复制代码

最后注明一下,显然的,要使用(&类名::成员名)获取指向成员的指针,首先这个成员必须是对外可见的哦,即public的,不然是没有权限获取的^^。


写到此,简单总结一下就是:

1)静态的和普通的函数指针没啥区别;

2)非静态的加一个类局限一下即可。

 

不知道以后还会不会有函数指针相关的内容,先到此完结吧。

有错误欢迎指正,我会及时修改^^。

(完)

分类:  C++
搭建微信机器人的方案都在这了! 功能超级强大,虽不支持二次开发,但已有的功能足够个人使用,可惜官方作品已被腾讯告死,好在市面上还流落着不少破解版,有需要的自行搜索。可惜的是,微信官方已不准许新的微信号再使用 web 登录,这就直接从源头扼杀了 web 协议的微信机器人,虽说老的微信号还是能凑合着用,不过部分功能也受限。所以,这些都属于 PC 端的微信机器人。无论是 PC 端还是手机端,用 hook 方式实现的最大缺点就是要和某一个版本的微信客户端进行绑定,如果框架本身不对最新版本的微信适配,那使用的时候就无法升级到最新版本的微信。 阅读详情

相关推荐

5.1 Tessent Atpg系列 第八章 Test Pattern Generation - Verify Test Pattern

为什么要做基于timing的仿真,意义在于可以比较ATPG工具和simulator工具的差异性。因为时序的差异导致不同的结果。首先你需要通过write_patern 这句cmd来写出pattern,默认是parallel 模式,除非你用-serial 指定写出serial, 因为serial 文件非常大,所以你可以使用-sample 开关写出部分pattern即可,工具会根据每一种pattern 类型都会至少保存一只。 另外,你也可以使用-start -end 开关来减少文件大小,但是这样的截取,是不可靠的

ciscomonkey的博客 7766

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

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

weixin_30872337的博客 350

onnxruntime-gpu版本选择与CUDA环境配置实战指南

本文是onnxruntime-gpu版本选择与CUDA环境配置的实战指南。针对AI模型部署中常见的GPU无法调用问题,核心在于确保onnxruntime-gpu版本与系统CUDA Toolkit版本严格匹配。文章详细讲解了如何精准确定CUDA版本、查找官方对应关系、执行正确安装命令,并通过完整测试脚本验证GPU是否成功启用,最后提供了常见问题排查与生产环境调优建议。

weixin_29164091的博客 525

C++类基础9——类成员指针

成员指针是指可以指向类的非静态成员的指针。一般情况下,指针指向一个对象,但是成员指针指示的是类的成员,而非类的对象。类的静态成员不属于任何对象,因此无须特殊的指向静态成员的指针,指向静态成员的指针与普通指针没有什么区别。成员指针的类型囊括了类的类型以及成员的类型。当初始化一个这样的指针时,我们令其指向类的某个成员,但是不指定该成员所属的对象:直到使用成员指针时,才提供成员所属的对象。为了解释成员指针的原理,我们定义下面这个类: 数据成员指针 和其他指针一样,在声明成员指针时我们也使用*来表示当前声明的

2301_80224556的博客 1588

fastbin attack快速入门

0x01 fastbin简介 Fastbin包含0x20~0x80大小bin的数组指针,用于快速分配小堆块。fastbin按照单链表结构进行组织,相同大小的bin在同一个链表中,fd指向下一个bin,采用LIFO(Last In First Out)机制。在fastbin中,堆块的inuse标志都为1,处于占用状态,防止chunk释放时进行合并,加快小堆块的分配。 正常fastbin的使用 通过这个简单的案例来了解fastbin的单链表结构,malloc和free的过程。 #include<stdio

abelxu 1571

DP_AUX辅助通道介绍

DisplayPort(简称DP)是一个由PC及芯片制造商联盟开发,视频电子标准协会(VESA)标准化的数字式视频接口标准。其中辅助通道(AUX)是一条独立双向半双工的传输通道,它也是一对差分信号线。其数据传输速率1Mbps,用来传输配置参数与指令。

cjie221的博客 5363

C++类成员指针

类成员指针

随手写下笔记和感悟 2295

实战指南:如何用Kamailio+FreeSWITCH搭建高并发企业通信系统(附配置模板)

本文提供了一份实战指南,详细介绍了如何利用Kamailio与FreeSWITCH构建高并发企业通信系统。通过将Kamailio作为高性能SIP信令平面处理路由与负载均衡,FreeSWITCH作为媒体与应用平面负责通话与业务逻辑,实现信令与媒体分离的电信级架构。文章深入解析了架构设计、核心配置、集群部署与性能优化,并附有配置模板,旨在帮助企业构建可水平扩展、高可用的通信解决方案。

dell8的博客 364

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

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

SzMing 2324

基于单目视觉的四旋翼定点降落——如何通过mavros控制pixhawk(二)

    一直拖了这么久没有更新,怪我太懒啦~~~ 今天要特别感谢舒仔仔同学,我的好队友帮我写了这篇博文。这篇文章主要讲了如何通过mavros来控制pixhawk。硬件逻辑是这样子,我们先搞一个odroid(土豪上TX2),再用usb线将odroid与pixhawk连接。所以,odroid发送控制指令来控制pixhawk飞行。pixhawk与外界的通信协议是mavlink。ROS下面有个包叫mavr...

zhengyuxin0507的博客 1万+

【GRASS GIS零基础入门教程】2.1:初识GRASS GIS软件

GRASS GIS是一个强大的计算引擎,用于栅格、矢量和地理空间处理。它支持地形和生态系统建模、水文、数据管理和图像处理。通过内置的时态框架和Python API,它可以进行高级时间序列分析和快速地理空间编程,并针对各种硬件配置的大规模分析进行优化。

智慧空间实验室 848

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

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

sky_clara的专栏 9628

基于STM32设计的消防小车

当前基于STM32单片机设计了一款智能消防小车;当前小车支持烟雾浓度检测、可燃气体检测,环境温度湿度检测、火焰源检测、能支持远程遥控,方便消防员远程操控进行灭火。小车也支持自动消防,在行驶过程中,消防智能小车通过火焰传感器感应火源以检测火焰具体位置,可以利用算法设计进行循迹灭火,该模式下驱动电机水泵喷水,可以有效控制火源的第二次发生,从而完成消防作业。小车本身带了超声波测距模块,红外壁障模块,在自动或者手动控制行驶过程中可以防止碰到障碍物损伤小车。

7377

指向类成员的指针的用处

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

站在巨人的肩膀上 1721

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

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

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

指向类成员/函数的指针

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

alex1997222的博客 6589

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

C++ 指向类成员的指针

【代码】C++ 指向类成员的指针。

ljy的博客 290

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

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

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

ljianhui的专栏 1544

13.6指向类成员的指针

1.普通函数指针不能付给类的成员函数;要用类指针调用类成员函数(不能满足三个条件1参数2返回值3他的类)2类成员指针:                     定义:                               指向值的类型 类名::* 指针名;                              short Screen::*ps_Screen=&Scree

zpx833的专栏 1400

理解C++类成员指针(指向类成员的指针)

C++编程:指向类成员的指针

ComputerInBook的专栏 547

指向类成员函数的指针

指向类成员函数的指针

SL1109 483
上一篇: 函数指针和指针函数以及函数指针数组
下一篇: 成员函数指针数组,处理函数中调用:
linuxheik
博客等级 码龄15年 865粉丝 135原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值