C++ Primer 笔记——类成员指针
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 笔记——类成员指针的更多相关文章
- C/C++基础----特殊工具和技术 (重载new和delete,RTT,限定作用域的枚举类型,类成员指针,嵌套类,局部类,volatile,链接指示 extern “C”)
重载new和delete 1调用operator new( 或new[])标准库函数分配足够大的.原始的.未命名的内存空间以便存储特定类型的对象 2编译器运行相应地构造函数以构造这些对象,并为其传入初 ...
- C++中的类成员指针
写在前面:本博客为本人原创,严禁任何形式的转载!本博客只允许放在博客园(.cnblogs.com),如果您在其他网站看到这篇博文,请通过下面这个唯一的合法链接转到原文! 本博客全网唯一合法URL:ht ...
- C++ 类成员指针
C++的类成员指针是一种奇葩的指针. 假设现在我们要表示一个三维的点,现在有两种定义方式: struct point1{ int x, y, z; }; struct point2{ int c[3] ...
- C++ Primer 笔记——类
1.定义在类内部的函数是隐式的inline函数. 2.因为this的目的总是指向“这个”对象,所以this是一个常量指针,我们不允许改变this中保存的地址. 3.常量成员函数:允许把const关键字 ...
- C++类成员指针(指向类成员的指针)
1.指向类的数据成员的指针: 声明格式如下: <类型说明符> <类名>::* <指针变量名>; 2.指向类的成员函数的指针: 声明格式如下: <类型说明符 ...
- 成员指针与mem_fn
本文是<functional>系列的第4篇. 成员指针是一个非常具有C++特色的功能.更低级的语言(如C)没有类,也就没有成员的概念:更高级的语言(如Java)没有指针,即使有也不会有成员 ...
- C++ Primer 有感(管理类的指针成员)
C++类的指针成员与其他成员有所不同,指针成员指向一个内存地址,该地址的内存需要我没管理. 我现在分析一下为什么要管理指针成员. 有如下Student类,Student.h如下: [cpp] view ...
- C语言学习笔记之成员数组和指针
成员数组和指针是我们c语言中一个非常重要的知识点,记得以前在大学时老师一直要我们做这类的练习了,但是最的还是忘记了,今天来恶补一下. 单看这文章的标题,你可能会觉得好像没什么意思.你先别下这个 ...
- C++的类成员和类成员函数指针
类成员函数指针: 用于访问类成员函数,和一般函数指针有区别. 类成员函数处理的是类数据成员,声明类成员函数指针的同时,还要指出具体是哪个类的函数指针才可以.调用时也要通过对象调用. 而对于类的静态成员 ...
随机推荐
- This is a DynamicProxy2 error:
- 华为交换机配置NTP服务端/客户端
作者:邓聪聪 配置设备作为NTP服务器 单播客户端/服务器模式 # 配置NTP主时钟,层数为2. <HUAWEI> system-view [HUAWEI] ntp refclock-ma ...
- Boost多线程编程
Boost多线程编程 背景 • 今天互联网应用服务程序普遍使用多线程来提高与多客户链接时的效率:为了达到最大的吞吐量,事务服务器在单独的线程上运行服务程序: GUI应用程序将那些费时, ...
- why should the parameter in copy construction be a reference
if not, it will lead to an endless loop!!! # include<iostream> using namespace std; class A { ...
- SQL Server 之 内部连接
1.内部联接 2.外部联接 外部联接扩展了内部联接的功能,会把内联接中删除表源中的一些保留下来,由于保存下来的行不同,可将外部联接分为左联接和右联接. 2.1左联接: 如果左表的某一行在右表中没有匹配 ...
- 基于MVC 的Quartz.Net组件实现的定时执行任务调度
新建mvc项目之后,首先引用Quartz组件.工具-->NuGet包管理器-->管理解决方案的 NuGet包管理器 组件安装完成. Quartz.Net一个最简单任务至少包括三部分实现:j ...
- 30个mysql千万级大数据SQL查询优化技巧详解
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...
- JS 操作数组对象
我们在操作数组时,加入数组中是以对象的形式存在,例如: 那么我们会涉及到去重复,去掉为0的数组中的对象,js代码如下: function getItemList(gid, totalMoney, ad ...
- Stetho简化Android调试(一)
在开发 Android 应用的时候,有时候我们需要查看数据库.SharePreference等.通常的做法是把相关文件pull出来,而前提必须是手机得root.如果没有root,那就只能通过打印或其它 ...
- GDOI2018 涛涛摘苹果 [CDQ分治]
传送门我会让你知道哪里有题面吗(逃 思路 显然不能模拟苹果下掉的过程,考虑计算每个苹果对询问的贡献. 显然一开始就有的苹果可以看做第0天变出来的,于是只需要考虑变出来的苹果了. 设当前询问节点\(x\ ...