ID のスコープ とは、ID を使用してオブジェクトを参照することができるプログラム・テキストの 最大領域のことです。 C++ では、参照されるオブジェクトは固有である必要があります。ただし、このオブジェクトにアクセスするための名前、 つまり ID 自体は再使用することができます。ID の意味は、ID が使用されるコンテキストによって変わります。 スコープは、名前の意味を差別化するために使用される一般的なコンテキストです。
ID のスコープは不連続になる場合があります。 不連続なスコープが生じるケースの 1 つは、別のエンティティーを宣言するために同じ名前を再使 用して、格納対象の宣言領域 (内部) と格納先の宣言領域 (外部) を作成した場合です。 したがって、宣言する場所がスコープを決定する要因になります。 不連続スコープの可能性を活用することは、情報隠蔽 技術の基礎です。
C におけるスコープの概念は、C++ で拡張および洗練化されています。次の表に、スコープの 種類、および用語の若干の違いを示します。
スコープの種類 | |
![]() |
![]() |
---|---|
ブロック | ローカル |
関数 | 関数 |
関数プロトタイプ | 関数プロトタイプ |
ファイル (グローバル) | グローバル・ネーム・スペース |
namespace | |
class |
すべての宣言において、ID は、初期化指定子の前のスコープにあります。 次の例は、このことを示しています。
int x; void f() { int x = x; }
関数 f() の中で宣言された x は、ローカル・スコープを持ってい ます (グローバル・ネーム・スペース・スコープではありません)。
このセクションでのここから先の説明は、C++ だけに適用されます。
グローバル・スコープ またはグローバル・ネーム・スペース・スコープ は、 オブジェクト、関数、型、およびテンプレートを定義できるプログラムの最外部のネーム・スペース・スコープです。 ネーム・スペース定義を使用して、グローバル・スコープ内でユーザー定義のネーム・スペースをネストすることができます。ユーザー定義のネーム・スペースは、それぞれグローバル・スコープと区別される別のスコープになります。
クラスのフレンドとして最初に宣言された関数名は、 クラスを囲む、最内部の非クラスのスコープに入っています。 外部ネーム・スペースで最初に宣言される関数名は、フレンド宣言として使用されません。 以下に例を示します。
int f(); namespace A { class X { friend f(); // refers to A::f() not to ::f(); } f() { /* definition of f() */ } }
フレンド関数が別のクラスのメンバーの場合は、この関数にはその別のクラスのスコープが あります。クラスのフレンドとして最初に宣言されたクラス名のスコープは、 最初の非クラスの囲みスコープです。
クラスの暗黙宣言は、 同じクラスの別の宣言が見えるまでは可視になりません。
関連参照