文章總列表

C++ study note vol.2

C++ 的 class 是很好的工具
也是很神秘的工具

這篇要來講一下, 什麼是
static member variable
static member function


----


static member variable 的性質很簡單
他就是 global variable, 拿來存一些重要的參數
一般我們寫程式, 會把一些常用的變數, 大家都會用的變數宣告成 global
然後所有 function 就用同一份變數, 大家 share 他

static member function 也有一樣的性質
他不會隨著每次物件創造出來, 就會多一份 copy

如果沒有 static member variable, 程式設計師還是會用 global variable 達成目的
只是這樣看起來比較不優雅, 因為 global variable 一個又一個穿插在 code 裡
感覺很亂, 也不知道附屬於哪些函數, 管理上很麻煩

static member variable 的存在, 只是彰顯了 global variable 的功能
包括他隸屬於哪些功能, 應該被哪些函數使用, 和哪些東西相關
但是骨子裡, 他就是 GLOBAL VARIABLE !!


----


C++ 的書會告訴你, 存取 static member variable, 必須要用 static member function
同樣的事, 我可以在 C語言找到對應的故事...

通常寫得很差勁的 C code, 你會看到亂無章法的 global variable
可能在一堆 code 裡, 會看到某個地方讀他, 某個地方寫他, 而且是直接操作...

如果哪天, 我們希望修改 global variable 的定義, 或是修改存取的規則
接下來精彩了, 你要把所有程式碼翻出來, 修改所有操作 global variable 的地方

這是為什麼有經驗的程式員會告訴你:
存取 global variable, 最好透過 function 去操作
這是為了避免修改時的痛苦, 讓你只要改一個地方, 所有地方一起受惠


----


static member function 就跟上一段說的 global variable 操作函數意義一樣
他是負責來讀/寫這些 global variable 的
我們希望這些操作, 能夠統一集中在一起, 放在 class 裡, 彰顯他們的用途
並且放在 class 裡, 能提高程式碼的內聚性, 意思是說
"功能一樣或相關的 code 放在一起, 有幫助維護"

程式寫久了, 大家一開始是 design for speed
後來會發現, 其實 maintain 才是痛苦的根源...
於是有 design for maintain 的想法

這跟設計硬體一樣, 為了讓生產更容易, 良率更高
逐漸發展出 design for manufacture 的設計哲學是一樣的


----


最後是關於 member function 和 static member function 的差異
C++ 的書會告訴你說, static member function 不能存取 member variable

WHY?

這要從 C++ 的物件模型說起

int a = 1000;
CObjcet obj;
obj.qqq(a);

呼叫 obj 裡的 member function qqq()
表面上看起來, 只傳了一個 int 進去, 真的只傳這些東西進去嗎 ?

錯 !!

其實 C++ 的 compiler, 會自動補一個指標傳進去, 像是這樣...
obj.qqq(a, &obj)

這就是為什麼, 明明 member function 只有一份, 卻不會存取到一樣的變數
附帶一提, 在 C++ 的 member function 裡, 可以使用 this 這個指標
這個指標從哪兒來的, 答案應該很明顯了... 編譯器補的 &obj 送上的~


----


我講了這麼多, 還沒講到 static member function 和 member function 有什麼不同
答案很簡單, 就是 static member function 呼叫時, 他不會附贈 this 這個指標

所以你會在書上看到說, static member function 不能存取 member variable
這是根本的原因

寫在一開始, static member variable, 其實是 global variable
static member function, 其實是存取這些 global variable 的函數

只是我們把這兩樣東西放進 class 裡, 換個名字
表面上看起來是新的規則, 其實他們是舊的設計法則
只是用更精巧的方式包裝, 變成一些規則

所以 static member function 的本質, 是一些工具函數, 如此而已

留言

這個網誌中的熱門文章

STM32 UART + DMA,使用HAL實作TX/RX,以及不定長度接收

幼犬書桌椅選擇心得 升降桌 兒童桌椅

CANON G3000 廢墨瓶改裝