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


  
  
  
          
  • 【轉載整理】
靜態成員函數主要為了調用方便,不需要生成對象就能調用。
比如:
class X
{
public:
    void MethodA();
    static void MethodB();
}
此時MethodB可以直接調用,X::MethodB();
MethodA必須先生成類對象才能調用,X x; x.MethodA();

函數的行為對所有派生類都一致時,可以聲明為靜態。
靜態成員函數的作用基本上相當於:一個帶有命名空間的全局函數。
如一個數學類定義了一些函數 都可以聲明偽靜態的 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的角度考慮,一切不需要實例化就可以有確定行為方式的函數都應該設計成靜態的。
        以上只是一些基本的考慮,並不是絕對的。絕對東西的只有一點:“ 靜態函數不需要實例化就可以被調用,不會也不可以調用或操縱非靜態成員”。記住這一點,那么實際編程中何時需要用,何時適合用,自然就更容易作出決定了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM