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&
};
A的某個int成員相對A對象起始地址的偏移量
推薦閱讀:
※C/C++ 里指針聲明為什麼通常不寫成 int* ptr 而通常寫成 int *ptr ?
※c語言b++<15是b和15比,還是b+1和15比?
※C語言中 *p++ = *p 是如何工作的?
※C/C++中++符號的運算順序是怎樣的?