[英]In C++, where are static, dynamic and local variables stored? How about in C and Java?
[英]Static variables in C++ and Java
我有一個問題:假設我們有這個功能:(在C ++中)
int& f() {
static int x = 0;
return x;
} // OK
和
int& h() {
int x=0;
return x;
} // ERROR
為什么h
會出錯? 是因為關鍵字static
? 我發現static
關鍵字讓我的x
變量在我的函數終止后生效。 所以我仍然可以從外部訪問該內存位置(另一個功能或主要?對嗎?)。 而是在h
終止后丟失int x = 0
。 對? 我不確定我真的得到了它!
那Java呢? 我讀過我不能在方法中聲明static
變量,只能在類中聲明。
謝謝。
在C ++中, static
是該語言最重載的關鍵字之一。 你在這里使用的意思是這樣的:
在具有static
說明符的函數內定義的變量具有靜態存儲持續時間 - 它占用程序的整個運行時的相同空間,並在對函數的不同調用之間保持其值。 因此,您可以安全地返回對它的引用,因為變量總是在那里支持引用。
當函數調用返回時,正常(非static
)函數局部變量被銷毀,因此引用變為懸空 - 它不引用任何有效的東西。 使用它會導致未定義的行為。
Java根本沒有函數范圍的static
變量(它沒有關鍵字static
含義)。 這就是為什么你不能在那里宣布它。
C ++和Java都具有static
關鍵字的“類范圍”含義。 當使用static
關鍵字聲明類的成員時,意味着該成員未綁定到該類的任何實例,而只是一個全局變量,其標識符位於類的范圍內。
Static關鍵字在C ++和Java中幾乎用於相同的目的。 但是有一些不同之處。
1)靜態數據成員:與C ++一樣,Java中的靜態數據成員是類成員,並在所有對象之間共享。
2)靜態成員方法:與C ++一樣,聲明為static的方法是類成員,具有以下限制:
this
或super
與C ++一樣,可以在不創建對象的情況下訪問靜態數據成員和靜態方法。 可以使用類名訪問它們。
3)靜態塊:與C ++不同,Java支持一個特殊的塊,稱為靜態塊(也稱為靜態子句),可用於類的靜態初始化。 靜態塊中的此代碼僅執行一次(第一次創建該類的對象或第一次訪問該類的靜態成員時(即使您從未創建該類的對象))。
4)靜態局部變量:與C ++不同,Java不支持靜態局部變量。 如果使用,Java程序將在編譯時失敗。
5)靜態類:在Java中也可以使類成為靜態。在java中,我們不能使頂級類靜態化。 只有嵌套類可以是靜態的。
內部類(或非靜態嵌套類)可以訪問外部類的靜態和非靜態成員。 靜態類無法訪問外部類的非靜態成員。 它只能訪問外部類的靜態成員。
函數中C ++中的靜態變量是函數范圍內的持久變量。 在Java中,您不能在方法中使用靜態變量。 靜態變量是類的變量,而不是其實例。
對於Java方面,你是對的。 Java中的靜態變量必須在類級別而不是在方法內部聲明。
如果你需要調整靜態變量的范圍,那么你可能會有一些嚴重破壞的體系結構,但你可以通過使用內部類來存儲靜態變量來在一定程度上完成它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.