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 ...
随机推荐
- linux AB web 性能测试工具
ab(选项)(参数) 选项 -A:指定连接服务器的基本的认证凭据: -c:指定一次向服务器发出请求数: -C:添加cookie: -g:将测试结果输出为“gnuolot”文件: -h:显示帮助信息: ...
- Unity利用SMSSDK实现短信验证码(附代码)
最近一直在研究如何给app更多实用性的功能,在app进行登录或者注册时,为了方便用户更加快捷的完成登录功能,所以就决定采用短信验证码的方式进行验证登录.在学习的过程中,先使用了Mob的短信服务进行短信 ...
- cocos2dx内存优化
纹理消耗了大量内存 在大部分情况下,是纹理(textures)消耗了游戏程序大量的内存.因此,纹理是我们首要考虑优化的对象 纹理加载 cocos2d里面纹理加载分为两个阶段:从图片文件中创建一个Ima ...
- MIT-6.828-JOS-lab3:User Environments
Lab 3: User Environments实验报告 tags:mit-6.828 os 概述: 本文是lab3的实验报告,主要介绍JOS中的进程,异常处理,系统调用.内容上分为三部分: 用户环境 ...
- k8s-rabbitmq-(一)集群部署
K8S版本:1.10.1 rabbitmq版本:3.6.14 从来没用过这个软件,所以对里面很多术语看不太懂.最后通过https://www.kubernetes.org.cn/2629.html 大 ...
- Mac OS系统 sublime text3 常用快捷键记录
个人觉得下面这些个常用的快捷键,还是有必要熟练使用的: 符号说明: ⌘:command ⌃:control ⌥:option ⇧:shift ↩:enter ⌫:delete cmd+n 新建文件(n ...
- PAT甲题题解-1008. Elevator (20)-大么个大水题,这也太小瞧我们做题者的智商了
如题... #include <iostream> #include <cstdio> #include <algorithm> #include <cstr ...
- PAT甲题题解1099. Build A Binary Search Tree (30)-二叉树遍历
题目就是给出一棵二叉搜索树,已知根节点为0,并且给出一个序列要插入到这课二叉树中,求这棵二叉树层次遍历后的序列. 用结构体建立节点,val表示该节点存储的值,left指向左孩子,right指向右孩子. ...
- 《Linux内核分析》第三周笔记 构造一个简单的Linux系统MenuOS
构造一个简单的Linux系统MenuOS 一.linux内核源代码简介 三大法宝(存储程序计算机.函数调用堆栈.中断)和两把宝剑(中断上下文的切换:保存现场和恢复现场.进程上下文的切换) 1.在lin ...
- Java 笔记——MyBatis 生命周期
1.MyBatis 的生命周期 MyBatis的核心组件分为4个部分. SqlSessionFactoryBuilder (构造器): 它会根据配置或者代码来生成SqISessionFactory,采 ...