带着问题
成员指针如何声明
如何将成员指针绑定到一个对象上
成员指针的意义是什么
如何通过成员指针来访问类的成员
类的成员
静态成员(包括静态数据成员,静态成员函数):他们的指针是普通指针,如:
struct X{
static int _x;
public:
static void println( void ){ Println("HelloWorld: %d",_x); }
};
int X::_x=33;
int main( int argc,char *argv[] ){
int *ptr=&X::_x; /* 普通的int*指针 */
Println("%p",ptr);
void (*fptr)( void )=&X::println;/* 普通的函数指针 */
fptr();
}
非静态成员(包括数据与函数),他们的指针需要特别声明.见下
数据成员
声明的语法: 变量类型 类名::*成员指针变量名;
绑定的语法:成员指针变量名=&类名::成员
成员指针的意义:也即该成员在类对象中的偏移值,是一个编译器即可确定的常量.
访问:通过'.*'/'->*'运算符
struct X{
int _x;
public:
void print( void ){ Println("%d",_x); }
};
int main( int argc,char *argv[] ){
int X::*ptr=&X::_x;
Println("%p",ptr); /* _x在X对象中的偏移:0 */
X x;X *xptr=&x;
x.*ptr=44;
/* 通过'.*'运算符对成员指针进行访问
* 语法: 对象.*成员指针; */
Println("%d",xptr->*ptr);
/* 通过'->*'运算符对成员指针进行访问
* 语法: 对象指针->*成员指针; */
return 0;
}
函数成员指针
声明: 函数返回类型 (类名::*变量名)(参数列表)
绑定:变量=&类名::成员函数名
意义:该函数的地址
访问:通过'.*'/'->*'运算符
struct X{
int _x;
public:
void print( void ){ Println("%d",_x); }
};
int main( int argc,char *argv[] ){
void (X::*ptr)( void )=&X::print;
X x;X *xptr=&x;
(x.*ptr)(); /* 注意括号,'x.*ptr'要首先被括号括起 */
(xptr->*ptr)();
Println("%p",ptr);
return 0;
}