C++中指向成员的指针

  一个类有两种基本的成员:函数成员和数据成员。同样的,指向成员的指针也有两种:指向函数成员的指针和指向数据成员的指针。后则其实并不常用,因为类一般是不含有公共数据成员的,仅当用在继承用C写的代码时协调结构(struct)和类(class)时才会用到。

  指向成员的指针是C++语法中最难以理解的构造之一,但是这也是一个C++最强大的特性。它可以让你调用一个类的函数成员而不必知道这个函数的名字。这一个非常敏捷的调用工具。同样的,你也可以通过使用指向数据成员的指针来检查并改变这个数据而不必知道它的成员名字。

  指向数据成员的指针

  尽管刚开始时,指向成员的指针的语法会使你有一点点的迷惑,但你不久会发现它其实同普通的指针差不多,只不过是*号的前面多了::符号和类的名字,例:定义一个指向int型的指针:

int * pi; 
  定义一个指向为int型的类的数据成员:
int A::*pmi; //pmi是指向类A的一个int型的成员
  你可以这样初始化它:
class A
{
 public:
 int num;
 int x;
};
/*
  指向类数据成员的指针与普通指针的初始化及赋值方式不太一样,因为普通指针在给其初始化或赋值时,赋予的是一个实际的对象,如  int j; int *i=&j;
  而指向数据成员的指针赋予的是一个目前还不存在的一个类成员的地址,而这个地址只有在使用实际类对象进行调用时才会真正的确定下来,如下:
 */
 
int A::*pmi = & A::num; 
  上面的代码是声明一个指向类A的一个int型的num成员并将它初始化为这个num成员的地址.通过在pmi前面加上*你就可以使用和更改类A的num成员的值:
A a1, a2;
int n=a1.*pmi; //把a1.num赋值给n
a1.*pmi=5; // 把5赋值给a1.num
a2.*pmi=6; // 把6赋值给6a2.num
 
  如果你定义了一个指向类A的指针,那么上面的操作你必须用 ->*操作符代替:
A * pa=new A;
int n=pa->*pmi;
pa->*pmi=5;

  指向函数成员的指针

  它由函数成员所返回的数据类型构成,类名后跟上::符号、指针名和函数的参数列表。举个例子:一个指向类A的函数成员(该函数返回int类型)的指针:
 
class A
{
 public:
 int func ();
};
int (A::*pmf) ();
 
  上面的定义也就是说pmf是一个指向类A的函数成员func()的指针.实际上,这个指针和一个普通的指向函数的指针没什么不同,只是它包含了类的名字和::符号。你可以在在任何使用*pmf的地方调用这个函数
func():
pmf=&A::func;
A a;
(a.*pmf)(); //调用a.func()
  如果你先定义了一个指向对象的指针,那么上面的操作要用->*代替:
A *pa=&a;
(pa->*pmf)(); //调用pa->func()
  指向函数成员的指针要考虑多态性。所以,当你通过指针调用一个虚函数成员时,这个调用将会被动态回收。另一个需要注意的地方,你不能取一个类的构造函数和析构函数的地址。

C++基础之指向成员的指针相关推荐

  1. error C3867:非标准语法;请使用“”来创建指向成员的指针

    C++实战宝典 上一篇链接: C++使用vector容器遍历时迭代器失效问题 文章目录 一.问题描述 二.原因分析 三.解决方案 四.总结 新壁纸 一.问题描述 类成员函数作为函数参数出现error ...

  2. c++类对象的例子(非标准语法;请使用 ““ 来创建指向成员的指针,如何解决?)

    非标准语法:请使用 "&" 来创建指向成员的指针,如何解决? 在main.cpp中有问题 Game.cpp......#include "Game.h" ...

  3. error C3867: “XXX::XXX”: 非标准语法;请使用 ““ 来创建指向成员的指针。

    VS初学C++模板,想用C++写个栈,结果出现error C3867: "XXX::XXX": 非标准语法:请使用 "&" 来创建指向成员的指针. 因为 ...

  4. VS 常见问题之一:error C3867: “CRect::Width”:  函数调用缺少参数列表;请使用“CRect::Width”创建指向成员的指针

    最近找了本matlab和vs混合编程的书,想要实现matlab图形绘制在MFC界面上界面上,可能是书籍年限比较老,有些代码出现了错误,具体代码参考上篇博客,下面写下我解决这些问题的方法. 错误   1 ...

  5. 【数据结构基础】指向函数的指针

    文章目录 一.函数的指针 二.指向函数的指针变量 三.调用函数的两种方式 四.用指向函数的指针作函数参数(重点) 五.为什么要将指向函数的指针变量作为函数的形参(重点) 一.函数的指针 首先,函数名代 ...

  6. c/c++ 报错:非标准语法,使用&创建指向成员的指针的解决办法

    发生这种错误一般是因为使用了一些函数,而没有加括号导致的,这些函数一般没有参数,所以没有意识到错误. 例: string s; s.c_str; //报错 应该为 s.c_str();

  7. C++ Primer 5th笔记(chap 19 特殊工具与技术)成员函数指针

    1. 使用 classname::*的形式声明一个指向成员函数的指针. eg. / / pmf 是一个指针, 它可以指向 Screen 的某个常量成员函数 / / 前提是该函数不接受任何实参, 并且返 ...

  8. C++成员函数指针的应用

    转载:http://www.cppblog.com/colys/archive/2009/08/18/25785.html C++中,成员指针是最为复杂的语法结构.但在事件驱动和多线程应用中被广泛用于 ...

  9. c++中的类成员函数指针

    c++中的类成员函数指针 文章目录 c++中的类成员函数指针 发生的事情 正常的函数指针定义 定义类的成员函数指针 std::function 发生的事情 最近,想用一个QMap来创建字符串和一个函数 ...

最新文章

  1. c#泛型的使用[转]
  2. xml、 Dao service 三层参数以及对应关系
  3. python3 字符串前面加上'r'的作用
  4. 图解Matlab向量和向量运算
  5. vue 动态设置页面title
  6. es6 Set 结合 Array.from 用法
  7. [NHibernate]获取分组查询的记录总数
  8. Sequence II HDU - 5919(主席树)
  9. layer中嵌套的页面如何操作父页面_layui框架中layer父子页面交互详细解说
  10. loss低但精确度低_低光照图像增强网络-RetinexNet(model.py解析【2】)
  11. 京东自动下单软件_黄牛软件自动下单秒杀商品 警方用科技手段打击
  12. C语言重难点总结:printf和scanf
  13. php 横杠箭头,为什么我的箭头下面有一横线?
  14. c语言程序怎么实现模块化,【干货】教你如何对一个大的项目进行模块化编程...
  15. js如何实现扫描身份证识别_基于javascript实现根据身份证号码识别性别和年龄
  16. 各种学习资料链接 干货 啃啃啃
  17. ps一点等于多少厘米_ps像素和厘米换算(ps100像素等于多少厘米)
  18. svg-path圆点沿路径跟随动画
  19. 几款百度竞价点击软件测评来一发
  20. mysql 安装没有my.cnf_Linux安装mysql没有my.cnf文件

热门文章

  1. python网上有免费资源吗_【转载】学习Python无从下手?最好的免费资源想要拿走...
  2. obj c和java_PKCS1-padding / RSA加密ios objc和java之间的区别
  3. 电镀面积计算机公式,电镀面积计算法.pdf
  4. C/C++中的复数介绍
  5. log nginx 客户端请求大小_后端实践:Nginx日志配置(超详细)
  6. php调用txt接口,PHP 如何更优雅地调用 API 接口
  7. CentOS 6.7 配置 yum 安装 nginx
  8. 调试小技巧---利用调用堆栈
  9. Oracle 基础之数据库管理
  10. Apache配置--用户认证(针对目录访问)-update2015-05-02