C++(static使用注意,和非static區別)
阿新 • • 發佈:2019-01-09
- 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的注意事項。