スコープ規則の概要

名前の使用はスコープ内で明確である必要があります (オーバーロードが決定される段階まで)。 名前が関数を表している場合、関数はパラメーターの数と型に対し明確でなければなりません。 名前が明確なままの場合、メンバー アクセス規則が適用されます。

Constructor Initializers (コンストラクター初期化子)

コンストラクターの初期化子は、その初期化子が指定されたコンストラクターの最も外側のブロックのスコープ内で評価されます。 したがって、初期化子は、コンストラクターのパラメーター名を使用できます。

Global Names (グローバルな名前)

オブジェクト、関数、または列挙子の名前が関数やクラスの外側に記述されているか、またはグローバル スコープの単項演算子 (::) が先頭に付加されており、以下のいずれかの二項演算子と共に使用されていない場合、その名前はグローバルと見なされます。

  • スコープ解決 (::)

  • オブジェクトと参照のメンバー選択 (.)

  • ポインターのメンバー選択 (->)

修飾名

バイナリ スコープ解決演算子 (::) と共に使用される名前は、"修飾名" と呼ばれます。バイナリ スコープ解決演算子の後ろに指定される名前は、演算子の左側で指定されたクラスのメンバーまたはその基底クラスのメンバーである必要があります。

メンバー選択演算子 (. または ->) の後ろに指定される名前は、演算子の左側で指定されたオブジェクトのクラス型のメンバーまたはその基底クラスのメンバーである必要があります。 メンバー選択演算子 (->) の右側に指定される名前は、-> の左側がクラス オブジェクトであり、そのクラスで他のクラス型へのポインターに評価されるオーバーロードされたメンバー選択演算子 (->) が定義されていれば、別のクラス型のオブジェクトにもできます。 (この条件については、「クラス メンバーに対するアクセス」で詳しく説明します。)

コンパイラは、次の順序で名前を検索し、名前が見つかると検索を停止します。

  1. 名前が関数内で使用されている場合は現在のブロック スコープを、それ以外の場合はグローバル スコープを検索する。

  2. 現在のブロックを囲む各ブロックを外側へ、(関数のパラメーターが含まれる) 最も外側の関数スコープまで検索する。

  3. 名前がメンバー関数内で使用されている場合は、そのクラスのスコープで名前を検索する。

  4. そのクラスの基底クラスで名前を検索する。

  5. 入れ子の外側のクラス スコープ (存在する場合) とその基底クラスを検索する。 最も外側を囲むクラス スコープが検索されるまで検索を続行する。

  6. グローバル スコープを検索する。

ただし、この検索順序は、次のように変更できます。

  1. :: の後ろの名前については、グローバル スコープから検索を開始する。

  2. classstructunion の各キーワードの後ろの名前については、コンパイラは classstruct、または union 名のみを検索する。

  3. スコープ解決演算子 (::) の左側にある名前は、classstructnamespace、または union 名のいずれかである可能性のみを持つ。

名前が非静的メンバーを参照しているにもかかわらず、静的メンバー関数で使用されている場合は、エラー メッセージが生成されます。 同様に、名前が外側のクラスの非静的メンバーを参照している場合も、内側のクラスには外側のクラスの this ポインターがないため、エラー メッセージが生成されます。

関数のパラメーター名

関数定義内の関数のパラメーター名は、関数本体の最も外側のブロックのスコープ内にあると見なされます。 したがって、それらの引数名はローカル名であり、関数が終了するとスコープ外に出ます。

関数宣言 (プロトタイプ) 内の関数のパラメーター名はローカル スコープにあり、宣言の終了時にスコープ外に出ます。

既定のパラメーターは、上記で説明したとおり、それらを既定とするパラメーターのスコープ内にあります。 ただし、ローカル変数や非静的クラス メンバーにはアクセスできません。 既定のパラメーターは、関数呼び出しの時点で評価されますが、関数宣言の元のスコープで評価されます。 したがって、メンバー関数の既定のパラメーターは、常にクラス スコープで評価されます。

関連項目

継承