メンバのスコープ
メンバのスコープ:インデックス への移動
「インライン関数」の例にある X::func()
という式では、クラス名 X がスコープ修飾子と一緒に使用されていますが、これは "func はクラスの "外部" で定義されてはいるが、確かに X のメンバ関数であり X のスコープ内に存在している" ということを示しています。X:: の影響は定義の本体に及びます。func から返される i がグローバルな int i ではなく X::i(X の char* i)を参照している理由がこれでわかります。X:: 修飾子がなければ、関数 func は普通のクラス外関数を表し、グローバルな int i を返すことになります。
メンバ関数はすべて、たとえクラスの外部で定義されていても、そのクラスのスコープ内にあります。
クラス X のデータ メンバは、選択演算子 . や -> を使って参照することができます(C の構造体の場合と同様)。メンバ関数は、選択演算子を用いて呼び出すこともできます(「キーワード this」を参照)。以下に例を示します。
class X { public: int i; char name[20]; X *ptr1; X *ptr2; void Xfunc(char*data, X* left, X* right); // define elsewhere }; void f(void); { X x1, x2, *xptr=&x1; x1.i = 0; x2.i = x1.i; xptr->i = 1; x1.Xfunc("stan", &x2, xptr); }
m がクラス X のメンバまたは基底メンバの場合、式 X::m は修飾名と呼ばれます。これは m と同じ型で、m が左辺値の場合にのみ左辺値になります。注意しなければならないのは、たとえクラス名 X が型以外の名前で隠蔽されていても、修飾名 X::m で正しいクラス メンバ m にアクセスできるということです。
クラス メンバをプログラムの別のセクションでクラスに追加することはできません。クラス X はクラス X のオブジェクトをメンバとして含むことはできませんが、クラス X のオブジェクトのポインタまたは参照を含むことはできます(C の構造体型や共用体型と似ている点に注意)。