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

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

class test
{
public:
void Add(int){}
void Add(long){}
void get() {} }; auto pmf = &test::get; // 使用auto的前提是该函数不接受任何实参
void (test::*m_pf)(int) = &test::Add; // 指向int版本的Add
void (test::*m_pf1)(int) = test::Add; // 错误,成员函数和指针之间不存在自动转换规则 int main()
{
test t;
(t.*m_pf)(); // 注意不要忘了* return ;
}

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

class test
{
public:
void Add(int) { }
}; typedef void (test::*m_pf)(int);
m_pf m = &test::Add; using TestAdd = void (test::*)(int);
TestAdd m_testadd = &test::Add; int main()
{
test t;
(t.*m)();
(t.*m_testadd)(); return ;
}

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

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

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

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

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

std::vector<std::string> vec = {"test"};
bool b = std::bind(&std::string::empty, std::placeholders::_1)(*vec.begin()); // 正确
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. tmux 简单介绍

    不定期更新. 虽然一直很抵制使用linux,尤其是服务器那种无界面的东东,但是没办法还是得用.平时连接上服务器后每次要执行一个新的命令都得开一个新窗口重新连接服务器,不仅麻烦,而且有的时候服务器或者我 ...

  2. tar.gz压缩,查看,解压

    本次使用的压缩格式是*.tar.gz,用到的命令如下: 压缩: tar -czf jpg.tar.gz *.jpg //将目录里所有jpg文件打包成jpg.tar后,并且将其用gzip压缩,生成一个g ...

  3. ajax-hook

    // ==UserScript== // @name ajax hook 调试 // @namespace http://tampermonkey.net/ // @version 0.1 // @d ...

  4. asyncio之asyncio.run

    asyncio.run(coro, *, debug=False) python3.7加入,只能作为asyncio的入口函数.

  5. NTSC、PAL、SECAM三大制式简介

    NTSC.PAL.SECAM三大制式简介 NTSC.PAL和SECAM是全球三大主要的电视广播制式,这三种制式是不能互相兼容的,例如在PAL制式的电视上播放NTSC的视频,则影像画面将不能正常显示.下 ...

  6. struts2框架之OGNL(参考第三天学习笔记)

    ognl 1. 什么是ognl 对象图导航语言 Struts内置的表达式语言,它比EL要强大很多. ------------------ 2. 单独学习ognl * EL它操作的数据来自于:四大域:p ...

  7. 一道并查集的(坑)题:关闭农场closing the farm

    题目描述 in English: Farmer John and his cows are planning to leave town for a long vacation, and so FJ ...

  8. LabVIEW版本控制(转)

    原文转自https://www.cnblogs.com/EltonLiang/p/7105034.html 在我们工作中,必然会遇到代码的多个版本问题,也必然会遇到版本控制问题.如果所在的公司具有良好 ...

  9. 转载:UML学习(三)-----序列图(silent)

    原文:http://www.cnblogs.com/silent2012/archive/2011/09/14/2172219.html UML的模型中可分为两种,动态模型和静态模型.用例图.类图和对 ...

  10. linux 提高代码质量的工具

    很多IT公司对于软件开发都有严格的分工,这包括设计.测试.服务支持等等.但是,我一直都认为只有开发者才是真正对软件质量负责的人.没有好的软件设计,软件质量基本上是无从谈起.当然,要做到这一点是需要额外 ...