C++(static使用注意,和非static區別) C++(static使用注意,和非static區別)
阿新 • • 發佈:2018-11-26
C++(static使用注意,和非static區別)
- C++類中的static
在C++中有靜態成員變數和靜態成員函式,要注意,在C++類和物件的概念中,先有類,才有物件。因為static型的成員函式和成員變數是在類產生的時候分配的記憶體,產生於物件之前,故不能再static型函式中呼叫普通的成員變數和成員函式。而且在static型函式後面不能加const(原因註釋裡有)
下面通過程式碼說明:#ifndef Tank_h_ #define Tank_h_ class Tank { public: Tank(char code); ~Tank(); void fire(); static int getCount();//這就是靜態成員函式 //static int getCount() const;//這種在static後面加const的行為是非法的,因為加const的本質是在給this指標加一個const,但static型成員函式的 //裡沒有this指標,因為其是依託於類的,不是依託於物件的,this本質就是物件,這裡不需要物件,所以沒有this指標 private: char m_cCode;//坦克編號 static int s_iCount;//用靜態變數來計數 }; #endif
在實現這些函式和變數初始化的時候,也要注意,具體見程式碼
#include "Tank.h" #include <iostream> using namespace std; int Tank::s_iCount = 0;//這裡是對類裡面靜態成員變數的初始化。 //要特別注意,static型變數不能再建構函式中初始化,而且不用加static關鍵字了 Tank::Tank(char code) { m_cCode = code; s_iCount++; cout << "tank" << endl; } Tank::~Tank() { s_iCount--; cout << "~Tank" << endl; } void Tank::fire() { cout << "Tank--fire" << endl; } //這裡就是static型函式的初始化 //注意這裡不加static關鍵字 //而且注意,在static函式中不能呼叫普通的成員變數和普通的成員函式。 int Tank::getCount() { return s_iCount; }
最後在主函式中實現
#include <iostream> #include "Tank.h" using namespace std; int main() { cout<<Tank::getCount()<<endl;//這裡注意,static函式和變數是在類編譯時候就產生,不是依託於物件產生的。所以不需要例項化物件就可以 Tank* p = new Tank('A');//堆上分配記憶體 cout << p->getCount() << endl; system("pause"); return 0; }
這就是C++類中使用static的注意事項。