私は C++ は初めてで、Java には精通しています。C++ コードを調べ始めたときに最初に疑問に思ったのは、(メンバーではなく) クラス自体private
にprotected
やなどのアクセス指定子がないことですpublic
。例こことここ.
public class A { // This line.
private class B { } // Not this line.
}
どうしてこんなことに?
言語にはpackageの概念がないため、クラスのレベルにアクセス修飾子はありません。しかし、データ メンバー、メンバー関数、および継承のレベルには次のようなものがあります。
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();}
};
};
クラスレベルのアクセス指定子は必要ありません。クラスが必要な場合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
a と同じです。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
どこでも使用できます。
ソースから: http://www.cplusplus.com/doc/tutorial/classes
クラスのプライベート メンバーは、同じクラスの他のメンバー内またはその友達からのみアクセスできます。保護されたメンバーは、同じクラスのメンバーとその友人からアクセスできますが、派生クラスのメンバーからもアクセスできます。最後に、パブリック メンバーは、オブジェクトが表示されている場所ならどこからでもアクセスできます。