初識static關鍵字

baobaobashi發表於2024-05-25

一、static的作用

在C++中,static關鍵字是一個多功能的修飾符,它可以用於不同的上下文,並且具有不同的意義。

二、區域性靜態變數

在函式內部,如果你使用static關鍵字宣告一個變數,那麼這個變數只會初始化一次,並且它的生命週期會持續到程式結束

這意味著,即使在函式返回之後,這個變數的值也會被保留下來,並且在下次函式呼叫時仍然有效。

void func() 
{  
    static int count = 0; // 只在第一次呼叫時初始化  
    count++;  
    std::cout << "Count: " << count << std::endl;  
}

三、全域性/名稱空間靜態變數

在檔案的全域性作用域或名稱空間中,static關鍵字用於限制變數的可見性。一個靜態全域性變數或名稱空間變數只在本檔案中可見,不能被其他檔案直接訪問。這通常用於隱藏特定於檔案的變數,或者為庫提供內部狀態。

// File1.cpp  
static int secret_value = 42; // 其他檔案不能直接訪問這個變數  
 
// File2.cpp  
// 這裡不能直接訪問secret_value,因為它是File1.cpp中的靜態全域性變數

四、靜態成員函式和靜態資料成員

靜態成員函式:

  • 在類定義中,靜態成員函式不與類的任何特定例項關聯。
  • 它們可以直接透過類名來呼叫,不需要建立類的例項
  • 靜態成員函式只能訪問靜態成員變數和其他靜態成員函式
  • 沒有this指標,因為它們是獨立於類的任何特定物件的。
  • 只需在宣告處出現一次static關鍵字,在類外定義的時候不需要重複。
class Test
{
    static void fun();
};

void Test::fun()
{
    cout << 10 << endl;
}

靜態資料成員:

  • 靜態資料成員必須在類外部定義和初始化
  • 只在程式開始分配一次空間,並且直到程式結束才會釋放。
  • 可以透過類名和作用域解析運算子(::)直接訪問,也可以透過類的物件訪問。
class MyClass 
{  
public:  
    static int staticVar; // 靜態成員變數  

    static void staticFunc() 
    {  
        //訪問靜態成員變數  
        std::cout << "Static variable: " << staticVar << std::endl;  
    }  

    void print()
    {
        //類的成員函式不需要::(作用域運算子)也可以直接訪問
        std::cout << staticVar << endl;
    }
};  

int MyClass::staticVar = 0; // 靜態成員變數需要在類外部定義  

int main() 
{  
    MyClass::staticFunc(); // 直接透過類名呼叫靜態成員函式  
    return 0;  
}

類中的靜態成員存在於任何物件之外,物件不包含任何與靜態資料成員有關的資料。下面這個例子如果進行例項化物件,那麼該物件中資料成員只有 int a,成員函式只有fun() 函式。

class Test
{
private:
    int a;
    //static int b;

public:
    static void print(){}
    static void add() {}
    void fun() {}
    static int b;
};

int Test::b = 10;

int main()
{   Test a;
    cout << a.b << endl;        //當b在public修飾時,正確
    cout << Test::b << endl;    //同上

    //cout << a.b << endl;      //b在private修飾時,錯誤
    //cout << Test::b << endl;  //同上
    return 0;
}

如果靜態資料成員被宣告為類的私有成員,那麼它們就不能從類的外部直接訪問,無論是否透過物件還是類名。這是因為私有成員的訪問被限制在類本身以及它的友元函式和友元類中。

相關文章