ネストされたクラスとローカルクラスはほとんど仕事で使用されていない、そしてデザインに置換されていてもよく、ここだけ簡単に説明しました。
1)ローカルクラス
クラス定義内のローカルクラスが機能しています。形式:
INT = 100ヴァル、
ボイドのfoo(int型のVal)
{
struct Bar
{
};
class Bar::InsideClass//定义InsideClass类
{
};
}
2)ネストされたクラス
、ネストされたクラスが別のクラスで定義されたクラスです。フォーム:
クラスインターフェース
{
パブリック:
仮想ボイド楽しい()= 0;
};
テンプレート<クラスT、クラスP>
インターフェイス*人(CONST T&OBJ、CONST P&アルギニン)
{
int型X;
クラスローカル:パブリック・インタフェース
{
公共。
ローカル(CONST T&OBJ、CONST P&アルギニン)
:OBJ (OBJ)のArg(アルギニン){}
仮想ボイド楽しい()
{
}
プライベート:
T A、
P B;
};
戻り新しい新しいローカル(OBJ、アルギニン);
}
ネストされたクラスは、クラス内で宣言されなければならないが、クラス内または外で定義されてもよいです。外側のクラスの外側入れ子になったクラスを定義する場合、クラスのレイヤー名以外は、ネストされたクラスの名前を定義しなければなりません。
入れ子になったクラス名は包含するクラスで表示されます。
したがって、プライベートクラスのクラスメンバーや友人のメンバーのみへのアクセス権を持っている、とは、囲むクラスのネストされたクラスのprivateメンバにアクセスすることはできません。ネストされたクラス(オブジェクト、ポインタまたは参照を介して)クラスの周辺部材にアクセスすることができます。
良いデザインネストされたクラス:ネストされたクラスはプライベートに設定する必要があります。入れ子になったクラスのメンバーとメソッドはpublicに設定することができます。
ネストされたクラスを直接囲むクラスの静的メンバ、タイプ名(のtypedef)、列挙値にアクセスすることができます。
(内部および外部のクラス分類)
1.1スコープ
文の入れ子になったクラスの位置はつまり、それはプログラムの一部がクラスネストされたオブジェクトを作成することができると判断し、入れ子になったクラスのスコープを決定します。
ネストされたクラスは、クラスのプライベートな部分で宣言された場合は、ネストされたクラスのクラスのみが外部にそれを知ることができます。上記のクラスは、ケースです。
保護部は、クラスのクラス宣言内にネストされている場合、後者のためにそれが表示されて、外の世界には見えません。派生クラスは、その入れ子になったクラスを知っている、あなたは直接オブジェクトのこのタイプを作成することができます。
あなたは、後者は、派生クラスと外部の世界を使用することができますクラスのクラス宣言の公開部分にネストされている場合。そして、外部の使用は、のようなクラスの範囲外の外側のクラス修飾子に追加する必要があります。NestedClass使用、あなたがそのように定義されるべきで勝る:: NestedClass nestedInstance。
ネストされたスコープと同じ構造で、ここに列挙しました。多くのプログラマは、公共列挙型クラスは一定の顧客の使用を提供する使用します。
次の表は、クラス、構造体、列挙ネストされたスコープを特徴とする、まとめたもの。
1.2アクセス
クラスのネストされたクラス外で宣言は、外部クラスにネストされたクラスのアクセスを与えていなかった、任意の外部クラスのネストされたクラスへのアクセス権を与えるものではありません。同じ一般的なクラスのアクセス制御(プライベート、パブリック、保護されました)。
ローカルクラスの
クラスは、ローカルクラス定義は、可視の範囲の唯一のタイプを定義し、このクラスはローカルクラスと呼ばれ、関数内で定義されてもよいです。
あなたは、ローカルクラス変数関数のスコープを使用することはできません。
ローカルクラスは、関数のスコープ内にカプセル化されており、何も隠していない情報の提供を通じて、さらにカプセル化が必要になります。
次に、クラスローカルクラス内でネストすることができる場合には、定義を入れ子にすることができるクラスは、ローカルクラスとローカルクラス同じ範囲の外に生じます。
このクラスおよびそれによって作成されたオブジェクトは、関数スコープに限定される(C ++のメンバ関数であるクラスで定義された関数の関数.C ++関数で定義することができない)、クラス内のすべてのメンバ関数を実装する必要があり、クラスの外へ出るません。ネストされた関数が定義されていないので、クラスの静的データメンバを含む場合、この機能は外に初期化する必要があります。クラス内の静的関数メンバを含まない、静的なローカル変数に加えて、カテゴリがその機能によって定義されたパッケージの外で使用することはできません。
C ++の内部クラスとJavaの内部クラスとの間の差である:
C ++の内部クラス・オブジェクト外部オブジェクトはクラスオブジェクトの外側に非静的メンバにアクセスすることができないポインタではなく、Javaの非静的内部クラス・オブジェクトは、外部クラスのオブジェクトへのポインタを有し、外部へのアクセス非静的メンバクラスのオブジェクト。
ローカルクラスデモサンプル
のint A;
ボイド楽しい()
{
静的int型S;
クラスA
{
パブリック:
INITを無効(INT I)S = {I;}
};
M;
m.init(10);
}
変換の種類を達成するために使用される2ローカルクラスの別の使用
クラスインターフェースを
{
パブリック:
仮想ボイド楽しい()= 0;
};
テンプレート<クラスT、クラスP>
インターフェイス* MakeAdapter(CONST T&OBJ、CONST P&アルギニン)
{
int型X;
クラスローカル:パブリック・インタフェース
{
パブリック:
ローカル(CONST T&OBJ、CONST P&アルギニン)
:OBJ (OBJ)のArg(アルギニン){}
仮想ボイド楽しい()
{
X = 100;
OBJ は.call(アルギニン);
}
プライベート:
T OBJ ;
PのArg ;
};
ローカル新しい新しい(OBJ、アルギニン)を返します;
}
。埋め込みクラスは
、本体のクラス定義内の別のクラスです。周辺のカテゴリと呼ばれる外部のクラス。それによって作成されたクラスとオブジェクトは、外側のクラスの範囲に限定されます。
私は、すべてのアクセスについての内部クラスの外にされて使用することができ、使用する内周クラス::クラスのフォーマットを設定するために、使用している場合。
別のクラスは、進化的関係の種類の組み合わせ、すなわち、組み合わせ、又は集約クラスの他のメンバーで生成するが、クラスが内層に生成されていない、インナークラスのメンバ関数は、クラス内に実装することができ、クラスは、外側層の外側であってもよいです実施します。
内部クラスのメンバ関数は、外側のクラスのメンバーへのアクセス、およびその逆を持っていません
クラス名を非表示にネストされたクラスを定義する目的は、それによって、オブジェクトクラスを作成するためにユーザを使用する能力を制限し、全体的な識別子を減少させました。これは、メインの抽象クラスとの関係から、二つのクラスを強調(周辺入れ子になったクラスおよびクラス)の間に増加することができます。
1次の入れ子になったクラスの例である
クラスA
{
:パブリック
クラスB
{
パブリック:
...
:プライベート
...
;}
ボイドF();
プライベート:
int型A;
}
ネストされたクラスがクラスBである、クラスAは、周辺でクラスA、インビボでクラスAのクラスBの定義。
ネストされた(注2)のいくつかの種類:
図1に示すように、スコープの観点から、ネストされたクラスが隠されている、クラス名のみクラスのクラスの周辺部の周囲で使用されています。あなたは、囲むクラスのドメインの役割でクラス名を使用する場合は、制限の名前を追加する必要があります。
アクセス権の観点から、その囲むクラスの入れ子になったクラス名とオブジェクト名のメンバーが同じアクセスルールを持っている2、。オブジェクトは、クラスをネストされたプライベートメンバ関数にアクセスすることはできません、と囲むクラス入れ子になったクラスのプライベートな部分にオブジェクトを作成することはできません。
図3に示すように、ネストされたクラスのメンバ関数は、インビトロで、そのクラスで定義することができます。
図4に示すように、周辺部材は、入れ子説明クラス、およびその逆に、オブジェクトのクラスのメンバーではありません。ネストされたクラスのメンバ関数は、包含するクラスのメンバーへのアクセス、およびその逆を持っていません。この国は、周辺機器等とのアクセスネストされたクラスのメンバーとの関係の分析では、処理するために、非入れ子になったクラスの入れ子になったクラスとして見られる傾向にあります。
上述のネストされたクラスは、以下の形式で書くことができます。
クラス
{
パブリック:
ボイドF();
プライベート:
INT A;
};
クラスB
{
パブリック:
...
プライベート:
...
};
見られるプライマーは、ネストされたクラスは単に文法に埋め込まれています。
5、友人は、ネストされたクラスは、囲むクラスのメンバーへのアクセスを持っていない説明しました。
図6に示すように、ネストされたクラスのみ包含するクラスに記述することができ、複雑なネストされたクラスと、ネストされたクラスについての詳細な内容は、末梢ドメインファイルインビトロで定義することができます。