C/C++ 类成员函数指针 类成员数据指针

普通函数指针:  "return_type (*ptr_name)(para_types) "

类成员函数指针: "return_type (class_name::*ptr_name)(para_types)"

类数据成员指针: "type class_name::* ptr_name";

C/C++:

 1 class Demo
 2 {
 3 public:
 4     Demo():data(100)
 5     {
 6
 7     }
 8     int data;
 9     int show(int a,int b)
10     {
11         return a+b;
12     }
13 };
14
15
16
17 int main(int argc, char **argv)
18 {
19     Demo A;
20     Demo* B=new Demo;
21     //完成声明和赋值
22     int Demo::* int_ptr=&Demo::data;
23     //赋值完后没有数据信息,需要对象解引用获得数据
24     std::cout<<A.*int_ptr<<std::endl;
25     std::cout<<B->*int_ptr<<std::endl;
26
27
28     //类成员函数指针
29     int (Demo::*ptr)(int,int)=&Demo::show;
30     std::cout<<(A.*ptr)(1,2)<<std::endl;
31
32     return 0;
33 }

STL算法有时需要使用类成员的函数,然而类成员函数指针不是可调用对象,functor<> bind mem_fn 各自方式不一,但是内部都是隐式传递this指针通过解引用来获取数据或调用函数

C/C++扩展:

  1 //成员函数指针使用
  2
  3 class Screen
  4 {
  5 public:
  6     enum ACTION
  7     {
  8         Up_, Down_, Left_, Right_
  9     };
 10
 11     Screen() = default;
 12
 13     Screen &Move(ACTION para)
 14     {
 15         return (this->*Menu[para])();
 16     }
 17
 18 private:
 19     using Action=
 20     Screen &(Screen::*)();
 21
 22
 23     static Action Menu[];
 24
 25     Screen &Up()
 26     {
 27         std::cout << "Up" << std::endl;
 28         return *this;
 29     }
 30
 31     Screen &Down()
 32     {
 33         std::cout << "Down" << std::endl;
 34         return *this;
 35     }
 36
 37     Screen &Left()
 38     {
 39         std::cout << "Left" << std::endl;
 40         return *this;
 41     }
 42
 43     Screen &Right()
 44     {
 45         std::cout << "Right" << std::endl;
 46         return *this;
 47     }
 48
 49 };
 50
 51 Screen::Action Screen::Menu[]{&Screen::Up, &Screen::Down, &Screen::Left, &Screen::Right};
 52
 53
 54 int main()
 55 {
 56     Screen obj;
 57     obj.Move(Screen::Up_);
 58     obj.Move(Screen::Down_);
 59     obj.Move(Screen::Left_);
 60     obj.Move(Screen::Right_);
 61     obj.Move(Screen::Right_);
 62
 63
 64     return 0;
 65 }
 66
 67
 68
 69 #include <iostream>
 70 #include <vector>
 71 #include <functional>
 72 #include <algorithm>
 73 #include <string>
 74
 75 //类成员函数指针不是可调用对象,一般STL算法需要包装类成员函数指针为可调用对象
 76 //这三种封装方式都是内部通过获得容器返回的对象, ".*" / "->*" 来调用;
 77 //1.std::function<成员函数类型(第一个参数设置为对象本身类型)> fcn=&std::xxxx::xxx;   区别: 第一个参数是传入对象类型,根据容器是引用还是指针选择(.* / ->*)
 78 //2.std::bind(&std::string::empty,std::placeholders::_1) 区别:可通过指针或者对象执行成员函数;
 79 //3.std::mem_fn(&std::string::empty)  C++11, 区别:可通过指针和对象执行成员函数
 80 //4.可使用lamda调用;
 81
 82
 83 class Str
 84 {
 85 public:
 86     std::string str;
 87
 88     Str(const std::string &str_) : str(str_)
 89     {
 90
 91     }
 92
 93     Str(const char *str_) : str(str_)
 94     {
 95
 96     }
 97
 98     bool empty() const noexcept
 99     {
100         return str.empty();
101     }
102 };
103
104
105 int main()
106 {
107
108     std::vector<Str> str_vec{"xa", "sad", "", "", "", "qqewhegr", "aqdq"};
109
110
111     std::function<bool(const Str &)> fn = &Str::empty;
112
113     std::size_t empty_size_function=std::count_if(str_vec.begin(),str_vec.end(),fn);
114
115     std::size_t empty_size_bind=std::count_if(str_vec.begin(),str_vec.end(),std::bind(&Str::empty,std::placeholders::_1));
116
117     std::size_t empty_size_mem_fn=std::count_if(str_vec.begin(),str_vec.end(),std::mem_fn(&Str::empty));
118
119
120     std::cout << empty_size_function << std::endl;
121     std::cout << empty_size_bind << std::endl;
122     std::cout << empty_size_mem_fn << std::endl;
123
124
125
126     std::size_t size = std::count_if(str_vec.begin(), str_vec.end(), [](const Str& str) { return str.empty(); });
127     std::cout << size << std::endl;
128
129
130     return 0;
131 }
时间: 2024-10-26 19:43:12

C/C++ 类成员函数指针 类成员数据指针的相关文章

C++ Primer 学习笔记_22_类与数据抽象(8)--static 成员变量、static 成员函数、类/对象的大小

一.static 每个static数据成员是与类关联的对象,并不与该类的对象相关联!非static数据成员存在于类类型的每个对象中,static数据成员独立该类的任意对象存在. static成员函数没有this形参,它可以直接访问所属类的static成员,但是不能直接使用static成员! 1.static 成员变量 对于特定类型的全体对象而言,有时候可能需要访问一个全局的变量.比如说统计某种类型对象已创建的数量. 如果我们用全局变量会破坏数据的封装,一般的用户代码都可以修改这个全局变量,这时可

用含成员函数的类来实现输入和输出时间

用含成员函数的类来实现输入和输出时间. 程序: #include<iostream> using namespace std; class Time { public: void set_time(); void show_time(); private: int hour; int minute; int sec; }; int main() { Time t1; t1.set_time(); t1.show_time(); Time t2; t2.set_time(); t2.show_t

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

类的成员函数(简称类函数)是函数的一种,它的用法和作用和前面介绍过的函数基本上是一样的,它也有返回值和函数类型,它与一般函数的区别只是:它是属于一个类的成员,出现在类体中.它可以被指定为private(私有的).public (公用的)或protected(受保护的). 在使用类函数时,要注意调用它的权限(它能否被调用)以及它的作用域(函数能使用什么范围中的数据和函数).例如私有的成员函数只能被本类中的其它成员函数所调用,而不能被类外调用.成员函数可以访问本类中任何成员(包括私有的和公用的),可

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

http://no001.blog.51cto.com/1142339/389840/ mutalbe的中文意思是“可变的,易变的”,跟constant(既C++中的const)是反义词. 在C++中,mutable也是为了突破const的限制而设置的.被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中. 我们知道,如果类的成员函数不会改变对象的状态,那么这个成员函数一般会声明成const的.但是,有些时候,我们需要在const的函数里面修改一些跟类状态无关的数据成员,

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

转:http://c.biancheng.net/view/2230.html 在类中,如果你不希望某些数据被修改,可以使用const关键字加以限定.const 可以用来修饰成员变量和成员函数. const成员变量 const 成员变量的用法和普通 const 变量的用法相似,只需要在声明时加上 const 关键字.初始化 const 成员变量只有一种方法,就是通过构造函数的初始化列表,这点在前面已经讲到了,请猛击<C++初始化列表>回顾. const成员函数(常成员函数) const 成员函

类的成员函数和普通成员函数的区别

区别1: 静态成员函数实际上是一个全局函数,不依赖一个类的对象. 而属于类,不创建对象也可调用,静态成员函数没有this指针. 普通成员函数依赖一个类的对象,也就是它有一个隐藏的调用参数(this)指针,必须指向一个类的对象. 区别2: 静态函数只能访问类中的静态成员变量: 区别3:: 如果成员函数想作为回调函数来使用,如创建线程等,一般只能将它定义为静态成员函数才行. 版权声明:本文为博主原创文章,未经博主允许不得转载.

程序实践:定义具有成员函数的类

现在从一个由GradeBook类和main函数组成的例子说起,此例是一系例循序渐进例子中的第一个,这些例子通过后续博文讲解,最终是一个功能众多的GradeBook类. 定义具有无参数的成员函数 这里,GradeBook类表示可供教师管理学生考试成绩的成绩簿,而在main函数创建了一个GradeBook对象.main函数使用这个对象和它的成员函数,在屏幕上显示一条欢迎教师进入成绩簿程序的信息. PS:关键字class后跟类名GradeBook.按照惯例,用户定义的类名字以大写字母开头,而且为了增强

C++ 中模板类的模板成员函数在类外定义

因为很多书都没讲到这种情况, 曾经有这个问题但一直没答案,所以我一直以为模板类的模板成员函数只能在类内定义,直到我在某个开源代码里看到原来要加两个 template<>  ............ (T_T) template<typename T1> class MyObjectT { public: template<typename T2> void Foo(T2 v); }; template<typename T1> template<typ

static成员函数和static成员

C++的静态成员是和类关联的,它属于某个类,但是不属于某个特定的对象.静态成员变量只存储一份供所有对象共用.所以在所有对象中都可以共享它.使用静态成员变量实现多个对象之间的数据共享不会破坏隐藏的原则,保证了安全性还可以节省内存. 但是可以通过对象调用静态成员函数,虽然我们一般不会这么做: 1 class Point 2 { 3 public: 4 void init() 5 { 6 } 7 static void output() 8 { 9 } 10 }; 11 12 void main()

static成员函数和static 成员变量的作用

static 成员只属于类不属于具体的对象,1.当类的某些属性需要所有对象都能够统一公用一分内存的时候,就可以定于成静态成员变量2.静态成员函数可以直接使用类去调用,所有当需要查看类的静态成员变量属性的时候可以直接通过静态成员函数去调用,而不需要具体对象去调用 3.因为static 成员属于类,而不属于具体的对象,所有static成员函数不能使用this指针 原文地址:http://blog.51cto.com/wenxuehui/2089850