1、声明成员指针
有时我们希望直接获取成员的指针,然后从一个对象或别的对象获得该成员,这时就需要用到成员指针。成员指针,包含类的类型以及成员的类型。
成员指针只针对类的非static成员。static类成员不是任何对象的组成部分,所以不需要特殊语法来指向static成员,static成员指针是普通指针。
注:它指向的是一个类的特定成员,而不是指向一个特定对象里的特定成员。
成员指针的定义格式:成员类型 类名::*指针名=&类名::成员名;
成员函数指针的定义格式: 成员函数返回类型 类名::*指针名 = &类名::成员函数名(参数表);
成员函数的指针必须在三个方面与其指向的类型相匹配:
1)函数形参的类型和数目,包括成员是否为const;
2)返回类型;
3)所属类的类型。
通过指定函数返回类型、形参表和类来定义成员函数的指针。
普通指针与成员指针的区别:
1)普通指针用确定对象的地址进行初始化,指向一个确定的对象;
2)成员指针用类的成员(注意不是对象的成员)初始化(也就是只有偏移量的信息,而没有初始地址的信息)。
2、指向成员指针的不可逆行
转自:http://developer.zdnet.com.cn/developer/code/story/0,3800066897,39308240,00.htm
指向基类某个成员的指针可以转换成指向派生类相应成员指针。然而,反过来却不行。这条规则叫做“指向成员的指针的不可逆性”。下面我将解释这个不可逆特性以及隐藏于其后的基本原理。
考虑以下两个类:
struct Base { virtual void func(); }; struct Derived : Base { void func(); };
指向类 Base 的一个成员的指针不能引用类 Derived 的相应成员:
typedef void (Base::*PMF)(); PMF pmf1=&Derived::func; //error PMF pmf2=&Base::func; //fine Base* ptr=new Derived; //fine
然而,如果定义一个指向类 Derived 的一个成员的指针,那么可以隐式地将其转成指向类 Base 相应成员的指针:
typedef void (Derived::*PMF)(); PMF pmf1=&Derived::func; //fine PMF pmf2=&Base::func; //also fine
基本原理
这个不可逆性规则看上去有违直觉。在处理一般的指针和引用时,可以隐式地将一个指向派生类的指针转成一个指向其基类的指针,但是相反却不行:
Base * p = new Derived; //ok Derived *p = new Base; //error, can‘t convert ‘Derived *‘ to ‘Base *‘
然而,在指向成员的指针方面,情况恰恰相反。这是很有必要的,因为一个派生类具有它所继承的基类的所有成员;因此,任何指向基类一个成员的指针都可以映射到派生类相应的成员上。相反行不通,因为派生类可能具有更多基类中不存在的成员。
引用文献:
百度百科:http://baike.baidu.com/link?url=-yRQz4CuMRCOCoGvc3c6bqCrtSzzKFzDJi7t3GjI1TVDvJQFocW4HrNbLweNrIAwzMs4DlTuQ4XbX79f8UAcYa