簡體   English   中英

C ++-聲明一個函數“靜態”與形式“ const int function_name()const”

[英]C++ - declaring a function 'static' versus the form 'const int function_name() const'

最近,我對使用類“ helper functions”中的static關鍵字大開眼界。 現在我的理解是,您聲明一個成員函數static IF時,它不會與任何數據成員交互,而是僅對傳遞給它的參數起作用-一種“保險”,它不會無意間更改類本身。

以前,我模糊地意識到了這種情況,並通過以以下形式聲明函數來進行幾乎相同的主動“保護”:

 const int function_name(int parameter_one, int parameter_two) const;

我的理解是函數名稱防止在該函數內部更改任何類數據成員之后的const

我真的看不出有什么區別,也不是為什么“靜態”更好就是實現這種“保護”。 顯然,盡管掌握了基礎知識,但我在這里仍然缺少一些細微差別。 有人可以向我解釋這些代碼使用中的細微之處嗎?

區別很簡單:

靜態類成員在類上工作,而不在類的實例/對象上工作。 實際上,您不能從靜態方法訪問任何數據成員。 您只能訪問靜態成員(方法和屬性)。 從靜態函數調用其他成員函數時也是如此。 它將根本無法工作,因為靜態成員不了解類實例,並且無法調用任何非靜態方法!

在后台,一個非靜態成員函數始終為該實例提供一個隱藏的指針,該實例從類本身的角度來看只是this pointer 靜態成員不需要這種指針,也不能使用它。

如果調用靜態方法,則無需創建實例。 實際上,該類只是一種名稱空間。 如果從實例變量或指向它的指針調用靜態成員,則結果與沒有實例一樣!

必須注意靜態變量。 必須在類外部的目標文件中的某個位置定義! 通常,將在創建類的實例時創建類的所有“普通”成員。 靜態變量沒有實例,因此它必須存在於其他位置。 如您在示例中所見,這需要在某個地方進行手動定義。 如果頭文件中有一個類,則無法在其中定義變量。 只有聲明在類內部。 該定義必須放在cpp文件中。 如果嘗試在頭文件中定義變量,則此頭文件可以包含的實例數最多,這樣在鏈接時會導致multiple definition errors

因為您特別要求保護以訪問類的成員,所以:靜態方法可以訪問類的靜態變量,也可以編寫它們。 但是您不能對靜態方法使用const限定!

class A
{   
    public:
        static void Do() { cout << "stat var " << stat_var << endl; }
        void Do2() const { cout << "var" << var << endl; }

        A():var(100) {}

    private:
        static int stat_var;
        int var;


};  

int A::stat_var=9;

int main()
{   
    A a;        // instance of A a
    a.Do2();    // call a method with the instance a

    A::Do();    // call the static method without any instance
    a.Do();    // this looks like a call with a class instance, but it is not!!!
}   

static成員和const成員是單獨的概念,用於單獨的目的。

考慮以下類別:

class fred
{
    int a;

    public:
    fred( int aa ) : a(aa) { }

    int what( int b ) const 
    { 
        return a + b; 
    }

    static int whatnot( fred & f ) 
    {
        f.a = 0;
    }

};

如您所見,靜態成員whatnot()可以操縱傳遞給它的類的任何實例的私有成員。 畢竟,它是班上的一員。 它並不能保證不會更改任何特定的類實例。 另一方面, const成員保證其操作的實例不會更改。

對於不需要直接訪問對象內部的輔助函數,請使用非成員非朋友函數( http://www.gotw.ca/publications/c++cs.htm中的第44項)

靜態方法的最大優點是您不需要指向該類的指針就可以調用該方法。 我回顧了一些復雜的代碼,這些代碼多次將指針作為參數傳遞,以便可以調用方法(可以是靜態的)。 如果適用於這種情況,則使用靜態方法可以簡化代碼,並可能減少傳遞參數所需的寄存器數量。 由於您只能使用其中一種,因此應選擇最適合您的一種。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM