[C++ primer]类成员指针

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

原文地址:https://www.cnblogs.com/kona/p/4658859.html