zoukankan      html  css  js  c++  java
  • [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

  • 相关阅读:
    微信小程序 API 界面 (2)
    微信小程序 API 界面(1)
    微信小程序 API 路由
    微信小程序 API 基础
    微信小程序image组件
    navigator组件(相当于a标签)
    functional-page-navigator 组件
    node.js配置环境变量
    animate(动画)框架 和 swiper (轮播)框架 的使用
    SwipeRefreshLayout的使用,下拉刷新
  • 原文地址:https://www.cnblogs.com/kona/p/4658859.html
Copyright © 2011-2022 走看看