メンバーのスコープ
メンバーのスコープ:インデックス への移動
インライン関数と例外の例にある X::func() という式は,「func は,クラスの外部で定義されているが X のメンバー関数であり,X のスコープ内に存在している」ことを示すために,クラス名 X をスコープアクセス修飾子とともに使っています。X:: の影響は,定義本体内全体に及びます。これによって,func が返す i が,なぜグローバルな int i ではなく,X の char* i である X::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); // どこかで定義
};
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 は限定名(qualified name)と呼ばれ,m と同じ型を持ち,m が左辺値の場合にのみ左辺値になります。注意しなければならないのは,クラス名 X が型のない名前によって隠されていても,限定名 X::m は正しいクラスメンバー m にアクセスするということです。
クラスメンバーを,プログラムの別のセクションでそのクラスに追加することはできません。クラス X がクラス X のオブジェクトを持つことはできませんが,クラス X のオブジェクトへのポインタあるいは参照を持つことはできます(C の構造体および共用体に似ている点に注意してください)。