1. 程式人生 > >C++(static使用注意,和非static區別)

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的注意事項。