看板 C_and_CPP 關於我們 聯絡資訊
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 的本質, 是一些工具函數, 如此而已 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.160.90.225
bobhsiao:推一下 02/21 23:17
tinlans:其實還有一個關鍵點,指向 static member function 的 02/22 00:03
tinlans:pointer type 跟 member function pointer 不同。 02/22 00:04
tinlans:所以 static member function 可以被丟進 C 式 API。 02/22 00:05
softwind:class 和 object 基本上沒有太大關係... 02/22 00:39
avhacker:真要把 non member 集中在一起,不然放 namespace 中 02/22 00:57
avhacker:將 stand alone function/variable 放 namespace 之中 02/22 00:57
Splash5:看machine code也可以瞭解一些處理機制和真正本質 02/22 03:10