我認爲&(foo.bar)
只是一個指向變量的常規指針。通過說「指向成員」我們的意思是像&(FooClass::bar)
,沒有specyfying任何對象!注意,這個值實際上可以在編譯時計算出來,並且可以用於例如在模板中。
成員指針有很奇怪的語法。
嘗試運行下面的代碼:
#include <stdio.h>
class FooClass {
public:
int bar;
int bar2;
FooClass() : bar(0), bar2(0) {}
};
int main() {
//Showing what member pointers actually hold:
int FooClass::* barPtr=&FooClass::bar;
int FooClass::* bar2Ptr=&FooClass::bar2;
printf("barPtr=%p\nbar2Ptr=%p\n",barPtr,bar2Ptr);
//Showing how to use them:
FooClass foo;
foo.*bar2Ptr=42;
printf("foo={%d,%d}\n",foo.bar,foo.bar2);
}
你會得到輸出:
barPtr=0x0
bar2Ptr=0x4
foo={0,42}
正如你可以看到,這兩個值持有從上課開始的成員偏移。即使你不知道你正在工作的是哪個對象,他們也可以被計算出來。
但是,如果您想取消引用它們,則必須提供一個對象 - 這就是.*
運算符所要做的。
你不能在成員指針上使用'printf(...%p ...)',他們是完全不同的動物... – Lindydancer
你可能通常不想在生產代碼中這樣做,但你可以用於測試目的。它們通常具有相同的尺寸(雖然不能保證)。你可能不希望爲通常較大的成員函數指針這樣做,但這是另一回事。 – CygnusX1