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

c++之指向类成员的指针 1. 指向成员变量的指针 - 定义格式 § 数据类型 类名::*指针名 § 例如 int A::*pParam; - 赋值/初始化 § 数据类型 类名::*指针名 = &类名::非静态数据成员 § int A::*pParam = &A::param - 解引用 § <类对象名>.*<非静态数据成员指针> § <类对象指... 阅读详情

最近在开发中用到了函数指针,于是想整理了一下有关函数指针的概念。O(∩_∩)O~

首先 函数指针是指向一组同类型的函数的指针;而类成员函数我们也可以相似的认为,它是指向同类中同一组类型的成员函数的指针,当然这里的成员函数更准确的讲应该是指非静态的成员函数。前者是直接指向函数地址的,而后者我们从字面上也可以知道 它肯定是跟类和对象有着关系的。

函数指针实例:

typedef int (*p)(int,int);//定义一个接受两个int型且返回int型变量的函数指针类型
int func(int x,int y)
{
printf("func:x=%d,y=%d/n",x,y);
return (x<y?x:y);
}

int main()
{
p fun=func;//定义函数指针并给它赋上一个函数指针
cout<<"min:"<<(*fun)(4,5)<<endl;//为什么*fun需要用()扩起来呢?因为*的运算符优先级比()低,如果不用()就成了*(fun())
return 0;
}

而“指向类成员函数的指针”却多了一个类的区别:

class A
{
public:
int func(int x,int y)
{
printf("A::func:x=%d,y=%d/n",x,y);
return (x<y?x:y);
}
};
typedef int (A::*p)(int,int);//指针名前一定要加上所属类型类名 A::的限定

int main()
{
p fun=&A::func;
A a; //因为成员函数地址的解引用必须要附驻与某个对象的地址,所以我们必须创建某个对象。
cout<<"min:"<<(a.*fun)(4,5)<<endl;
return 0;
}

嘿嘿。。只是用起来 .* 感觉怪怪滴。

接下来 我们可以再扩展一下下:

#include <tchar.h>
#include <iostream>
#include <stdio.h>
using namespace std;


class A
{
public:
int func1(int x,int y)
{
printf("A::func:x=%d,y=%d/n",x,y);
return (x<y?x:y);
}
virtual int func2(int x,int y)
{
printf("A::func:x=%d,y=%d/n",x,y);
return (x>y?x:y);
}
};
class B:public A
{
public:
virtual int func2(int x,int y)
{
printf("B::func:x=%d,y=%d/n",x,y);
return (x+y);
}

};
typedef int (A::*p)(int,int);//指针名前一定要加上所属类型类名 A::的限定
typedef int (B::*p0)(int,int);

int main()
{
A a; //因为成员函数地址的解引用必须要附驻与某个对象的地址,所以我们必须创建某个对象。
B b;
p fun=&A::func1;

cout<<(a.*fun)(4,5)<<endl;
cout<<(b.*fun)(4,5)<<endl<<endl;

fun=&A::func2;
cout<<(a.*fun)(4,5)<<endl;//请注意这里调用的是虚函数,嘿嘿 还真神奇 类成员函数指针也支持多态。
cout<<(b.*fun)(4,5)<<endl<<endl;


//fun=&B::func2; //这样式错误滴,因为不存在派生类的"指向类成员函数的指针"到基类的"指向类成员函数的指针"的隐式转换
fun=(int (A::*)(int,int))&B::func2;//应该进行强制转换
cout<<(a.*fun)(4,5)<<endl;
cout<<(b.*fun)(4,5)<<endl<<endl;

p0 fun0=&B::func2;
cout<<(a.*fun)(4,5)<<endl;
cout<<(b.*fun)(4,5)<<endl<<endl;

fun0=&A::func2; //正确,因为这里进行了隐式转换
cout<<(a.*fun)(4,5)<<endl;
cout<<(b.*fun)(4,5)<<endl<<endl;

//从上面我们不难发现 指向类成员函数的指针基类和派生类的关系和指向类对象的指针基类和派生类的关系完全相反,
//基类成员函数的布局被认为是派生类成员函数布局的一个子集
return 0;
}

接下 是有关模板类的类成员函数指针的使用

实例如下:

#include <tchar.h>
#include <iostream>
#include <stdio.h>
using namespace std;


class A
{
public:
int func(int x,int y)
{
printf("A::func : x=%d,y=%d/n",x,y);
return (x<y?x:y);
}
};
class B
{
public:
int func(int x,int y)
{
printf("B::func : x=%d,y=%d/n",x,y);
return (x>y?x:y);
}
};

template<class T>
class C
{
public:
T c;
void Print()
{
int (T::*p)(int,int)=&T::func;
(c.*p)(4,5);
}
};

int main()
{
C<A> ca;
C<B> cb;

ca.Print();
cb.Print();
return 0;
}
从上面 可以很清晰地看到。。其实它和普通的模板没有什么区别。。只不过将限定名称该为参数名酒OK啦。。。

嘿嘿。。。

 


C++中的类成员函数指针及其应用 C++中的类成员函数指针是一种特殊的指针类型,可以指向类的成员函数,并通过指针来调用这些成员函数。通过声明、初始化指针以及使用指针来调用成员函数,我们可以实现一些高级的功能,如回调函数、事件处理和动态调用等。在C++中,类成员函数指针是一种特殊的指针类型,它可以指向类的成员函数,并且可以在需要的时候通过指针来调用这些成员函数。本文将详细介绍C++中的类成员函数指针的用法,并提供相应的源代码示例。一旦指针指向了类的成员函数,就可以使用指针来调用该函数。首先,需要定义一个类的对象,并使用指针来调用成员函数。 阅读详情

相关推荐

C++ 指向类的指针

一个指向 C++ 类的指针与指向结构的指针类似,访问指向类的指针的成员,需要使用成员访问运算符。,就像访问指向结构的指针一样。与所有的指针一样,您必须在使用指针之前,对指针进行初始化。...

小天狼星_布莱克 的博客 360

C++ 类成员指针

成员指针是 C++ 引入的一种新机制,是指向类成员的指针,你可以使用它们来访问类的成员变量和成员函数,包括公有、私有和保护成员。它的申明方式和使用方式都与一般的指针有所不同。成员指针分为成员变量指针和成员函数指针。

Doublelv 的博客专栏。 8991

DNN加速器脉动阵列轻量级瞬时故障检测

本文系统综述了面向深度神经网络(DNN)脉动阵列加速器的轻量级瞬时故障检测技术。通过分析比较算法级校验(ABFT)、数值异常监测(剪裁、中值滤波等)、硬件编码检错(AN码、剩余码)以及选择性冗余等方案,指出这些方法能以5%-10%的开销实现对权重和激活比特翻转的高效检测,远低于传统ECC/冗余计算的成本。研究显示,结合多种轻量技术可构建多层防护体系,在保障推理可靠性的同时保持加速器的高性能特性。该成果为安全关键领域的DNN加速器设计提供了重要参考。

欢迎交流! 1074

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

C++扩展了指针在类中的使用,使其可以指向类成员,这种行为是类层面的,而不是对象层面的。 指向类成员/函数的指针的本质并不是取地址.而是利用了对象地址的偏移量 我们创建了一个类,假设我们要使用...

weixin_45596153的博客 503

【JavaSE】之流程控制与方法

Java基础之Java流程控制与方法相关知识介绍~

小新要变强的博客 5799

海康VisionMaster零代码开发实战:从PLC工程师到视觉专家的捷径

本文为PLC工程师提供了利用海康VisionMaster视觉平台实现零代码视觉开发的实战指南。文章详细阐述了如何通过图形化流程设计替代传统编程,快速搭建视觉检测应用,并实现与PLC的无缝通讯,是工程师从设备控制迈向视觉系统集成的有效捷径。

weixin_29201859的博客 293

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

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

weixin_43488671的博客 3892

VirtualBox增强功能安装全指南:从下载到配置复制粘贴功能

本文详细介绍了VirtualBox增强功能的完整安装与配置流程,重点解决了虚拟机与主机间复制粘贴、文件拖放等核心协作难题。通过分步指南和故障排查,帮助用户在不同操作系统(如Windows、Linux)中实现无缝集成,提升虚拟化工作效率与体验。

weixin_29206669的博客 419

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

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

janeqi1987的专栏 6382

未来智能家居解决方案:AI应用架构师的前沿探索

当你加班到深夜回家时,门锁自动识别你的脚步声解锁,玄关灯渐亮成你最爱的暖光,空调早已调到25℃(你夏天的习惯温度),音箱播放着最近循环的爵士乐,茶几上的智能水壶烧好了温水——这不是科幻电影,而是未来智能家居的日常。如何让“冰冷的设备”变成“懂你的伙伴”。我们将深入探讨五大前沿技术(边缘AI、多模态融合、联邦学习、数字孪生、个性化推荐)的底层原理,用“家里的小管家”“邻居互相学习”等生活化比喻简化复杂概念,结合代码示例与架构图还原实现流程,并通过智能卧室、智能厨房等真实案例展示落地路径。

AI天才研究院 1411

Windows Server安装Intel I219-V网卡驱动完整教程

在Windows Server系统上安装Intel I219-V网卡驱动的方法。

小白成长历程 5180

关于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

uniapp [全端兼容] - 详细实现引入使用 Google 谷歌地图显示及搜索城市地点,提供地图标点、地址搜索、定位导航、中文显示及汉化、地图打位置标点显示、搜索框搜索功能、省市区详细经纬度数据等

uniapp,h5移动端网页,微信小程序,Android,苹果ios,app,nvue,谷歌地图,官方,谷歌官方文档,googlemap,申请key,uniApp谷歌地图,详细使用教程,无法访问,集成谷歌地图,app引入谷歌地图,选点定位,地图导航,位置搜索,城市搜索,文字地点模糊查询,地点省市区详细数据,经纬度信息,markers地图标记点,一直报错怎么办,接入google地图不显示报错,谷歌地图插件,vue3,vue2,组件,Key申请流程,谷歌key怎么申请,api文档,网站打不开,用什么插件,在u

🏆 前端领域优质创作者 1万+

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

#include using namespace std; class A { public: void Setm(int i){m=i;} void Setn(int i){n=i;} void Disp() { cout<<“m=”<<m<<",n="<<n<<endl; } private: int m,n; }; int main(int argc, const char * argv[]) { void (A::*pfun) (int)

spursping的博客 179

使用菱FX5U系列PLC实现以太网通信的具体方法示例

接下来,我们将创建一个简单的CPU通信功能,以实现与其他设备的以太网通信。在上述代码中,我们首先设置访问号,然后创建一个数据读取命令(M_READ)和一个数据写入命令(M_WRITE)。此外,在实际应用中,您还需要确保PLC和其他设备之间的网络连接正常,并且遵循相应的通信协议。在上述代码中,我们执行了数据读取命令,并将接收到的响应存储在M_RESPONSE变量中。通过简单CPU通信功能,菱FX5U系列PLC可以实现与其他设备的以太网通信。我们将提供相应的源代码和详细的说明,以帮助您轻松实现这一功能。

DevCyberX的博客 1527

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

自考 C++ 杂记 —— 静态成员、const对象、指向类成员函数的指针

一、对象成员的初始化与静态成员 1.对象成员的初始化 对象成员构造函数的调用顺序:取决于在类中的说明顺序 析构函数的调用顺序与构造函数相反 2.静态成员 1)简单成员:声明中不含const、volatile、static的关键字函数 2)静态成员函数的特点: 七点和例子,见教材P108 3)成员名限定(动作):类 :: 数据成员/成员函数 4)类成员限定符(状态):“:: ” ...

Big Fish 大鱼 的个人博客 180

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

C++指向类成员(数据、函数)的指针

指向【类】的成员的指针包含两种: ★指向【类】的数据成员的指针 ★指向【类】的成员函数的指针 注意:指向的是【类的成员】,和类发生关系 ★★★指向非静态公有数据成员的指针,在定义时必须和类相关联,在使用时必须和对象相关联 1、指向类的数据成员的指针1.1 定义+初始化的格式: 数据类型 类型:: *指针名 = &类型:: 非静态公有数据

漫步云端 4382

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

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

在 C++ 中,指向类成员函数的指针是指向类或结构体成员函数的指针。它可以用于在该类或结构体的对象上调用成员函数。指向成员函数的指针使用作用域解析运算符(::)和取地址运算符(&)声明

xhchen的博客 313

C++中的回调函数——指向类成员的指针

C++中的回调函数   ——指向类成员的指针 在C中我们能够很容易地实现一个指向函数的指针,因此能够方便地实现函数的回调机制。但是在C++中很多人认为类的成员函数不能作为回调函数,因此很多C程序不能移植到C++上来。其实不是这样的,在C++中我们同样可以获取类的成员函数的指针,也能方便地实现函数回调机制。 下面先数一下C/C++中普通函数作为回调函数的情况,然后再说C++ 中类成员函

doufei_JLU_CCST_08 8145
上一篇: C++中实现C#属性相似的语法
下一篇: MFC消息映射宏展开后代码
梦之安魂曲
博客等级 码龄18年 81粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值