普通函数指针:  "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++ 类成员函数指针 类成员数据指针的更多相关文章

  1. static 成员变量、static 成员函数、类/对象的大小

    一.static 成员变量 对于特定类型的全体对象而言,有时候可能需要访问一个全局的变量.比如说统计某种类型对象已创建的数量. 如果我们用全局变量会破坏数据的封装,一般的用户代码都可以修改这个全局变量 ...

  2. C++类的成员函数(在类外定义成员函数、inline成员函数)

    类的成员函数(简称类函数)是函数的一种,它的用法和作用和前面介绍过的函数基本上是一样的,它也有返回值和函数类型,它与一般函数的区别只是:它是属于一个类的成员,出现在类体中.它可以被指定为private ...

  3. mutable用于修改const成员函数中的成员变量

    http://no001.blog.51cto.com/1142339/389840/ mutalbe的中文意思是“可变的,易变的”,跟constant(既C++中的const)是反义词. 在C++中 ...

  4. 【转】C++ const成员变量和成员函数(常成员函数)

    转:http://c.biancheng.net/view/2230.html 在类中,如果你不希望某些数据被修改,可以使用const关键字加以限定.const 可以用来修饰成员变量和成员函数. co ...

  5. C++ const成员变量和成员函数(常成员函数)

    在类中,如果你不希望某些数据被修改,可以使用const关键字加以限定.const 可以用来修饰成员变量和成员函数. const成员变量 const 成员变量的用法和普通 const 变量的用法相似,只 ...

  6. const成员函数可以将非const指针作为返回值吗?

    先给出一段代码 class A { int *x; public: int *f() const { return x; } }; 成员函数f返回指向私有成员 x 的非常量指针,我认为这会修改成员x ...

  7. static成员函数和static成员

    C++的静态成员是和类关联的,它属于某个类,但是不属于某个特定的对象.静态成员变量只存储一份供所有对象共用.所以在所有对象中都可以共享它.使用静态成员变量实现多个对象之间的数据共享不会破坏隐藏的原则, ...

  8. python装饰器的4种类型:函数装饰函数、函数装饰类、类装饰函数、类装饰类

    一:函数装饰函数 def wrapFun(func): def inner(a, b): print('function name:', func.__name__) r = func(a, b) r ...

  9. Python入门之python装饰器的4种类型:函数装饰函数、函数装饰类、类装饰函数、类装饰类

    一:函数装饰函数 def wrapFun(func): def inner(a, b): print('function name:', func.__name__) r = func(a, b) r ...

  10. C++空类产生哪些成员函数 || C++类可以自动生成的6个成员函数

    class Empty {     public:     Empty(); // 缺省构造函数     Empty( const Empty& ); // 拷贝构造函数     ~Empty ...

随机推荐

  1. 汇编 REPE/REPZ 指令,CMPSB指令

    知识点: REPE/REPZ 指令 CMPSB 指令 一.CMPSB //cmp //sub //SCASB//scasw//scasd cmp byte ptr [edi],al //对标志位的 ...

  2. MFC CTreeCtrl控件

    知识点: 认识CTreeCtrl CTreeCtrl控件属性 CTreeCtrl添加根项 CTreeCtrl添加子项 一.CTreeCtrl控件属性 先设置CTreeCtrl的属性: Has Line ...

  3. 通过C#的HttpClient模拟form表单请求

    post提交表单一般无非是一般text文本和文件类型,如下 <input type="file"/> <input type="text"/& ...

  4. git 跟踪提交记录

    一.克隆git仓库 git clone ssh://hwl@xxx/home/data/repositories/git.git 二.申明使用人信息,以便跟踪提交记录 $ git config --g ...

  5. libimobiledevice --Mingw32交叉编译

    本文只描述 windows环境下的使用情况,linux平台基本雷同. 一.配置编译环境. (1)操作系统 :Windows10 (64bit). (2)类unix环境:Cygwin(64bit) 下载 ...

  6. PAT甲题题解-1036. Boys vs Girls (25)-找最大最小,大水题

    题意:给出n个人的姓名.性别.ID.分数,让你找出其中哪个妹纸分数最高.哪个汉子分数最低.以及他们的差如果没有妹纸或者汉子,则对应输出Absent,差用NA代替. 就是for一遍找最大最小值,水题 # ...

  7. Linux内核分析——第一周学习笔记20135308

    第一周 计算机是如何工作的 第一节 存储程序计算机工作模型 1.冯·诺依曼结构模型:冯·诺依曼结构也称普林斯顿结构,是一种将程序指令存储器和数据存储器合并在一起的存储器结构.程序指令存储地址和数据存储 ...

  8. 记初学net-SNMP

    自从弄完那个jsp的网盘(其实还是个烂摊子),这几天一直在研究snmp. 有需求就激发动力,对,人都是被逼出来的.五一这几天,天天搁这坐着,毫无头绪. 下面切入正题. 要做一个监控园区网在线数的平台, ...

  9. 第二个Sprint冲刺第六天

    第二个Sprint冲刺第六天

  10. 我与git“美妙”的一天

    今天是第一天使用git,苦不堪言,感觉服务器和自己都要爆炸了,弄了半天才马马虎虎会了一点,基本流程如下 1.在mukever.online注册用户 2.下载git for windows(一个客户端) ...