原文链接:http://www.cnblogs.com/AnnieKim/archive/2011/12/04/2275589.html

前面曾写过一篇恼人的函数指针(一)。总结了普通函数指针的声明、定义以及调用。还有函数指针数组。函数指针用作返回值等。可是作为C++的

研读。我发现我漏掉了一个最重要的内容。就是指向类成员的指针。这里将做对应补充(相关代码測试环境为vs 2010)。

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

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

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

简单的讲,指向类成员函数的指针与普通函数指针的差别在于。前者不仅要匹配函数的參数类型和个数以及返

回值类型,还要匹配该函数指针所属的类类型。总结一下,比較下面几点:

a)參数类型和个数

b)返回值类型

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

究其原因。是由于非静态的成员函数必须被绑定到一个类的对象或者指针上,才干得到被调用对象的this指针。

然后才干调用指针所指的成员函数(我们知道。全部类的对象都有自己数据成员的拷贝,可是成员函数都是共

用的。为了区分是谁调用了成员函数,就必须有this指针,this指针是隐式的加入到函数參数列表里去的)。

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

声明:与普通函数作为区分。指向类的成员函数的指针仅仅须要在指针前加上类类型就可以,格式为:

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

赋值:仅仅须要用类的成员函数地址赋值就可以,格式为:

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

注意:这里的这个&符号是比較重要的:不加&。编译器会觉得是在这里调用成员函数,所以须要给出參数列

表,否则会报错。加了&,才觉得是要获取函数指针。这是C++专门做了差别对待。

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

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

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

(既然是指针, 无论是数据类型的指针。 还是函数指针, 无论是普通函数指针还是类函数成员指针。 都应该依照

习惯加一个&去取地址符, 只是对于普通函数, 编译器做了特殊的处理, 只是我本人觉得会让人误解, 全部东

西, 涉及到类的, 基本上都会有个类域; 当应引用指针的值的时候, 我们应该和普通的指针一样。 用*去引用

符。

提醒一下大家。 由于类的.和->运算符的优先级都高于去引用符*, 所以上面的能那么写, 不清楚的读者可

以做自己看看运算符的优先级.)

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

以下举个简单的样例就一目了然了:

class A;
typedef void (A::*NONSTATICFUNCPTR)(int);    //typedefclass A
{
public:void NonStaticFunc(int arg){nonStaticMember = arg;cout << nonStaticMember << endl;}
private:int    nonStaticMember;
};int main()
{NONSTATICFUNCPTR funcPtr = &A::NonStaticFunc;A a;(a.*funcPtr)(10);        //通过对象调用A *aPtr = new A;(aPtr->*funcPtr)(10);    //通过指针调用return 0;
}

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

成员函数搞懂了,数据成员也就easy了。仅仅要推断下面两点是否一致就可以:

a)数据成员类型

b)所属的类类型

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

class A;
typedef int(A::*NONSTATICDATAPTR);        //typedefclass A
{
public:A(int arg) :nonStaticMember(arg){}int    nonStaticMember;
};int main()
{NONSTATICDATAPTR dataPtr = &A::nonStaticMember;A a(10);cout << a.*dataPtr;        //通过对象引用A *aPtr = new A(100);cout << aPtr->*dataPtr;    //通过指针引用return 0;
}

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

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

类的静态成员和普通成员的差别在于,他们是不依赖于详细对象的。全部实例化的对象都共享同一个静态成员,

所以静态成员也没有this指针的概念。所以,指向类的静态成员的指针就是普通的指针。

看以下的样例就明确了:

typedef const int *STATICDATAPTR;
typedef int(*STATICFUNCPTR)();        //跟普通函数指针是一样的class A
{
public:static int StaticFunc() { return staticMember; };static const int staticMember = 10;
};int main()
{STATICDATAPTR dataPtr = &A::staticMember;STATICFUNCPTR funcPtr = &A::StaticFunc;cout << *dataPtr;            //直接解引用cout << (*funcPtr)();return 0;
}

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

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

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

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

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

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

(完)

转载于:https://www.cnblogs.com/gcczhongduan/p/5411598.html

恼人的函数指针(二)相关推荐

  1. 函数指针--全局函数指针与类的函数指针(二)

    本次对之前的说明做个补充,大体内容还是一样的. 这里对类里面的成员函数指针变量的使用继续进行了解,最主要的是希望能达到通过非静态成员指针变量来引用各自的非静态成员函数. 这样每个实例可以保存当前对象对 ...

  2. 恼人的函数指针(一)

    这篇是为了加深记忆所写.发现,很多知识若不经过反复的琢磨和动手实践,是很难记得住的. 1)  函数指针的初始化. 函数如下: 1 int CompareString(const string& ...

  3. 【转载】恼人的函数指针(一)

    本文转载自: http://www.cnblogs.com/AnnieKim/archive/2011/11/20/2255813.html#undefined> 这篇是为了加深记忆所写.发现, ...

  4. C++函数指针使用总结

    一 函数指针介绍 函数指针指向某种特定类型,函数的类型由其参数及返回类型共同决定,与函数名无关.举例如下: int add(int nLeft,int nRight);//函数定义 该函数类型为int ...

  5. 函数指针和函数指针数组

    文章目录 一.函数指针 二.函数指针数组 三.应用:两个数的加减乘除运算 感谢阅读,如有错误请批评指正 一.函数指针 数据在内存中都有自己的地址,地址需要指针变量来保存,我们常见的指针有char* . ...

  6. C语言程序设计 | 指针(二):常量指针和指针常量、数组参数和指针参数、函数指针数组

    指针的进阶(二)目录: 常量指针和指针常量 数组参数和指针参数 函数指针数组 常量指针和指针常量 在我们日常中,经常会用到一个关键字const const是一个C语言(ANSI C)的关键字,具有着举 ...

  7. C语言基础知识之define宏定义表达式,undef,内存对齐,a和a的区别,数组知识点,int (*)[10] p,二维数组参数与二维指针参数,函数指针数组,常见的内存错误及对策

    一.用define宏定义表达式 1.定义一年有多少秒: #define SEC_A_YEAR 60*60*24*365 //上述描述不可靠,没有考虑到在16位系统下把这样一个数赋给整型变量的时候可能会 ...

  8. 木老师教笨笨课堂——系列讲座(从函数指针到委托) 二、C语言里的函数指针...

    二.C语言里的函数指针 上一节里介绍了回调函数,模块A提供了该函数 然后模块A调用B B再返过来调用A提供的函数,再处理最后返回结果给A.晕了.还是画个图.一般调用情况: 图2-1 有回调函数的调用情 ...

  9. C语言指针这一篇够了(一万二千字,包含指针与数组,函数指针等详解)

    目录 零.前言 一.指针的定义 二.指针类型的意义 1.指针类型决定了指针解引用时一次访问几个字节. 2.指针类型决定了指针加减整数时的步长 三.野指针 1.未初始化的指针 2.指针的越界访问 3.指 ...

最新文章

  1. Android 修改手机hosts域名 (绑定host域名 )
  2. 熟悉和理解linux编程环境,熟悉Linux环境和编程0.doc
  3. python反爬虫破解_python中绕过反爬虫的方法总结
  4. django06: ORM示例2--uer 与file
  5. Python NLP完整项目实战教程(1)
  6. ubuntu 创建Fdfs文件服务器
  7. html怎样设置图片的圆角矩形,怎么把矩形变成圆角 ps怎么在原来的矩形中改成圆角...
  8. c语言字符动画源码下载,C语言程序实例大全(220个精彩源码下载)
  9. matlab的方法定义变量,Matlab定义变量的操作步骤
  10. 数码管段码代码查询工具
  11. 启中教育:淘宝最有效的投诉电话号码?
  12. E-mail营销介绍
  13. 你的死工资,正在拖垮你一辈子需要花多少钱
  14. Windows电脑怎么查看自己的电脑是64位的?
  15. Civil 3D 2012 SP 2.1发布了
  16. 用Express重写前面的记事本
  17. 阿里云培训-OSS(对象存储)
  18. 【Unity 优化篇】 | 优化专栏《导航帖》,全面学习Unity优化技巧,让我们的Unity技术上升一个档次
  19. 阿里P8架构师深度概述分布式架构
  20. 使用有赞商城API新增商品

热门文章

  1. mysql数据库锁定机制
  2. 让英文版windows 8支持非Unicode程序的语言方法
  3. 在HYPER-V中利用差异磁盘和SYSPREP技术安装多个WINDOWS 2008
  4. button点击改变颜色_【干货】眉笔颜色要选对,三步教你选择正确眉色
  5. Verilog中for 语句怎么用
  6. 关闭计算机后自动开机的解决方法
  7. 一个具有多模型融合能力的网络或许是这样的
  8. 一名大神的github
  9. linux 手动释放buff/cache
  10. MD5 AES Des 加密解密