簡體   English   中英

在C ++中使用靜態非成員與非靜態成員變量

[英]Using static non-member vs. non-static member variables in C++

假設我有一個定期調用的函數。 該函數獲取一個值作為參數,我想將它與早期函數調用期間收到的值進行比較,即。 價值需要記住。 我應該為此目的使用靜態非成員變量還是非靜態成員變量? 這兩種方法有哪些優缺點?

作為靜態的非成員方法,我的意思是

class foo {
    public:
        void func(int value) {
            static int lastValue;
            if (value > lastValue) {
                doSomething(value)
            }
            lastValue = value;
    };
};

並且作為非靜態成員變量之類的東西

class foo {
    private:
        int lastValue_;

    public:
        void func(int value) {
             if (value > lastValue_) {
                 doSomething(value)
             }
             lastValue_ = value;
        };
};

首先,您應該添加一些非static lastValue_成員變量的初始化 - 就像您有未定義的行為一樣。 static function-local變量將初始化為0 ,這可能適合您,也可能不適合您。)

這兩種方法有哪些優缺點?

  • 使用非靜態成員變量意味着程序可以創建任意數量的foo實例,並且它們將獨立運行。 沒有兩個線程應該訪問同一個foo對象不同步,但他們可以訪問foo其他線程不訪問,包括任何線程特定情況下foo實例。

  • 擁有一個非靜態成員變量也可以使單元和回歸測試更容易,因為簡單地創建一個新對象將“重置”狀態,而使用static函數 - 局部變量則沒有簡單的方法來恢復起始值(你必須破解一個請求它的函數參數)。

  • 函數本地static變量確實具有在其他代碼的可訪問性意義上更加本地化的優點,使其明確它僅與func函數相關。 通常需要使用盡可能最小的可變范圍,但這里的重要性遠遠低於上述要點。

  • 更一般地說 - 在許多方面,函數本地static變量具有與全局變量或單例相同的問題 - 谷歌將非常巧妙地轉變它們。

暫無
暫無

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

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