簡體   English   中英

靜態變量的初始化

[英]Initialization of static variables

任何人都可以告訴我什么時候static變量/函數被分配內存和哪個內存段? static global variable, static member variable, static local variable等都在程序開始之前初始化一次並且都保留其值?

此外,如果Class MyClass具有靜態變量count ,當我在main中聲明MyClass obj時,則創建MyClass對象並給count計算內存,如果我聲明了MyClass obj2 ,那么內存方面會發生什么? obj2是否有任何count指的是obj1count 或者只有單獨的內存分配。 希望這樣我能夠清楚地提出這個問題。

提前致謝。

當我們將類的成員聲明為static ,意味着無論創建了多少個類的對象,都只有一個static成員的副本。 即使沒有靜態數據成員類的對象,它也存在

static成員由類的所有對象共享。

如果我聲明了MyClass obj2 ,那么在內存方面會發生什么? obj2是否有任何count指的是obj1count

是。 所有對象只有一個count 這個測試程序會解釋清楚這一點;

class Something
{
    public:
    static int s_nValue;
};

int Something::s_nValue = 1;

int main()
{
    Something cFirst;
    cFirst.s_nValue = 2;

    Something cSecond;
    std::cout << cSecond.s_nValue;

    return 0;
}   

輸出:

2

因為s_nValuestatic成員變量, s_nValue在類的所有對象之間共享。 因此, cFirst.s_nValuecSecond.s_nValue相同

此外,如果Class MyClass具有tatic變量計數,當我在main中聲明MyClass obj時,則創建MyClass對象並給出count內存

實際上,即使沒有實例化類的對象, count存在!

關鍵字static可能被視為有些“過載”。

以下用法選項都是可行的:

  • 靜態局部變量
  • 靜態全局變量
  • 靜態成員變量
  • 靜態全局函數
  • 靜態成員函數

變量:

就運行時而言,所有類型的靜態變量基本相同。 它們都駐留在程序的數據部分中,並且它們的地址在程序執行期間保持不變。 因此,它們之間的唯一區別是在編譯期間,在聲明范圍內:

  • 靜態局部變量:僅在函數范圍內由編譯器識別
  • 靜態全局變量:僅在文件范圍內由編譯器識別
  • 靜態成員變量:僅在類的范圍內由編譯器識別

功能:

就運行時而言,所有類型的函數(靜態和非靜態)基本相同。 它們都駐留在程序的代碼段中,並且它們的地址在程序執行期間保持不變。 因此,它們之間的唯一區別是在編譯期間,在聲明范圍內:

  • 靜態全局函數:僅在文件范圍內由編譯器識別
  • 靜態成員函數:僅在類的范圍內由編譯器識別

關鍵字static具有不同的含義,具體取決於它所使用的上下文。 static變量在堆上分配,它們的生命周期在整個程序運行中延伸。

  1. 靜態全局變量與全局變量相同,只是static關鍵字將變量的范圍限制為僅包含它的文件。 這稱為文件鏈接或內部鏈接。

  2. 定義包含它的類時,將創建靜態成員變量。 這意味着可以使用類的名稱訪問它。 該變量在類的所有實例中共享。

  3. 靜態局部變量與靜態全局變量具有相同的生命周期,但其范圍是包含它的直接塊。

  4. 當使用static關鍵字限定函數時,這意味着函數的范圍是僅包含它的文件。 該函數不能被另一個文件中的函數調用。 這又稱為文件范圍或內部鏈接。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM