成员指针
成员指针是指可以指向类的非静态成员的指针,一般情况下指针指向一个对象,但是成员指针指示的是类的成员,而非类的对象,类的静态成员不属于任何对象,因此无须特殊的指向静态成员的指针,指向静态成员的指针与普通指针没有什么区别,成员指针的类型囊括了类的类型以及成员的类型,当初始化一个这样的指针时,我们令其指向类的某个成员,但是不指定该成员所属的对象,直到使用成员指针时,才提供成员所属的对象。
指向类数据成员的指针
指向非静态数据成员:Type class::*p = &class::meb;
指向静态数据成员:Type *p = &class::meb;
指向类成员函数的指针
指向非静态成员函数:Type (class::*p)(...) = &class::func;
指向静态成员函数:Type (*p)(...) = &class::func;
总结:在定义时不需要用到类对象,在调用时,指向非静态的需要使用对象来调用,指向静态的则不需要使用对象来调用,指向成员函数的指针与普通意义上的指针不一样,它存放的是偏移量。从类的起始地址的偏移量指向非静态成员函数时,必须用类名作限定符,使用时则必须用类的实例来调用。指向静态成员函数时,则不需要使用类名作限定符,使用时也不需要类的实例调用。
#include "stdafx.h"
#include <iostream>
using namespace std;
#include <string>
class A
{
public:
A(string na) :name(na){}
static void foo();
static int id;
void func();
string name;
};
int A::id = 100;
void A::func()
{
cout << "A::func" << endl;
}
void A::foo()
{
cout << "A::foo" << endl;
}
int main()
{
A a("zhaosi");
A *pa = new A("liming");
string A::* pn = &A::name; //非静态
int *pi = &A::id; //静态
void(A::*pf)() = &A::func;
void(*pf2)() = &A::foo;
//此时*pn 相当于一个接口 只要是该类的对象就可以调用
cout << a.*pn << endl; //非静态调用时需要使用对象
cout << pa->*pn << endl;
cout << *pi << endl;
cout << "======================================" << endl;
//使用时末尾要加()
(a.*pf)();
(pa->*pf)();
pf2(); //静态的直接调用
int* p[10]; //指针数组
int(*a1)[10]; //数组指针
int(*f)(int); //函数指针
void(*fptr[10])(); //函数指针数组
fptr[0] = &A::foo; //静态成员函数指针可以赋值
void(A:: * ffptr[10])(); //类非静态成员函数指针数组
ffptr[0] = &A::func;
(a.*ffptr[0])(); //调用
}