天天看點

類成員變量和成員函數的位址

class 指向成員函數的指針必須與向其指派的函數類型比對不是兩個而是三個方面都要比對

參數的類型和個數 傳回類型 它所屬的類類型

做下面的一個測試

#include<iostream> using namespace std; class A { public: A(int); void fun1(); virtual void fun2(); static void fun3(); int num1; static int num2; }; A::A(int i) { num1=i; } void A::fun1() { cout<<"I am in fun1"<<endl; } void A::fun2() { cout<<"I am in fun2"<<endl; } void A::fun3() { cout<<"I am in fun3"<<endl; } int A::num2=1; void main() { A a(2); //擷取靜态成員資料的位址 int *ptr_static=&A::num2; cout<<"靜态成員資料的位址"<<ptr_static<<endl; ptr_static=&a.num2; cout<<"a.num2靜态成員資料的位址"<<ptr_static<<endl; //擷取靜态函數的位址 void (*ptr_staticfun)=A::fun3; cout<<"靜态成員函數的位址"<<ptr_staticfun<<endl; ptr_staticfun=a.fun3; cout<<"a.fun3靜态成員函數的位址"<<ptr_staticfun<<endl; //擷取普通成員函數的位址 typedef void (A::*ptr_commomfun)(); ptr_commomfun ptr=A::fun1; cout<<"普通成員函數的位址"<<ptr<<endl; //如果直接輸出ptr的話,輸出來的是1,是以應該把ptr位址中的内容讀出來 cout<<"普通成員函數的位址"<<*((long*)&ptr)<<endl; ptr=a.fun1; cout<<"a.fun1普通成員函數的位址"<<*((long*)&ptr)<<endl; ptr_commomfun ptr_virtual=A::fun2; //擷取虛函數的位址 cout<<"虛成員函數的位址"<<*((long*)&ptr_virtual)<<endl; ptr_virtual=a.fun2; cout<<"a.fun2虛成員函數的位址"<<*((long*)&ptr_virtual)<<endl; int *p; int A::*q; q=&A::num1; //指向資料成員的指針賦予的是一個目前還不存在的一個類成員的位址,而這個位址隻有在使用實際類對象進行調用時才會真正的确定下來 //就是說在類還沒有對象時候,成員變量時沒有空間的。 cout<<"普通成員資料的位址"<<*((long *)&q)<<endl; p=&a.num1; cout<<"a.num2普通成員資料的位址"<<p<<endl; }

注意在擷取類成員函數的時候,如果直接把指針輸出來,得到的是1,我想是因為編譯器把&A::fun1當做bool變量

void (A::*ptr)();

ptr=A::fun1;或者ptr=&A::fun1都可以

另外需要注意的是

指向資料成員的指針賦予的是一個目前還不存在的一個類成員的位址,而這個位址隻有在使用實際類對象進行調用時才會真正的确定下來

就是說在類還沒有對象時候,成員變量時沒有空間的

運作結果

類成員變量和成員函數的位址