類的靜態成員函數帶來了什麼好處,應該在什麼時候使用?

轉載自:點擊打開鏈接

函數的行爲對所有派生類都一致時,可以聲明爲靜態。

靜態成員函數的作用基本上相當於一個帶有命名空間的全局函數。 

如一個數學類定義了一些函數 都可以聲明僞靜態的 Math.sin(x)等

好處很多,但所有的好處都是基於:它跟類的實例無關,只跟類有關,不需要this指針。
至於可重入問題,非靜態成員函數也有啊。爲什麼單單問靜態函數的可重入問題。
比如:
(1)可以實現某些特殊的設計模式:如Singleton;

(2)由於沒有this指針,可以把某些系統API的回調函數以靜態函數的形式封裝到類的內部。因爲系統API的回調函數通常都是那種非成員函數(孤立函 數),沒有this指針的。比如你可以在類的內部寫一個線程函數供CreateThread創建線程用,如果沒有靜態函數,那麼這種回調函數就必須定義成 全局函數(非靜態成員函數指針無法轉換成全局函數指針),從而影響了OO的“封裝性”。

(3)可以封裝某些算法,比如數學函數,如ln,sin,tan等等,這些函數本就沒必要屬於任何一個對象,所以從類上調用感覺更好,比如定義一個數學函數類Math,調用Math::sin(3.14);如果非要用非靜態函數,那就必須:
Math   math;
math.sin(3.14);
行是行,只是不爽:就爲了一個根本無狀態存儲可言的數學函數還要引入一次對象的構造和一次對象的析構,當然不爽。而且既然有了對象,說不得你還得小心翼翼的定義拷貝構造函數、拷貝賦值運算符等等,對於一些純算法的東西顯然是不合適的。

(4)總之,從OOA/OOD的角度考慮,一切不需要實例化就可以有確定行爲方式的函數都應該設計成靜態的。
以上只是一些基本的考慮,並不是絕對的。絕對東西的只有一點:“靜態函數不需要實例化就可以被調用,不會也不可以調用或操縱非靜態成員”。記住這一點,那麼實際編程中何時需要用,何時適合用,自然就更容易作出決定了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章