2017-01-31 70 views
5

The Principle Engineer在我以前的公司有這樣的privatestatic方法應在實現文件來實現的功能,而不是作爲類方法的規則。私有靜態方法是否有必要?

我不記得是否有任何異常,他的統治。我在當前的工作中偶然發現了它的動機:如果所討論函數的參數或返回類型是需要在頭文件中包含定義文件的對象,這可能會造成不必要的困難。

這足以引導我走了以後再使用privatestatic方法,但在此之前我寫了他們關我想知道是否有人知道他們填補實現文件的功能不會利基的?

編輯:

一個例子可能會有幫助這裏。之所以這樣說,是class Foo的聲明,其中有其他的方法,這將在實現文件調用void foo()的開始:

class Foo { 
    static void foo(); 

所以foo是僅由Foo其他方法訪問。爲什麼我不能在實現文件中定義foo,並將它們一起放在頭部之外?

+0

@Downvoter是否有投票的理由?很顯然,如果你只是提供強制性的[tag:C++]問題的投票,不需要回復。 –

+1

訪問'private static'數據(例如,創建實例的計數)將需要一個類方法,而不是一個自由函數。 –

+0

那麼,如果該方法是「公共」或「受保護」,那將會如何呢?在你的問題中引用的規則並不能解釋爲什麼'私人'得到特殊待遇。 –

回答

2

成員函數可以訪問類的所有成員private。如果一個功能需要訪問這些成員,它應該是一個成員。這適用於是否是static

static函數是一個不特定對象上操作。但是,它仍然可以接收對象作爲參數。例如:

class A 
{ 
    int m; 

    static int process_3_objects_in_some_way(A x, A y, A z) 
    { 
     return x.m + y.m + z.m; 
    } 
} 

使功能static的另一個原因是參數的順序。例如,print

class A 
{ 
    int m; 

    static void print(std::ostream& stream, A x, int options) 
    { 
     stream << "Value is: " << (x.m * 1000000 + options); 
    } 
} 
+0

我猜你的第二個例子應該說'x.m'而不是'm'?很好的例子。 –

+0

是的;固定..... – anatolyg

+0

只是爲了保持戳,因爲這些是最好的例子,我希望我接受的答案至少可以編譯,我想你也想讓'print'返回一個'ostream'和'right? –

11

與自由站立static功能在實現文件中,私有靜態成員函數可以在類的頭使用。

class Demo { 
private: 
    static std::string sanitize(const std::string& name); 
    std::string name; 
public: 
    Demo(const std::string& n) : name(sanitize(n)) { 
    } 
}; 

做同樣具有獨立的靜態函數需要在CPP實施Demo的構造:當你想內聯非私有成員函數,它調用你的私人靜態函數這是情況很重要文件。

+0

這是一個很棒的例子。因此,例外情況應該是:「當標題中不需要該功能時」。 –

+1

@JonathanMee是的,我在C++的日子裏遵循了這條規則。類似於「將靜態函數和靜態變量放在靜態成員函數和靜態成員變量中,除非需要在類的頭文件中使用它們」。 – dasblinkenlight

+0

這比我的問題要好得多,我對這個問題的澄清評論已經清楚地證明了這一點。 –

1

friend函數或類,其在另一實現文件中實現的是在需要的私有靜態成員函數的另一個例子。

+0

'朋友'並不是我真正想要的東西,但我想這是這個規則的一個例外。 –

相關問題