• Item 15.指向类数据成员的指针


    Item 15. Pointers to Class Members Are Not Pointers


    Pointers to Class Members:指向类成员的指针

    注:本条中只涉及到非静态的数据成员
    --------------------------------------------------------
    1、类成员的指针之声明:
     class C {
      public:
        //...
        int a_;
     };
     int C::*pimC; //指向类C成员的指针,这里只是声明

    2、类成员的指针之含义:
     
     类成员的指针用“指针”这个词来描述很容易引起混淆,因为类成员的指针和指针的含义大相径庭:
    指针包含地址;而类成员的指针并不涉及到内存地址,它只是引用了一个类的某个成员,而不是一个具体的对象的某个成员,类没有内存地址,因此类成员的指针也不能指向内存的某个地方,它通常只是一个偏移量(offset)。然而由于标准C++没有定义类成员的指针的实现,因此各个编译器厂家的实现也不尽相同,但大多数是用一个整数来表示这个偏移量。

      pimC = &C::a_;   //获取成员a_在C中的偏移量,如果a_为静态成员则pimC指向C::a_的地址
     
    3、访问偏移量对应的数据成员
      C aC;
      C *pC = &aC;
      aC.*pimC = 0;    //*pimC应用到了C的每一个对象上
      int b = pC->*pimC;
      有了一个类成员的偏移量,为了取得在这个偏移量上的数据成员,我们就需要该类的一个对象的地址。于是,“.*”和“->*”就粉墨登场了。
      aC.*pimC的含义: 访问对象aC在偏移量为pimC上的数据成员
      pC->*pimC的含义: 访问指针pC指向的对象在偏移量为pimC上的数据成员

    4、当继承出现后……
      在继承体系中,子类对象的指针可以隐式的转换位父类对象的指针,反之需要显示的转换。
      但类成员的指针转换规则恰恰相反。
      不用奇怪,大家都遵循同一的规则:父类有的子类肯定有,子类有的父类未必有。
     
     class Shape {
        //...
        Point center_;
        //...
    };
    class Circle : public Shape {
        //...
        double radius_;
        //...
    };

    Point Circle::*loc = &Shape::center_; // OK
    //double Shape::*extent =&Circle::radius_; // error!         

  • 相关阅读:
    guzzle下载图片(laravel+vue)
    leetcode——131.分割回文串
    leetcode——139.单词拆分
    leetcode——115.不同的子序列
    leetcode——72.编辑距离
    leetcode——87.扰乱字符串
    leetcode——123. 买卖股票的最佳时机 III
    leetcode——132. 分割回文串 II
    leetcode——124. 二叉树中的最大路径和
    leetcode——51.N皇后
  • 原文地址:https://www.cnblogs.com/aiwz/p/6333247.html
Copyright © 2020-2023  润新知