標籤:

C++中int A::*a里的指針a是什麼?

在有一個類

class A{}

的前提下

int A::*a;里的指針a是什麼???

編譯器指出它是int A::*類型,我可以給它賦什麼值,或者說它有什麼用


指向數據成員的指針(pointer to data member)http://en.cppreference.com/w/cpp/language/pointer#Pointers_to_data_members。


其他人都說了是成員指針,但是這東西不一定是相對起始位置的偏移,更general的,這東西其實是「在一個對象內部定位某一個成員的方式」,因為對於花式繼承的情況,只用一個偏移是不能找到成員本身的。

對象本身成員,可以靜態地訪問,也就是所謂的a.member,pa-&>member,編譯期確定位置,overhead小,可優化幅度大

或者動態地用指針來訪問a.*pmember, pa-&>*pmember,運行時動態存取,overhead大,編譯可優化幅度小

哦順便說成員指針不保證是sizeof(int*)大小,32byte都有可能,如果要用的話,不要強行轉成void*之類的東西,可能會炸


指向數據成員的指針。一個不大準確的說法:int A::*可以指向類A的任意一個類型為int的數據成員。

沒在開發中使用過,不過可以想到下面這樣的簡單例子:

#include &

class A
{
public:
int i;
int j;
int k;
};

void f(const A a, int A::*pint)
{
std::cout &<&< a.*pint &<&< std::endl; } int main() { A a = { 1, 2, 3 }; f(a, A::i); f(a, A::j); f(a, A::k); return 0; }


pointer to member,用法比如利用SFINAE原則來判斷一個類型是否為class

template&
class IsClass
{
private:
typedef char One;
typedef struct { char a[2]; } Two;
template&
static One test(int C::*) {}
template&
static Two test(...) {}
public:
enum { Yes = sizeof(IsClass&::test&(0)) == 1 };
};


A的某個int成員相對A對象起始地址的偏移量


推薦閱讀:

C/C++ 里指針聲明為什麼通常不寫成 int* ptr 而通常寫成 int *ptr ?
c語言b++<15是b和15比,還是b+1和15比?
C語言中 *p++ = *p 是如何工作的?
C/C++中++符號的運算順序是怎樣的?

TAG:C | CC |