代碼:
1 class test{ 2 public: 3 static void f1(){cout<<y<<endl;} 4 void f2(){cout<<y<<endl;} 5 void f3(){cout<<x<<endl;} 6 void f4(int p){cout<<p<<endl;} 7 int x; 8 static int y; 9 }; 10 int test::y=1; 11 int main() 12 { 13 test* p=nullptr; 14 p->f1(); 15 p->f2(); 16 p->f3(); 17 p->f4(5); 18 getchar(); 19 return 0; 20 }
2.結果:
f1,f2,f4都會調用成功,f3調用失敗。
解釋:
p為null,所以這個類的this指針為null。調用非靜態成員函數時,編譯器會默認把this指針作為第一個參數!
f1本身為靜態成員函數,調用靜態成員變量y,不需要this指針,成功。
f2是普通成員函數,也可以調用靜態成員變量y,不需要this指針,成功。
f3調用了普通成員變量,這時需要this指針了,但this為null,所以相當於調用cout<<null->x<<endl;這顯然錯誤!
f4也不需要this指針,成功。
另外兩個相關知識點:
1、靜態成員函數只能調用靜態成員變量,普通成員函數可以調用靜態成員變量。
2、靜態成員變量要在類內聲明,類外初始化。