關於static關鍵字的幾點問題

2021-08-23 11:47:36 字數 1051 閱讀 8893

**於cu回帖

1、在c/c++中,從大的方面來說可以認為只有兩種變數型別:放在資料段的變數和在堆疊中生出來的變數。前者包括全域性變數和靜態變數,也不管這靜態變數是全域性還是區域性的;除此之外的變數均屬於後者。

2、變數都存在於記憶體中。

放在資料段的變數,在整個程式執行過程中,變數存放的位置不變;而在堆疊中的變數卻沒有固定的記憶體位置。它們就是擺地攤,一收攤就沒啦。既然放在資料段的變數有固定的儲存位置,理論上它們就可以被任意使用(讀或寫)。對靜態變數使用的種種限制,只來自於c/c++語法層面 ,在彙編級就沒有這回事!

3、放在資料段的變數為什麼要分是否靜態的?

通俗地講,是"變數隔離」的需要。

放在堆疊的變數,已經被天然隔離在乙個函式內部了。

靜態變數是對放在資料段變數的再隔離。

區域性靜態變數是被隔離在本函式內部的「全域性變數」,「本函式內使用,概不外借」。

全域性靜態變數則是被隔離在本c/c++源程式單個檔案內部的「全域性變數」,「僅用於本檔案內使用,概不外借」。如果你的軟體工程就乙個檔案,那麼全域性靜態變數和全域性變數從使用角度看是沒有任何區別的。

既已隔離,那麼就可以防止「變數名」衝突。你只要注意在內部不打架 ,外部人家愛叫啥不關你的事。比如,在cu上,估計不能再有人叫」老手「了,其他論壇呢,人家也可以叫」老手「,但跟我絕對沒有關係。在cu內,你只要叫「老手」,那麼大家就知道是找我了:-);否則,你就必須說的明白點,是"cu上的『老手』」,用c++叫法就是「cu::老手」。

沒錯。在c/c++編譯器內部,它們對靜態變數也是這麼稱呼的。

比如函式print(char *)內的區域性靜態變數var,就叫print(char *)::var;

類myclass內部靜態資料成員var,就叫myclass::var;

由此推**件abc.cpp內的全域性靜態變數var就應該叫abc.cpp::var。

可惜,除了myclass::var外,其他都是非法的,起碼目前是這樣 !

4、全域性變數,說到底就是乙個大範圍(乙個軟體工程)的全域性靜態變數。在這範圍之外,一樣的不可見!!

5、static函式,也是乙個隔離,是函式隔離。也是c/c++語法層級的。

this關鍵字 static關鍵字

1.當成員變數和區域性變數重名,可以用關鍵字this來區分 this 代表物件,代表那個物件呢?當前物件 this就是所在函式所屬物件的引用 簡單說 那個物件呼叫了this所在的函式,this就代表哪個物件 this也可以用於在建構函式中呼叫其他建構函式 注意 只能定義在建構函式的第一行,因為初始化...

關於static關鍵字總結

1 不能在static修飾的方法中引用this變數,只能引用一些靜態變數或方法,或new新的物件 能定義區域性變數 簡言之,靜態方法或塊中,只能引用靜態的方法或變數。2 類中的成員變數 static修飾 有預設值,而類的定義的方法中的區域性變數沒有預設值。3 在類的構造器中,能引用所有的靜態或非靜態...

關於static關鍵字的理解

1,想要實現物件中的共性資料的物件共享。可以將這個資料進行靜態修飾。2,被靜態修飾的成員,可以直接被類名所呼叫。也就是說,靜態的成員多了一種呼叫方式。類名.靜態方式。3,靜態隨著類的載入而載入。而且優先於物件存在。1,有些資料是物件特有的資料,是不可以被靜態修飾的。因為那樣的話,特有資料會變成物件的...