用C ++指向成员的指针

时间:2015-08-15 05:44:17

标签: c++ pointers

#include <iostream>
using namespace std;

class Sample
{
    public:
        int *pxx;
        int x;

        void setD(int y)
        {
            x=y;
        }

        void print()
        {
            int Sample::*px = &Sample :: x; 
            cout<<"\nx : "<<x;
            cout<<"\nAddress of x : "<<&x;
            cout<<"\nValue of X indirected through px :"<<this->*px;
            //cout<<"\nValue of X indirected through px :"<<*px; ERROR
            //cout<<"\nAddress of x i.e. px : "<<px; NO ERROR BUT UNDESIRED OUTPUT(The output is most of the time '1')
            //cout<<"\nAddress of x i.e. px : "<<this->px; ERROR
        }
};

我已经读过,当使用语法data type <class_name> :: * <pointer> = &<class_name> :: <variable_name>声明指针时,它就像一个类成员,那么为什么我不允许执行上述程序的注释中给出的那些语句(除了1 )。 px和pxx之间有什么区别(范围除外)?

1 个答案:

答案 0 :(得分:3)

嗯,不,不应该“像集体成员那样行事”。那不是真的。我不知道你在哪里得到它。

它应该作为指向成员类型的值。此类指针需要->*.*运算符取消引用

cout << "\nValue of X indirected through px :" << this->*px;
cout << "\nValue of X indirected through px :" << (*this).*px;

而且,正如您所看到的,这些操作符需要左侧的特定对象。您不能单独取消引用px。它本身没有任何意义。

指向数据成员类型的值是“偏移”的低级概念的语言级实现(从包含对象的开头测量的数据的偏移量)。为了通过给定的偏移量找到实际数据,您必须有一个起始点来测量该偏移量。这就是->.*左侧的对象表达式所代表的内容。