我是C++新手,對Java很熟悉。我開始研究C++代碼的第一件事是,類本身(不是成員)沒有訪問說明符,如private
,protected
和public
。例子here和here。爲什麼C++類沒有類似Java的訪問說明符?
public class A { // This line.
private class B { } // Not this line.
}
這是爲什麼?
我是C++新手,對Java很熟悉。我開始研究C++代碼的第一件事是,類本身(不是成員)沒有訪問說明符,如private
,protected
和public
。例子here和here。爲什麼C++類沒有類似Java的訪問說明符?
public class A { // This line.
private class B { } // Not this line.
}
這是爲什麼?
由於語言沒有包的概念,所以在類的級別上沒有訪問修飾符。但在數據成員,成員函數和傳承的水平:
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();}
};
};
問題是爲什麼不呢? –
@OfekRon與回答「java爲什麼在類的級別上具有訪問控制」一樣困難。沒有包的概念,或沒有一個可以訪問私有類的實體,這並不意味着太多。 C++從來沒有這個概念,我想從未被認爲有必要介紹它。最後,這是一個設計決定。 – juanchopanza
@OfekRon:在Java中,所有類都在包中,並且使它們變爲私有意味着它們只能在包中使用。在C++中,_global_命名空間中默認使用類。全局命名空間中的public/private是沒有意義的。如果您將它們移動到_any其他命名空間_,您可以將它們標記爲私有/公共。 –
不需要類級訪問說明符。如果您想要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
,這是相同,除了默認的訪問級別class
是public
。
注2在C++中沒有程序包範圍。在Java中,protected
提供對整個包的訪問,在C++中它只是提供對派生類的訪問。
注3friend
關鍵字可用於繞過限制,查找它。
C++使用稍微不同的語法,其中訪問修飾符用於聲明,而不是單獨的組指定:
class Test {
class MyPrivateClass {
// ...
};
void privateByDefault();
public:
void myPublicFunction();
void anotherPublicFunction();
private:
void myPrivateFunction();
public:
class MyPublicClass {
// ...
};
void morePublicFunctions();
protected:
// ...
};
Test::MyPrivateClass
是Test
不可訪問外部,而Test::MyPublicClass
可用於任何地方。
他正在討論文件範圍內實際_class_上的修飾符。 –
從源:http://www.cplusplus.com/doc/tutorial/classes
一類的私有成員只能從他們的朋友同類或其他 成員中訪問。受保護的成員是 ,它們可以從同一班級的成員和他們的朋友 以及他們派生類的成員中訪問。最後,公共 成員可以從任何地方看到對象。
問題是關於課堂可見性,而不是成員的知名度。 –
你還沒看夠硬。 C++ **確實擁有類訪問修飾符。 – pb2q
在你的例子中它甚至包含特權定義... –
你可以用'private'來完成你編輯C++的狀態:public class A {private:class B {}; };'。 'private:'是可選的,因爲一切都默認爲私有。在對其不能做的事情做出假設之前,更多地調查語言可能是件好事。 –