スコープ規則の概要
名前の使用はスコープ内で明確である必要があります (オーバーロードが決定される段階まで)。 名前が関数を表している場合、関数はパラメーターの数と型に対し明確でなければなりません。 名前が明確なままの場合、メンバー アクセス規則が適用されます。
Constructor Initializers (コンストラクター初期化子)
コンストラクターの初期化子は、その初期化子が指定されたコンストラクターの最も外側のブロックのスコープ内で評価されます。 したがって、初期化子は、コンストラクターのパラメーター名を使用できます。
Global Names (グローバルな名前)
オブジェクト、関数、または列挙子の名前が関数やクラスの外側に記述されているか、またはグローバル スコープの単項演算子 (::
) が先頭に付加されており、以下のいずれかの二項演算子と共に使用されていない場合、その名前はグローバルと見なされます。
スコープ解決 (
::
)オブジェクトと参照のメンバー選択 (.)
ポインターのメンバー選択 (->)
修飾名
バイナリ スコープ解決演算子 (::
) と共に使用される名前は、"修飾名" と呼ばれます。バイナリ スコープ解決演算子の後ろに指定される名前は、演算子の左側で指定されたクラスのメンバーまたはその基底クラスのメンバーである必要があります。
メンバー選択演算子 (. または ->) の後ろに指定される名前は、演算子の左側で指定されたオブジェクトのクラス型のメンバーまたはその基底クラスのメンバーである必要があります。 メンバー選択演算子 (->) の右側に指定される名前は、-> の左側がクラス オブジェクトであり、そのクラスで他のクラス型へのポインターに評価されるオーバーロードされたメンバー選択演算子 (->) が定義されていれば、別のクラス型のオブジェクトにもできます。 (この条件については、「クラス メンバーに対するアクセス」で詳しく説明します。)
コンパイラは、次の順序で名前を検索し、名前が見つかると検索を停止します。
名前が関数内で使用されている場合は現在のブロック スコープを、それ以外の場合はグローバル スコープを検索する。
現在のブロックを囲む各ブロックを外側へ、(関数のパラメーターが含まれる) 最も外側の関数スコープまで検索する。
名前がメンバー関数内で使用されている場合は、そのクラスのスコープで名前を検索する。
そのクラスの基底クラスで名前を検索する。
入れ子の外側のクラス スコープ (存在する場合) とその基底クラスを検索する。 最も外側を囲むクラス スコープが検索されるまで検索を続行する。
グローバル スコープを検索する。
ただし、この検索順序は、次のように変更できます。
::
の後ろの名前については、グローバル スコープから検索を開始する。class
、struct
、union
の各キーワードの後ろの名前については、コンパイラはclass
、struct
、またはunion
名のみを検索する。スコープ解決演算子 (
::
) の左側にある名前は、class
、struct
、namespace
、またはunion
名のいずれかである可能性のみを持つ。
名前が非静的メンバーを参照しているにもかかわらず、静的メンバー関数で使用されている場合は、エラー メッセージが生成されます。 同様に、名前が外側のクラスの非静的メンバーを参照している場合も、内側のクラスには外側のクラスの this
ポインターがないため、エラー メッセージが生成されます。
関数のパラメーター名
関数定義内の関数のパラメーター名は、関数本体の最も外側のブロックのスコープ内にあると見なされます。 したがって、それらの引数名はローカル名であり、関数が終了するとスコープ外に出ます。
関数宣言 (プロトタイプ) 内の関数のパラメーター名はローカル スコープにあり、宣言の終了時にスコープ外に出ます。
既定のパラメーターは、上記で説明したとおり、それらを既定とするパラメーターのスコープ内にあります。 ただし、ローカル変数や非静的クラス メンバーにはアクセスできません。 既定のパラメーターは、関数呼び出しの時点で評価されますが、関数宣言の元のスコープで評価されます。 したがって、メンバー関数の既定のパラメーターは、常にクラス スコープで評価されます。
関連項目
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示