当前位置: 首页 > news >正文

指向类成员的指针的用处

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

看了C++ Primer中“指向类成员的指针”一节,虽然觉得用这东西写出来代码挺炫,但不用它同样可以实现相同的功能。

于是我没有相处来用“指向类成员的指针”到底有什么好处,或者说在什么地方最好使用之,还是说它就只是一个噱头。

baidu了很多帖子,发现很多朋友也都有相同的疑问,但都没有找到比较好的解释。

直到我这道这个帖子:

http://www.blogjava.net/codefans/articles/20034.html

找到了一个好处:对于类的静态成员函数,可以成为C里的回调函数。

其实之前写过的程序已经不经意用到过指向类静态成员函数的指针作为回调函数,只是自己当时未意识到这原来就是“指向类成员的指针”了...

转载如下:

重学C++2)——指向类成员的指针

指向类成员的指针,印象中似乎很少用到,重新学习C++的过程中,才发现自己是忽视了一个很重要的东东,以前我一直认为类的成员函数不能作为回调函数,所以很多C程序都始终无法移植到C++上来,现在才知道,这是对指向类成员的指针不了解的缘故。

1、指向非静态成员的指针

其实指向非静态的类成员的指针很容易,它们与普通指针唯一的区别是,他们受类的限制。如下:

class A
{
    int _val;
    int val();
};

int (A::*p_val) = &A::_val;
int ( A::*p_func )() = &A::val;

看到了吗,是的,和普通的指针的区别是,指向类成员的指针必须把类也一并带上,上面的例子中就是要把A::这个限定符一起戴上,然后?用法和普通指针一样的就是了。

2、指向静态成员的指针

指向静态成员的指针,声明的方式和普通指针完全一样,只是赋值的时候,还得加上类的限定符。为什么这样?我想可以这样来理解,对于非静态成员,其存在取决于类,类消亡的时候,非静态成员随之消亡,所以,其声明必须与类的限定符绑在一起,而静态成员对于类而言并无依附关系,所以,不需要类的限定符。如下:

class A
{
    static int _val;
    static int val();
};

int *p_val = &A::_val;
int (*p_func) = &A::val;

3、好处:

一个好处是,通过指向成员的函数指针,可以很轻松的调用各个成员函数了,另一个好处是,对于静态成员函数,可以成为C里的回调函数啦。

下面是一个例子,加深一下理解:

#include <iostream> 
#include <string> 
using namespace std; 

typedef void (*funchandler)(); 

void register_func(funchandler f) 
{ 
    cout << "register_func" << endl; 
    (*f)(); 
} 

class A 
{ 
public: 
    A() : _val( 0 ) { cout << "create A..." << endl; } 
    void test() { cout << "test..." << endl; } 
    void test1() { cout << "test1..." << endl; } 
    void test2() { cout << "test2..." << endl; } 
    int val() { return _val; } 
    static void test3() { cout << "test3..." << endl; } 
    int _val; 
private: 
}; 

int main() 
{ 
    A a; 
    int ( A::*p_val ) = 0; 
    p_val = &A::_val; 
    cout << "a.*p_val: " << a.*p_val << endl; 
    void (A::*p_func)(); 
    p_func = &A::test; 
    a.test(); 
    (a.*p_func)(); 
    p_func = &A::test1; 
    ( a.*p_func )(); 
    p_func = &A::test2; 
    ( a.*p_func )(); 
    void (* pp_func)(); 
    pp_func = &A::test3; 
    (*pp_func)(); 
    register_func( pp_func ); 
    return 0; 
}

转自:http://blog.csdn.net/kunp/archive/2005/10/17/505614.aspx

转载于:https://my.oschina.net/apoptosis/blog/82572

相关文章:

  • 关于KB2661254安装后,导致HTTPS不能正常访问
  • oracle substr+instr按分隔符取字串
  • PHP实战(2)
  • dhcp 中继代理配置
  • Windows Server 2008 R2修改远程桌面连接数
  • 经典的静态路由的实验
  • 学习jquery mobile
  • Hadoop学习01_Single Node Setup
  • 页面处理URL参数出现中文问题
  • php+mysql留言板代码
  • rup
  • 【一天一个shell命令】好管家--查看当前登录用户-w
  • Source Insight 常用设置和快捷键大全
  • 《面向模式的软件体系结构4-分布式计算的模式语言》读书笔记(1)--- 从混沌到结构(1)...
  • Ceylon M4 和 Ceylon IDE M4 发布
  • @angular/forms 源码解析之双向绑定
  • 【React系列】如何构建React应用程序
  • 230. Kth Smallest Element in a BST
  • Angular4 模板式表单用法以及验证
  • Apache的基本使用
  • CEF与代理
  • HomeBrew常规使用教程
  • JSONP原理
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • opencv python Meanshift 和 Camshift
  • php ci框架整合银盛支付
  • PHP 小技巧
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • webpack项目中使用grunt监听文件变动自动打包编译
  • 阿里云购买磁盘后挂载
  • 大快搜索数据爬虫技术实例安装教学篇
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 多线程 start 和 run 方法到底有什么区别?
  • 关于使用markdown的方法(引自CSDN教程)
  • 诡异!React stopPropagation失灵
  • 机器学习学习笔记一
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 前端学习笔记之观察者模式
  • 人脸识别最新开发经验demo
  • 湖北分布式智能数据采集方法有哪些?
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • ​比特币大跌的 2 个原因
  • #1014 : Trie树
  • $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • (2)MFC+openGL单文档框架glFrame
  • (8)STL算法之替换
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (八十八)VFL语言初步 - 实现布局
  • (附源码)基于SSM多源异构数据关联技术构建智能校园-计算机毕设 64366
  • (介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)
  • (全部习题答案)研究生英语读写教程基础级教师用书PDF|| 研究生英语读写教程提高级教师用书PDF
  • (原創) 如何安裝Linux版本的Quartus II? (SOC) (Quartus II) (Linux) (RedHat) (VirtualBox)
  • (轉貼) 2008 Altera 亞洲創新大賽 台灣學生成果傲視全球 [照片花絮] (SOC) (News)
  • .gitignore文件_Git:.gitignore