2015-08-15 53 views
0
#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之间是否有区别(范围除外)?指针在C++成员

+2

你可以参考http://stackoverflow.com/questions/670734/c-pointer-to-class-data-member有关如何使用指向类成员的指针。 – user258367

+0

我之前提到过它。我只想知道这个_Pointer的范围是什么,并且它是否被分类为**类成员**? – Bateman

回答

3

嗯,不,它不应该“像集体成员一样行事”。这是不正确的。我不知道你在哪里。

它应该作为值为指针对成员类型。而这样的指针需要->*.*运营商取消引用

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

而且,正如你所看到的,这些运营商需要在左侧的特定对象。你不能仅仅自己解除引用px。它本身没有意义。

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

+0

我无法理解“指针到类成员的指针”(你的意思是指针指针/双指针?)。你能详细说明一下吗(用一个简单的例子)。为什么陈述'cout <<“\ n x的地址即px:”<< px;'不会产生错误? – Bateman

+0

@Khan Zaid:“指针指向成员”是一种特殊的实体,与普通的常规指针明显不同。所以,有*常规类*的指针,并且有*指向成员类*的指针。关于第二个想法,也许应该避免使用这种冗余冠冕堂皇的术语。没有它,人们可以说同样的事情。 (我会试着修改答案)。不,与双指针无关。 – AnT

+0

你为什么期望'cout << px;'产生一个错误?这段代码并不试图*取消引用指针,这意味着我上面提到的有关* dereferencing *这样的指针不适用。这段代码简单地使用了这样的事实:这些指针(就像常规指针一样)可以转换为“bool”类型。即它相当于'cout <<(bool)px;' – AnT