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 ...
随机推荐
- 20155339平措卓玛 Exp1 PC平台逆向破解(5)M
20155339平措卓玛 Exp1 PC平台逆向破解(5)M 实践内容 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数. 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖 ...
- C++自学成长之路(第一篇)
今天开始我将开启C++自学成长之路,今天是第一天,在以前就一直在网上查找关于c++的资料,想买一本好一点的,权威一点的资料书,通过努力查找,我选择了c++ primer,在网上这本书的好评如潮.更多的 ...
- 在sourceinsight中添加快速注释 Ctrl+/
1.搜索文件:utils.em(C:\Program Files (x86)\Source Insight 3)2.用sourceinsight打开文件:utils.em3.在文件末尾添加下面代码 m ...
- Hadoop日记Day16---命令行运行MapReduce程序
一.代码编写 1.1 单词统计 回顾我们以前单词统计的例子,如代码1.1所示. package counter; import java.net.URI; import org.apache.hado ...
- 蓝牙学习笔记三(Android Debug)
android 端可以通过两种方式去Debug: 一.在手机的设置功能里,开发者模式 Enable,如下图: http://blog.bluetooth.com/debugging-bluetoo ...
- Sqlserver_函数介绍
SQL2008 表达式:是常量.变量.列或函数等与运算符的任意组合. 1. 字符串函数 函数 名称 参数 示例 说明 ascii(字符串表达式) select ascii('abc') 返回 97 返 ...
- muduo网络库学习笔记(五) 链接器Connector与监听器Acceptor
目录 muduo网络库学习笔记(五) 链接器Connector与监听器Acceptor Connector 系统函数connect 处理非阻塞connect的步骤: Connetor时序图 Accep ...
- ats显示代理缓存
如果要将ats用作显示代理缓存,则必须配置客户端软件(即浏览器)以将请求直接发送到ats. 如果没有将ats配置为使用透明度选项(通过交换机或路由器在路由到源服务器的情况下拦截客户端请求并重新路由到a ...
- Beta版项目总结
1.设想与目标 我们的产品名是理财猫,为了解决当今大学生花钱不知道节制以及不知道花的钱都去哪了的痛苦,提醒他们该记录这一天的消费情况,我们有独特的办法那就是将记账软件和闹钟结合起来,每天定时的提醒用户 ...
- 框架-Spring
项目中都用到了Spring.Mybatis.SpringMVC框架,首先来谈一谈Spring框架,Spring框架以IOC.AOP作为主要思想. IOC----控制反转 IOC的全称为Inversio ...