[英]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.