名前と修飾名
バイナリ スコープ解決演算子 (::) と共に使用される名前は、"修飾名" と呼ばれます。 バイナリ スコープ解決演算子の後ろに指定される名前は、演算子の左側で指定されたクラスのメンバーまたはその基底クラスのメンバーである必要があります。
メンバー選択演算子 (. または –>) の後ろに指定される名前は、演算子の左側で指定されたオブジェクトのクラス型のメンバーまたはその基底クラスのメンバーである必要があります。 メンバー選択演算子 (–>) の右側に指定される名前は、–> の左側がクラス オブジェクトであり、そのクラスで他のクラス型へのポインターに評価されるオーバーロードされたメンバー選択演算子 (–>) が定義されていれば、別のクラス型のオブジェクトにもできます。 この条件については、「クラス メンバーに対するアクセス」で詳しく説明します。
コンパイラは、次の順序で名前を検索し、名前が見つかると検索を停止します。
名前が関数内で使用されている場合は現在のブロック スコープを、それ以外の場合はグローバル スコープを検索する。
現在のブロックを囲む各ブロックを外側へ、(関数の引数が含まれる) 最も外側の関数スコープまで検索する。
名前がメンバー関数内で使用されている場合は、そのクラスのスコープで名前を検索する。
そのクラスの基底クラスで名前を検索する。
入れ子の外側のクラス スコープ (存在する場合) とその基底クラスを検索する。 最も外側を囲むクラス スコープが検索されるまで検索を続行する。
グローバル スコープを検索する。
ただし、この検索順序は、次のように変更できます。
:: の後ろの名前については、グローバル スコープから検索を開始する。
class、struct、および union の各キーワードの後ろの名前については、コンパイラは class、struct、または union 名のみを検索する。
スコープ解決演算子 (::) の左側にある名前は、class、struct、namespace、または union 名のいずれかである可能性のみを持つ。
名前が非静的メンバーを参照しているにもかかわらず、静的メンバー関数で使用されている場合は、エラー メッセージが生成されます。 同様に、名前が外側のクラスの非静的メンバーを参照している場合も、内側のクラスには外側のクラスの this ポインターがないため、エラー メッセージが生成されます。