一個靜態成員函數不與任何對象相聯系,故不能對非靜態成員進行默認訪問。
它們的根本區別在於靜態成員函數沒有this指針,而非靜態成員函數有一個指向當前對象的指針this。
例如:
1 class Sc 2 { 3 public: 4 void nsfn(int a); //像聲明Sc::nsfn(Sc *this , int a); 5 static void sfn(int a); // 無this指針 6 //.... 7 }; 8 9 void f(Sc &s) 10 { 11 s.nsfn(10); // 轉換為Sc::nsfn(&s , 10) 12 s.sfn(10); // 轉換為Sc::sfn(10) 13 }
函數nsfn()可被認為它聲明為void Sc::nsfn(Sc* this , int a)。對nsfn()的調用,編譯像注解的那樣進行轉換,s的地址作為第一個傳遞的參數。(你並不實際寫該調用,由編譯來實現。)
在函數內部,Sc::nsfn()對非靜態成員的訪問將自動把this參數作為指向當前對象的指針。而當Sc::sfn()被調用時,沒有任何對象的地址被傳遞。因此,當訪問非靜態成員時,無this指針出錯。這就是為什么一個靜態成員函數與任何當前對象都無聯系的原因。
