2012-07-05 61 views
2

我偶爾會看到類似這樣的代碼位:沒有類實例的類成員的地址?

class A { 
    int b; 
} 

void foo() { 
    int* blah = &A::b; 
    // Other stuff. 
} 

卻怎麼也抓一類的成員變量的地址,而這個類的一個實例是有用的?它有什麼作用?

+0

你確定'b'不是'A'的靜態成員嗎​​? – reuben

+0

我很確定。我已經看到了一些代碼,它似乎依賴於它不是一個靜態成員。 – OniLink

+0

在這種情況下,你確定'blah'的類型是'int *'嗎? –

回答

8

您的代碼格式不正確,無法編譯。 blah的類型不是int*,它是int (A::*)。也就是說,它不是「指向int的指針」,它是「類型爲int的類型爲A的數據成員的指針」。

請注意,爲了獲取指向成員的指針,該成員必須是可訪問的。要在foo()中計算&A::bb需要是公共數據成員,或者foo()需要成爲A的好友。

指向成員的指針不指向對象。相反,可以將指向成員的指針綁定到對象以獲取其數據成員的值。您可以通過將指向成員的blah綁定到A的實例來獲取A對象的b數據成員的值。例如,

A x; 
int b_value = x.*blah; // b_value has the value of x.b 
+0

這......很有意義。謝謝! – OniLink

1

A具有INT b。這意味着b是類A的數據,如果您有A的實例,則可以獲得指向b的指針。

我想你要問這種情況:

class A{ 
    int foo(int i) { 
    } 
} 

編譯之後,foo方法有地址,你可以得到指針&A::foo