[英]static vs const member functions
我發現很難決定何時使用私有靜態成員函數以及何時使用私有 const 成員函數。
假設我們有一個方法 DoSomething() 需要檢查一個或多個成員是否為某物:
class Foo
{
public:
void DoSomething()
{
// if(IsASomething()) ...
// or
// if(IsSomething(a_)) ...
private:
int* a_;
int* b_;
static bool IsSomething(int* n) {return n != null;}
bool IsASomething() const { return a_ != null;}
bool IsBSomething() const{ return b_ != null;}
};
當一個輔助函數只能以一種方式使用時(比如只檢查 a_ 是否是某物),我傾向於使用 const 成員函數。 如果它將與多個參數一起使用,我傾向於堅持使用靜態版本。 是否還有其他我沒有想到的因素會說服我做出不同的選擇?
編輯:我認為我對自己的解釋很差,所以我在示例中添加了定義。
static
函數不能使用任何非靜態成員函數或變量。
static
函數不能被多態覆蓋。
您可以獲取static
函數的地址。
您不需要類的實例來調用static
函數。
成員函數標記const
,可以訪問類成員,調用其他const
的功能,並且如果標記被重寫多態virtual
。
const
后面的const
表示“此函數不修改任何類成員 [除了標記為mutable
]。
static
意味着“此函數沒有傳遞給函數的隱藏this
指針”,因此實際上就像任何不屬於該類的自由函數一樣,只是它在類內部有點“命名空間”。
它們是完全不同的“動物”。
編輯:這真的歸結為對類/系統設計最有意義的東西。 對於實際上不屬於類的事物使用static
函數通常是正確的。 我很少使用static
函數,因為它們沒有什么意義,除非在一些非常特殊的情況下——這里要問的問題是,“如果我把它設為靜態,為什么它是這個類的一部分?”,如果答案是“因為它屬於類”,那么它應該是一個static
函數。 另一方面,如果答案不是一個可靠的理由,那么它可能不屬於類,最終應該在源文件中作為靜態自由函數(可能在匿名命名空間中),而不是在類中.
在我的編譯器項目(總共大約 13,000 行 C++ 代碼)中,我有:
static
成員函數(將字符串轉換為令牌類中的關鍵字令牌 - 因為它在令牌本身的構造過程中被調用,因此不適合作為成員函數)。static
函數。 它們執行以下操作:
IsConstant()
用於某些表達式
return false
實現,對於相對罕見的情況]如果可能,我傾向於在未命名的命名空間中使用自由函數。
所以之間
// header
class A
{
public:
bool HasCustomProperty() const();
private:
bool IsOdd() const;
bool IsHappy() const;
private:
int a;
};
// cpp
bool A::HasCustomProperty() const
{
return IsOdd() && IsHappy();
}
和
// header
class A
{
public:
bool HasCustomProperty() const();
private:
static bool IsOdd(int n);
static bool IsHappy(int n);
private:
int a;
};
// cpp
bool A::HasCustomProperty() const
{
return IsOdd(a) && IsHappy(a);
}
和
// header
class A
{
public:
bool HasCustomProperty() const();
private:
int a;
};
// cpp
namespace {
bool IsOdd(int n);
bool IsHappy(int n);
}
bool A::HasCustomProperty() const
{
return IsOdd(a) && IsHappy(a);
}
我選擇最后一個。
它們是兩種不同的東西,不是替代品:
const 成員函數不允許修改類即時數據。 靜態成員函數沒有關聯的類實例。
使用 OP 的示例類定義然后在 inplementstion ...
bool Foo::IsSomething(int* n)
{
return *n < *a_; // not ok. static method has no this
}
bool Foo::IsASomething() const
{
return (*a_ > 8) // ok as member a_ not changed
}
bool Foo::IsASomething() const
{
*a_ +=4; // not ok as a_ cannot be changed by const member
return (*a_ > 8);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.