1.当我们初始化一个成员指针或为成员指针赋值时,该指针并没有指向任何数据。成员指针指定了成员而非成员所属的对象,只有当解引用成员指针时,我们才提供对象信息。

2.和普通的函数指针类似,如果成员存在重载的问题,则我们必须显示地声明函数类型以明确指出我们想要使用的是哪个函数。和使用指向数据成员的指针一样,我们使用 .* 或者 ->*运算符作用于指向成员函数的指针。

  1. class test
  2. {
  3. public:
  4. void Add(int){}
  5. void Add(long){}
  6. void get() {}
  7.  
  8. };
  9.  
  10. auto pmf = &test::get; // 使用auto的前提是该函数不接受任何实参
  11. void (test::*m_pf)(int) = &test::Add; // 指向int版本的Add
  12. void (test::*m_pf1)(int) = test::Add; // 错误,成员函数和指针之间不存在自动转换规则
  13.  
  14. int main()
  15. {
  16. test t;
  17. (t.*m_pf)(); // 注意不要忘了*
  18.  
  19. return ;
  20. }

3.使用类型别名或typedef可以让成员指针更容易理解。

  1. class test
  2. {
  3. public:
  4. void Add(int) { }
  5. };
  6.  
  7. typedef void (test::*m_pf)(int);
  8. m_pf m = &test::Add;
  9.  
  10. using TestAdd = void (test::*)(int);
  11. TestAdd m_testadd = &test::Add;
  12.  
  13. int main()
  14. {
  15. test t;
  16. (t.*m)();
  17. (t.*m_testadd)();
  18.  
  19. return ;
  20. }

4.从指向成员函数的指针获取可调用对象的一种方法是使用标准库模板function。通常情况下,执行成员函数的对象将被传给隐式的this形参。

  1. std::vector<std::string> vec = {"test"};
  2. std::function<bool(const std::string&)> fp = &std::string::empty;
  3. bool b = fp(*vec.begin()); // 可以理解为 (*vec.begin()).*fp();

5.mem_fn可以从成员指针生成一个可调用对象,和function不同的是,mem_fn可以根据成员指针的类型推断可调用对象的类型,而无须用户显示地指定。

  1. std::vector<std::string> vec = {"test"};
  2. bool b = std::mem_fn(&std::string::empty)(*vec.begin()); // 正确,使用 .* 调用对象
  3. b = std::mem_fn(&std::string::empty)(vec.begin()); // 正确,使用 ->* 调用对象

6.我们还可以使用binf从成员函数生成一个可调用对象,和function类似的地方是,必须将函数中用于表示执行对象的隐式形参转换成显示的。和mem_fn类似的是,bind生成的可调用对象的第一个实参既可以是指针也可以是引用。

  1. std::vector<std::string> vec = {"test"};
  2. bool b = std::bind(&std::string::empty, std::placeholders::_1)(*vec.begin()); // 正确
  3. b = std::bind(&std::string::empty, std::placeholders::_1)(vec.begin()); // 正确

C++ Primer 笔记——类成员指针的更多相关文章

  1. C/C++基础----特殊工具和技术 (重载new和delete,RTT,限定作用域的枚举类型,类成员指针,嵌套类,局部类,volatile,链接指示 extern “C”)

    重载new和delete 1调用operator new( 或new[])标准库函数分配足够大的.原始的.未命名的内存空间以便存储特定类型的对象 2编译器运行相应地构造函数以构造这些对象,并为其传入初 ...

  2. C++中的类成员指针

    写在前面:本博客为本人原创,严禁任何形式的转载!本博客只允许放在博客园(.cnblogs.com),如果您在其他网站看到这篇博文,请通过下面这个唯一的合法链接转到原文! 本博客全网唯一合法URL:ht ...

  3. C++ 类成员指针

    C++的类成员指针是一种奇葩的指针. 假设现在我们要表示一个三维的点,现在有两种定义方式: struct point1{ int x, y, z; }; struct point2{ int c[3] ...

  4. C++ Primer 笔记——类

    1.定义在类内部的函数是隐式的inline函数. 2.因为this的目的总是指向“这个”对象,所以this是一个常量指针,我们不允许改变this中保存的地址. 3.常量成员函数:允许把const关键字 ...

  5. C++类成员指针(指向类成员的指针)

    1.指向类的数据成员的指针: 声明格式如下: <类型说明符> <类名>::* <指针变量名>; 2.指向类的成员函数的指针: 声明格式如下:   <类型说明符 ...

  6. 成员指针与mem_fn

    本文是<functional>系列的第4篇. 成员指针是一个非常具有C++特色的功能.更低级的语言(如C)没有类,也就没有成员的概念:更高级的语言(如Java)没有指针,即使有也不会有成员 ...

  7. C++ Primer 有感(管理类的指针成员)

    C++类的指针成员与其他成员有所不同,指针成员指向一个内存地址,该地址的内存需要我没管理. 我现在分析一下为什么要管理指针成员. 有如下Student类,Student.h如下: [cpp] view ...

  8. C语言学习笔记之成员数组和指针

    成员数组和指针是我们c语言中一个非常重要的知识点,记得以前在大学时老师一直要我们做这类的练习了,但是最的还是忘记了,今天来恶补一下.     单看这文章的标题,你可能会觉得好像没什么意思.你先别下这个 ...

  9. C++的类成员和类成员函数指针

    类成员函数指针: 用于访问类成员函数,和一般函数指针有区别. 类成员函数处理的是类数据成员,声明类成员函数指针的同时,还要指出具体是哪个类的函数指针才可以.调用时也要通过对象调用. 而对于类的静态成员 ...

随机推荐

  1. SQL SERVER 2008 R2安装的时候提示“该实例名称MSSQLSERVER已在使用

    SQL SERVER 2008安装的时候提示“该实例名称已在使用”解决办法._冷雨玫瑰_新浪博客---和这文章描述差不多http://blog.sina.com.cn/s/blog_672b419f0 ...

  2. Python问题:UnboundLocalError: local variable 'xxx' referenced before assignment

    参考链接: http://blog.csdn.net/onlyanyz/article/details/45009697 https://www.cnblogs.com/fendou-999/p/38 ...

  3. 【逆向笔记】2017年全国大学生信息安全竞赛 Reverse 填数游戏

    2017年全国大学生信息安全竞赛 Reverse 填数游戏 起因是吾爱破解大手发的解题思路,觉得题挺有意思的,就找来学习学习 这是i春秋的下载链接 http://static2.ichunqiu.co ...

  4. const的引用

    const的引用 对常量的引用:把引用绑定到const对象上,就像绑定到其他对象上一样,不能被用作修改它所绑定的对象: ; const int &r1 = ci;//正确:引用及其对应的对象都 ...

  5. 2017 ACM/ICPC(北京)总结

    这个季节的,北京真的很冷. 下午的热身赛,我依然先去敲一道搜索题,但是很不幸这道搜索题坑点还是蛮多的,浪费了好长时间后依然没能A掉,期间Codeblocks崩溃一次使得代码完全丢失,在队友的建议下便暂 ...

  6. Linux就该这么学(3)-管道符、重定向与环境变量(学习笔记)

    1.Linux命令与文件读写操作有关的重定向技术: 学习目标:主要解决输出信息的保存问题. 标准覆盖输出重定向: 标准追加输出重定向 错误覆盖输出重定向 错误追加输出重定向 输入重定向 标准输入(ST ...

  7. GCC 编译优化指南【转】

    转自:http://www.jinbuguo.com/linux/optimize_guide.html 版权声明 本文作者是一位开源理念的坚定支持者,所以本文虽然不是软件,但是遵照开源的精神发布. ...

  8. FireDac 的一些应用提示

    FireDac 的一些应用提示: 1. 客户端 dataset 能用 TFDQuery 连接  dataset provider 获取数据 ? Can I use TFDQuery and conne ...

  9. pt-table-sync同步报错Called not_in_left in state 0 at /usr/bin/pt-table-sync line 5231【原创】

    试验环境MySQL5.7.19,自己使用pt-table-sync 3.0.2版本同步后,手动在从库执行后,在用pt-table-sync验证时报错 命令如下: pt-table-,u=用户名,p=, ...

  10. 设计模式C++学习笔记之二十(完结篇 & 面向对象原则)设计模式C++实例下载

      Prototype(原型模式) 20.1.解释 概念:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. main(),客户 ICloneableNow,只有一个接口Clone CM ...