成员指针
成员指针的好处就是可以修改成员指针的指向,不论是成员变量指针还是成员函数指针,只要指针指向的成员或者函数的类型(参数表)一致,就可以改变其指向
成员变量指针
成员变量指针并不是真正意义上的指针,而是假指针,保存的是指针指向的对象的相对偏移地址
- 成员变量指针的定义和初始化
类型 类名::*指针变量名 = &类名::成员变量;
- 成员变量指针的使用
对象.*成员指针变量名;
注:.*
直接成员指针解引用操作符
对象指针->*成员变量;
注:->*
间接成员指针操作符
#include <iostream>
using namespace std;
class A{
public:
int m_i,m_j;
A(void):m_i(100),m_j(200){
}
};
int main() {
std::cout << "Hello, World!" << std::endl;
//pm为成员对象指针
int A::*pm = &A::m_i;
pm = &A::m_j;//修改pm成员指针,下面代码就会改变访问的对象
A a1;
A* a2 = new A;
cout<<a1.*pm<<endl;
cout<<a2->*pm<<endl;
return 0;
}
/home/panda/WorkSpace/memptr/cmake-build-debug/memptr
Hello, World!
100
100
进程已结束,退出代码 0
/home/panda/WorkSpace/memptr/cmake-build-debug/memptr
Hello, World!
100
100
进程已结束,退出代码 0
成员函数指针
成员函数指针获取函数在代码段的绝对地址
成员函数的调用总是伴随着传递this*
指针作为实参,传递对象的地址,没有对象就没有this
指针实参
- 成员函数指针的定义和初始化
返回类型(类名::*成员函数指针) (参数表) = &类名::成员函数名;
- 成员函数指针的使用
(对象.*成员函数指针)(实参);
(对象指针->*成员函数指针)(实参表);
#include <iostream>
using namespace std;
class A {
public:
int func1(void) {
return 0;
}
int func2(void) {
return 0;
}
};
int main() {
int A::*pfmem() = &A::func1;
//pfmem = &A::func2;
A a1;
A *a2 = new A;
(a1.*pfmem)();
(a2->*pfmem)();
return 0;
}