2012-06-04 78 views
-1

我是C++新手,對Java很熟悉。我開始研究C++代碼的第一件事是,類本身(不是成員)沒有訪問說明符,如private,protectedpublic。例子herehere爲什麼C++類沒有類似Java的訪問說明符?

public class A { // This line. 
    private class B { } // Not this line. 
} 

這是爲什麼?

+10

你還沒看夠硬。 C++ **確實擁有類訪問修飾符。 – pb2q

+0

在你的例子中它甚至包含特權定義... –

+0

你可以用'private'來完成你編輯C++的狀態:public class A {private:class B {}; };'。 'private:'是可選的,因爲一切都默認爲私有。在對其不能做的事情做出假設之前,更多地調查語言可能是件好事。 –

回答

10

由於語言沒有的概念,所以在類的級別上沒有訪問修飾符。但在數據成員,成員函數和傳承的水平:

class Foo {}; 
class Bar : public Foo { 

public: 
    void bar() const {} 
private: 
    int bar_(float) {} 
    int a, b, c; 

}; 

,你可以得到的是聲明一個類的內部嵌套類最接近:

class Foo { 

    struct Bar0 { 
    void bar0() const {} 
    }; 
    struct Bar1 { 
    Bar0 b0; 
    Bar1() { b0.bar0();} 
    }; 

}; 
+2

問題是爲什麼不呢? –

+2

@OfekRon與回答「java爲什麼在類的級別上具有訪問控制」一樣困難。沒有包的概念,或沒有一個可以訪問私有類的實體,這並不意味着太多。 C++從來沒有這個概念,我想從未被認爲有必要介紹它。最後,這是一個設計決定。 – juanchopanza

+2

@OfekRon:在Java中,所有類都在包中,並且使它們變爲私有意味着它們只能在包中使用。在C++中,_global_命名空間中默認使用類。全局命名空間中的public/private是沒有意義的。如果您將它們移動到_any其他命名空間_,您可以將它們標記爲私有/公共。 –

4

不需要類級訪問說明符。如果您想要private類,則可以在實現文件或匿名namespace中對其進行定義。這種限制是在C++的文件級完成的(即如何組織您的頭文件,預處理程序指令)。

編輯之前:

他們這樣做,但他們沒有每個方法。此外,類別具有默認的private說明符,因此除非另有說明,否則它們是private

class A 
{ 
    void foo(); //private 
}; 
class B 
{ 
    void foo(); //private 
public: 
    void foo1(); //public 
    void foo2(); //public 
protected: 
    void foo3(); //protected 
private: 
    void foo4(); //private 
}; 

注1 C++也具有struct,這是相同,除了默認的訪問級別classpublic

注2在C++中沒有程序包範圍。在Java中,protected提供對整個包的訪問,在C++中它只是提供對派生類的訪問。

注3friend關鍵字可用於繞過限制,查找它。

+0

也許'struct'值得一提? – chris

+0

'struct'只是一個'class',默認爲'public'而不是'private'。 –

+0

@chris做了那個以及更多:) –

0

C++使用稍微不同的語法,其中訪問修飾符用於聲明,而不是單獨的組指定:

class Test { 
    class MyPrivateClass { 
    // ... 
    }; 

    void privateByDefault(); 

public: 
    void myPublicFunction(); 
    void anotherPublicFunction(); 

private: 
    void myPrivateFunction(); 

public: 
    class MyPublicClass { 
    // ... 
    }; 

    void morePublicFunctions(); 

protected: 
    // ... 
}; 

Test::MyPrivateClassTest不可訪問外部,而Test::MyPublicClass可用於任何地方。

+3

他正在討論文件範圍內實際_class_上的修飾符。 –

-1

從源:http://www.cplusplus.com/doc/tutorial/classes

一類的私有成員只能從他們的朋友同類或其他 成員中訪問。受保護的成員是 ,它們可以從同一班級的成員和他們的朋友 以及他們派生類的成員中訪問。最後,公共 成員可以從任何地方看到對象。

+0

問題是關於課堂可見性,而不是成員的知名度。 –