#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之间有什么区别(范围除外)?
答案 0 :(得分:3)
嗯,不,不应该“像集体成员那样行事”。那不是真的。我不知道你在哪里得到它。
它应该作为指向成员类型的值。此类指针需要->*
或.*
运算符取消引用
cout << "\nValue of X indirected through px :" << this->*px;
cout << "\nValue of X indirected through px :" << (*this).*px;
而且,正如您所看到的,这些操作符需要左侧的特定对象。您不能单独取消引用px
。它本身没有任何意义。
指向数据成员类型的值是“偏移”的低级概念的语言级实现(从包含对象的开头测量的数据的偏移量)。为了通过给定的偏移量找到实际数据,您必须有一个起始点来测量该偏移量。这就是->
或.*
左侧的对象表达式所代表的内容。