类成员指针和类成员函数指针

来源:互联网 发布:c 游戏编程入门 编辑:程序博客网 时间:2024/06/10 14:25

整理自C++的的教科书。


类成员指针

不是真正的指针,它指向的是类的普通成员,而不是一个具体的地址,指向静态成员的指针反而是真正的指针。这是因为类的静态成员由所有实例共享,在编译期就可以确定具体的地址;而普通成员是由单个实例独享,很难在编译期确定普通成员地址。(不准确的讲,类成员指针更像一个地址偏移量,描述的是类成员在整个类内存布局的位置)


声明的基本格式:      

                         类型名   类名::*指针名。

int  Base::*b_int_p;  //声明了指向类Base的int成员的指针b_int_p

类成员指针赋值 和普通指针赋值、初始化格式相同,但是解引用有自己特殊的符号, .*  和  ->*

示例:

class Base{public:    int a;    int b;    static int c; // 静态成员};int Base::c = 10;int main(){    int Base::*pint = &Base::a; //声明类成员指针,并初始化指向成员a    Base base;    Base *pbase = &base;        base.*pint = 2; //将实例base的成员a赋值2    pbase->*pint = 4; //将实例base的成员a赋值4    pint = &Base::b;//将pint指向Base类成员b    return 0;}
需要注意的是 ,不能将类成员指针指向类的静态成员;指向类静态成员的指针是普通指针

    int *pp = &Base::c; //编译通过    //int Base::*pp = &Base::c;//编译失败

类成员指针可以指向子类的部分成员,这部分成员是从父类继承来的。

class A{public:    int a;};class B : public A{public:    int b;};int main(){    int A::*pa = &B::a; // 父类A的成员指针pa 指向了子类B的成员a    return 0;}


类成员函数指针

类成员函数指针也和普通指针不同。一个指向成员函数的指针存储了一些实现自身的必要信息,如指向的成员函数是否为虚函数,需要到哪里找到合适的虚函数表等等。

类函数指针赋值 和普通指针赋值、初始化格式相同,但是解引用有自己特殊的符号, .*  和  ->*

声明、赋值、初始化和使用示例

class A{public:    void funA(int m){}    void Test(int){}    static void static_fun(){}};int main(){    void (A::*pfun)(int) = &A::funA; //声明并初始化,指向funA    pfun = &A::Test; //赋值,指向Test        A a;    A *pa = &a;    (a.*pfun)(10); //注意,这里要用()将a.*pfun括起来,因为.*运算符的优先级比()低    (pa->*pfun)(10);//注意,这里要用()将pa->*pfun括起来,因为->*运算符的优先级比()低    return 0;}

需要注意的是 ,不能将类成员指针指向类的静态函数;指向类静态函数的指针是普通指针

void (*pp)() = &A::static_fun; //正确void (A::*pp)() = &A::static_fun; //错误 

类函数指针可以指向子类的部分函数,这部分函数是从父类继承来的。(示例略)


类函数指针也遵从多态。如

class A{public:    virtual void fun()    {         printf("class A");    }};class B : public A{public:    void fun()    {        printf("class B");    }};int main(){    A *a = new B;    void (A::*pfun)() = &A::fun;    (a->*pfun)(); //真正执行的是B::fun()    return 0;}//输出 class B


0 0
原创粉丝点击