簡體   English   中英

靜態與 const 成員函數

[英]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 成員函數。 如果它將與多個參數一起使用,我傾向於堅持使用靜態版本。 是否還有其他我沒有想到的因素會說服我做出不同的選擇?

編輯:我認為我對自己的解釋很差,所以我在示例中添加了定義。

  1. static函數不能使用任何非靜態成員函數或變量。

  2. static函數不能被多態覆蓋。

  3. 您可以獲取static函數的地址

  4. 您不需要類的實例來調用static函數。

  5. 成員函數標記const可以訪問類成員,調用其他const的功能,並且如果標記被重寫多態virtual

const后面的const表示“此函數不修改任何類成員 [除了標記為mutable ]。

static意味着“此函數沒有傳遞給函數的隱藏this指針”,因此實際上就像任何不屬於該類的自由函數一樣,只是它在類內部有點“命名空間”。

它們是完全不同的“動物”。

編輯:這真的歸結為對類/系統設計最有意義的東西。 對於實際上不屬於類的事物使用static函數通常是正確的。 我很少使用static函數,因為它們沒有什么意義,除非在一些非常特殊的情況下——這里要問的問題是,“如果我把它設為靜態,為什么它是這個類的一部分?”,如果答案是“因為它屬於類”,那么它應該是一個static函數。 另一方面,如果答案不是一個可靠的理由,那么它可能不屬於類,最終應該在源文件中作為靜態自由函數(可能在匿名命名空間中),而不是在類中.

在我的編譯器項目(總共大約 13,000 行 C++ 代碼)中,我有:

  • 一個static成員函數(將字符串轉換為令牌類中的關鍵字令牌 - 因為它在令牌本身的構造過程中被調用,因此不適合作為成員函數)。
  • .cpp 文件中大約有 50 個不是成員函數的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.

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