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

C++(static使用注意,和非static區別) 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的注意事項。