C++ スコープ規則のまとめ

提供: RAD Studio
移動先: 案内検索

C++ のスコープ:インデックス への移動

以下に示した規則は,typedef 名,クラス名も含めたすべての名前に適用されます。ただし,以下の条件を満たす場合に限ります。

  • 名前それ自体があいまいでないかどうかテストされる。そのスコープ内であいまいさがない場合には,アクセス手順が開始される
  • アクセス制御エラーが起きなければ,そのオブジェクトの型,関数,クラス,typedef などがテストされる
  • 名前が関数およびクラスの外部で使用されているか,名前の前に単項スコープアクセス演算子 :: が付いていて,なおかつ,その名前が二項 :: 演算子あるいはメンバー選択演算子(. または -)によって限定されていない場合には,その名前はグローバルオブジェクト,関数,あるいは列挙型でなければならない
  • 名前 n が,X::n,x.n(x は X のオブジェクトあるいは X への参照),あるいは ptr->n(ptr は X へのポインタ)の形式で使われている場合,n は X のメンバーの名前か,あるいは X が派生した基本クラスのメンバー
  • 以上の条件に該当せず,静的メンバー関数内で使用されるすべての名前は,その名前が使われたブロックあるいは封入ブロック内で宣言されたものか,あるいはグローバル名でなければならない。ローカル名 n の宣言は,封入ブロック内の n の宣言と n のグローバル宣言を隠ぺいする。異なるスコープ内の名前はオーバーロードされない
  • 以上の条件に該当せず,クラス X の非静的メンバー関数内で使用されるすべての名前は,その名前が使われたブロックあるいは封入ブロック内で宣言されたものか,クラス X のメンバーあるいは X の基本クラスであるか,あるいはグローバル名でなければならない。ローカル名 n の宣言は,封入ブロック内の n,その関数のクラスのメンバー,および n のグローバル宣言を隠ぺいする。メンバー名の宣言は,基本クラス内の同じ名前の宣言を隠ぺいする
  • 関数定義内の関数引数名は,その関数のもっとも外側のスコープ中にある。定義を行わない関数宣言中の関数引数名はスコープをまったく持たない。デフォルト引数のスコープは,それの引数の宣言の位置によって決定されるが,それはローカル変数または非静的クラスメンバーにアクセスできない。デフォルトの引数は,各呼び出し時に評価される
  • コンストラクタ初期化子は,そのコンストラクタのもっとも外側のブロックのスコープ内で評価されるため,コンストラクタの引数名を参照できる

関連項目