靜態成員函數和非靜態成員函數的區別?


一個靜態成員函數不與任何對象相聯系,故不能對非靜態成員進行默認訪問。

它們的根本區別在於靜態成員函數沒有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指針出錯。這就是為什么一個靜態成員函數與任何當前對象都無聯系的原因。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM