C/C++ 类成员函数指针 类成员数据指针
普通函数指针: "return_type (*ptr_name)(para_types) "
类成员函数指针: "return_type (class_name::*ptr_name)(para_types)"
类数据成员指针: "type class_name::* ptr_name";
C/C++:
class Demo
{
public:
Demo():data()
{ }
int data;
int show(int a,int b)
{
return a+b;
}
}; int main(int argc, char **argv)
{
Demo A;
Demo* B=new Demo;
//完成声明和赋值
int Demo::* int_ptr=&Demo::data;
//赋值完后没有数据信息,需要对象解引用获得数据
std::cout<<A.*int_ptr<<std::endl;
std::cout<<B->*int_ptr<<std::endl; //类成员函数指针
int (Demo::*ptr)(int,int)=&Demo::show;
std::cout<<(A.*ptr)(,)<<std::endl; return ;
}
STL算法有时需要使用类成员的函数,然而类成员函数指针不是可调用对象,functor<> bind mem_fn 各自方式不一,但是内部都是隐式传递this指针通过解引用来获取数据或调用函数
C/C++扩展:
//成员函数指针使用 class Screen
{
public:
enum ACTION
{
Up_, Down_, Left_, Right_
}; Screen() = default; Screen &Move(ACTION para)
{
return (this->*Menu[para])();
} private:
using Action=
Screen &(Screen::*)(); static Action Menu[]; Screen &Up()
{
std::cout << "Up" << std::endl;
return *this;
} Screen &Down()
{
std::cout << "Down" << std::endl;
return *this;
} Screen &Left()
{
std::cout << "Left" << std::endl;
return *this;
} Screen &Right()
{
std::cout << "Right" << std::endl;
return *this;
} }; Screen::Action Screen::Menu[]{&Screen::Up, &Screen::Down, &Screen::Left, &Screen::Right}; int main()
{
Screen obj;
obj.Move(Screen::Up_);
obj.Move(Screen::Down_);
obj.Move(Screen::Left_);
obj.Move(Screen::Right_);
obj.Move(Screen::Right_); return ;
} #include <iostream>
#include <vector>
#include <functional>
#include <algorithm>
#include <string> //类成员函数指针不是可调用对象,一般STL算法需要包装类成员函数指针为可调用对象
//这三种封装方式都是内部通过获得容器返回的对象, ".*" / "->*" 来调用;
//1.std::function<成员函数类型(第一个参数设置为对象本身类型)> fcn=&std::xxxx::xxx; 区别: 第一个参数是传入对象类型,根据容器是引用还是指针选择(.* / ->*)
//2.std::bind(&std::string::empty,std::placeholders::_1) 区别:可通过指针或者对象执行成员函数;
//3.std::mem_fn(&std::string::empty) C++11, 区别:可通过指针和对象执行成员函数
//4.可使用lamda调用; class Str
{
public:
std::string str; Str(const std::string &str_) : str(str_)
{ } Str(const char *str_) : str(str_)
{ } bool empty() const noexcept
{
return str.empty();
}
}; int main()
{ std::vector<Str> str_vec{"xa", "sad", "", "", "", "qqewhegr", "aqdq"}; std::function<bool(const Str &)> fn = &Str::empty; std::size_t empty_size_function=std::count_if(str_vec.begin(),str_vec.end(),fn); std::size_t empty_size_bind=std::count_if(str_vec.begin(),str_vec.end(),std::bind(&Str::empty,std::placeholders::_1)); std::size_t empty_size_mem_fn=std::count_if(str_vec.begin(),str_vec.end(),std::mem_fn(&Str::empty)); std::cout << empty_size_function << std::endl;
std::cout << empty_size_bind << std::endl;
std::cout << empty_size_mem_fn << std::endl; std::size_t size = std::count_if(str_vec.begin(), str_vec.end(), [](const Str& str) { return str.empty(); });
std::cout << size << std::endl; return ;
}
C/C++ 类成员函数指针 类成员数据指针的更多相关文章
- static 成员变量、static 成员函数、类/对象的大小
一.static 成员变量 对于特定类型的全体对象而言,有时候可能需要访问一个全局的变量.比如说统计某种类型对象已创建的数量. 如果我们用全局变量会破坏数据的封装,一般的用户代码都可以修改这个全局变量 ...
- C++类的成员函数(在类外定义成员函数、inline成员函数)
类的成员函数(简称类函数)是函数的一种,它的用法和作用和前面介绍过的函数基本上是一样的,它也有返回值和函数类型,它与一般函数的区别只是:它是属于一个类的成员,出现在类体中.它可以被指定为private ...
- mutable用于修改const成员函数中的成员变量
http://no001.blog.51cto.com/1142339/389840/ mutalbe的中文意思是“可变的,易变的”,跟constant(既C++中的const)是反义词. 在C++中 ...
- 【转】C++ const成员变量和成员函数(常成员函数)
转:http://c.biancheng.net/view/2230.html 在类中,如果你不希望某些数据被修改,可以使用const关键字加以限定.const 可以用来修饰成员变量和成员函数. co ...
- C++ const成员变量和成员函数(常成员函数)
在类中,如果你不希望某些数据被修改,可以使用const关键字加以限定.const 可以用来修饰成员变量和成员函数. const成员变量 const 成员变量的用法和普通 const 变量的用法相似,只 ...
- const成员函数可以将非const指针作为返回值吗?
先给出一段代码 class A { int *x; public: int *f() const { return x; } }; 成员函数f返回指向私有成员 x 的非常量指针,我认为这会修改成员x ...
- static成员函数和static成员
C++的静态成员是和类关联的,它属于某个类,但是不属于某个特定的对象.静态成员变量只存储一份供所有对象共用.所以在所有对象中都可以共享它.使用静态成员变量实现多个对象之间的数据共享不会破坏隐藏的原则, ...
- python装饰器的4种类型:函数装饰函数、函数装饰类、类装饰函数、类装饰类
一:函数装饰函数 def wrapFun(func): def inner(a, b): print('function name:', func.__name__) r = func(a, b) r ...
- Python入门之python装饰器的4种类型:函数装饰函数、函数装饰类、类装饰函数、类装饰类
一:函数装饰函数 def wrapFun(func): def inner(a, b): print('function name:', func.__name__) r = func(a, b) r ...
- C++空类产生哪些成员函数 || C++类可以自动生成的6个成员函数
class Empty { public: Empty(); // 缺省构造函数 Empty( const Empty& ); // 拷贝构造函数 ~Empty ...
随机推荐
- sql查询语句示例
今天没事又专门学习了一下sql查询语句,个人感觉太重要了,于是就找了网上的一个示例自己练了起来,感觉学到了很多,下面跟大家分享一下sql查询语句的示例操作. 首先,我建了5张表,分别如下: (a)学生 ...
- CF1096G Lucky Tickets
https://www.luogu.org/problemnew/show/CF1096G 显然dp出用\(\frac{n}{2}\)个数能拼出来的每个数的方案数,平方相加就行了,dp显然ntt+快速 ...
- libgdx学习记录22——3d物体创建
libgdx是一个强大的游戏框架,不仅支持2d部分,同时还支持3d部分. libgdx的3d部分投影主要通过PerspectiveCamera实现. 物体的显示过程: 1. 创建远景相机,角度一般设为 ...
- 在Windows商店应用中使用浅色主题
在开发商店应用时会遇到这样的情况,设计师给我们的设计是浅色背景/深色文本,而商店应用默认是深色背景/浅色文本.那我们需要在每个页面去显式声明背景色和前景色吗,这显然是不理想的.这时就需要设置应用的主题 ...
- java后台面试知识点总结
本文主要记录在准备面试过程中遇到的一些基本知识点(持续更新) 一.Java基础知识 1.抽象类和接口的区别 接口和抽象类中都可以定义变量,但是接口中定义的必须是公共的.静态的.Final的,抽象类中的 ...
- 20135202闫佳歆--week4 课本第5章学习笔记
第五章 系统调用 一.与内核通信 系统调用在用户控件进程和硬件设备之间添加了一个中间层,作用如下" 为用户空间提供了一种硬件的抽象接口 系统调用保证了系统的稳定和安全 每个进程都运行在虚拟系 ...
- Mac用户抓包软件Charles 4.0 破解 以及 抓取Https链接设置
相信大家曾经都是Window的用户,作为前端哪能没有一款抓包工具,抓包工具可以非常便捷的帮助我们分析接口返回报文数据,快速定位问题. 曾经横扫window用户的Fiddler便是我们的挚爱,然而,作为 ...
- C# 7中函数多值返回_转自InfoQ
本文要点 应遵循<.NET设计规范:.NET约定惯用法与模式>一书.和十年前第一版出版时一样,书中给出的原则在当前依然有指导意义. API设计是最重要的.设计不好的API会在极大地增加软件 ...
- vs2013的安装与使用 测试
vs2013软件我去年已经用过,可是当时只是鉴于对于c语言的编程,并没有觉得好用,况且好多的功能自并没有去深入研究,所以当时对于这个软件还是排斥的.安装的时候是别人帮我装的,所以并没有在安装的过程有问 ...
- Visual Studio2013安装过程
Visual Studio是微软开发的一套基于组件的软件开发工具,我选择安装的是Visual Studio2013版本.首先, 第一步是要找到一个安装包: 我们可以直接百度MSDN,显示的第一条就是官 ...