2015-08-15 80 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