[英]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
指的是obj1
的count
? 或者只有單獨的內存分配。 希望這樣我能夠清楚地提出這個問題。
提前致謝。
當我們將類的成員聲明為static
,意味着無論創建了多少個類的對象,都只有一個static
成員的副本。 即使沒有靜態數據成員類的對象,它也存在 。
static
成員由類的所有對象共享。
如果我聲明了
MyClass obj2
,那么在內存方面會發生什么?obj2
是否有任何count
指的是obj1
的count
?
是。 所有對象只有一個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_nValue
是static
成員變量, s_nValue
在類的所有對象之間共享。 因此, cFirst.s_nValue
與cSecond.s_nValue
相同 。
此外,如果Class
MyClass
具有tatic
變量計數,當我在main中聲明MyClass obj
時,則創建MyClass
對象並給出count
內存
實際上,即使沒有實例化類的對象, count
存在!
關鍵字static
可能被視為有些“過載”。
以下用法選項都是可行的:
就運行時而言,所有類型的靜態變量基本相同。 它們都駐留在程序的數據部分中,並且它們的地址在程序執行期間保持不變。 因此,它們之間的唯一區別是在編譯期間,在聲明范圍內:
就運行時而言,所有類型的函數(靜態和非靜態)基本相同。 它們都駐留在程序的代碼段中,並且它們的地址在程序執行期間保持不變。 因此,它們之間的唯一區別是在編譯期間,在聲明范圍內:
關鍵字static
具有不同的含義,具體取決於它所使用的上下文。 static
變量在堆上分配,它們的生命周期在整個程序運行中延伸。
靜態全局變量與全局變量相同,只是static
關鍵字將變量的范圍限制為僅包含它的文件。 這稱為文件鏈接或內部鏈接。
定義包含它的類時,將創建靜態成員變量。 這意味着可以使用類的名稱訪問它。 該變量在類的所有實例中共享。
靜態局部變量與靜態全局變量具有相同的生命周期,但其范圍是包含它的直接塊。
當使用static
關鍵字限定函數時,這意味着函數的范圍是僅包含它的文件。 該函數不能被另一個文件中的函數調用。 這又稱為文件范圍或內部鏈接。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.