2014-12-22 30 views
0

我正在從java背景學習C++。我想知道如何在命名空間中創建一個私有函數?如何在C++中使用私有函數

我想這樣做的CPP

的Java:

public class Clazz { 
    public static void foo() { 
     // stuff 
    } 

    private static void bar() { 
     // other stuff 
    } 
} 

C++:

namespace clazz { 
    void foo(); 

    // what do I do here? 
} 
+1

誰應該能夠調用命名空間的私有函數? – dreamlax

+0

只有foo應該能夠訪問私有函數。 – user1811367

+0

這兩個例子並不相同。第一個是類範圍,另一個是命名空間範圍。 – 0x499602D2

回答

0

有在命名空間的私有函數在C++中。默認情況下

namespace clazz { 
    namespace detail { 
     void bar(); 
    } 

    void foo(); 
} 
+0

如何聲明/使用欄? – user1811367

+0

@ user1811367在'foo()'內部,你可以把它稱爲'detail :: bar();'。* /}}'(假設你已經在'namespace clazz'中)。 – cdhowie

+0

在這個例子中'bar'仍然有外部鏈接 –

0

在C++ class成員函數是private:一般人使用一個命名空間專門用於具體實施細節。

你可以說,明確地通過使用訪問符,像這樣:

private: 

效果持續,直到在類的下一個訪問符,或類定義的結束。

與Java的一個區別是C++私有成員函數不是最終的。當它們是virtual時,它們可以在派生類中重寫。在C++中,被覆蓋的成員函數通常是私有的。


C++命名空間不具有可訪問性。

實際上它們都是public


Boost庫使用慣例,其中一個名爲detail嵌套命名空間是被視爲一個實現細節,就好像它是私有的。

更直接的命名可能是implimplementation

這樣的約定足以防止意外對實現細節的訪問和依賴。

1

如果您想限制非實例方法的訪問權限,您必須在類上使其成爲static方法。例如。在C++:

class clazz 
{ 
    public: 
    static void foo(); 

    private: 
    static void bar(); 
}; 

值得一提的是,如果你只在一個.cpp文件使用bar,您可以使用匿名命名空間,以防止它被其他地方訪問。所以,你有這樣的:

clazz.h:

namespace clazz 
{ 
    void foo(); 
} 

clazz中。CPP:

#include "clazz.h" 

namespace 
{ 
    // bar can only be used in this file 
    void bar() { /* bar implementation */ } 
} 

void clazz::foo() { /* foo implementation */ } 
0

的「C++的方式」來解決這個問題是使用一個命名空間爲你所做的一切,並給bar內部鏈接。

clazz::bar()將可從此源文件的任何位置調用,而不僅僅是從foo()。保持其內部namespace clazzprotects against Murphy, not Machiavelli。如果能見度是一個真正的問題,那麼你既可以:

  • 單獨的代碼到多個源文件,以便該文件僅包含foobar
  • 使用class只有靜態成員函數,作爲一個黑客

的內部鏈接的最簡單的語法是:

static void bar() { } 

雖然你可以使用匿名命名空間來代替。

0

從Java開始,您可能沒有意識到在C++中,實現通常在類(.h,.hpp)的聲明中的單獨文件(.cpp,.cc)中。對於只需要存在於一個cpp文件中的實用程序函數最好的做法是將它們放置在一個匿名命名空間中。

namespace { 
void my_utility_function(const Something &something { 
    // bunch of code 
} 
} // close namespace 

此功能是可見的任何地方在這個CPP前進檔,但其他地方沒有。所以需要my_utility_function的類方法在這裏實現。

當一個函數在一個命名的命名空間中時,鏈接器將爲它發送數據,並浪費時間在程序的其他地方尋找使用。即使您避免名稱衝突(通過使用名稱空間),也是浪費CPU。這也是文件它基本上是私人的。在C中,一個標記爲功能static的功能效果相同,但static有許多不同的含義,並且AFAIK匿名命名空間是較好的樣式。

如果整個cpp文件位於命名空間中,則可以將匿名命名空間嵌套在命名命名空間中。

相關問題