メンバー関数 とは、クラスのメンバーとして宣言される演算子および関数のことです。
メンバー関数には、friend 指定子を用いて宣言される演算子および関数は含まれません。
これらは、クラスのフレンド と呼ばれます。
メンバー関数を static として宣言できます。
これは、静的メンバー関数 と呼ばれます。
static として宣言されていないメンバー関数は、非静的メンバー関数 と呼ばれます。
クラス A の x という名前のオブジェクトを作成し、クラス A には、 非静的メンバー関数 f() があるとします。 関数 x.f() を呼び出す場合、f() の本体にあるキーワード this は、x のアドレスとなります。
メンバー関数の定義は、それを囲むクラスのスコープ内にあります。 メンバー関数の定義が、クラス・メンバーのそのメンバーの宣言の前にある場合であっても、メンバー関数の本体は、 クラス宣言の後で分析され、そのクラスのメンバーを、メンバー関数の本体で使用できるようにします。 以下の例では、関数 add() が呼び出されるとき、データ変数の a、b、および c を add() の本体で使 用することができます。
class x { public: int add() // inline member function add {return a+b+c;}; private: int a,b,c; };
インライン・メンバー関数
クラス定義の内部にメンバー関数を定義するか、またはクラス定義にメンバー関数をすでに宣言している (しかし、定義はされていない) 場合は、 メンバー関数をクラス定義の外側で定義できます。
そのクラス・メンバー・リスト内で定義されるメンバー関数は、インライン・メンバー関数 と呼ばれます。 コードを数行含んでいるメンバー関数は、通常インラインで宣言されます。 上記の例では、add() がインライン・メンバー関数です。 クラス定義の外側にメンバー関数を定義する場合、メンバー関数は、クラス定義を囲むネーム・スペース・スコープ内に入れる必要があります。 スコープ・レゾリューション (::) 演算子を使用して、メンバー関数名を修飾することもできます。
インライン・メンバー関数を宣言するのと同等な方法は、inline キーワードを指定してクラス内でその関数を宣言するか (そしてクラスの外側で関数を定義する)、または inline キーワードを 使用して、クラス宣言の外側でその関数を定義することです。
次の例では、メンバー関数 Y::f() は、インライン・メンバー関数です。
struct Y { private: char a*; public: char* f() { return a; } };
次の例は、直前の例と同等なものです。Y::f() が、インライン・メンバー関数です。
struct Y { private: char a*; public: char* f(); }; inline char* Z::f() { return a; }
リンケージはデフォルトでは外部結合なので、inline 指定子はメンバー関数または非メンバー関数の リンケージには影響を与えません。
ローカル・クラスのメンバー関数
ローカル・クラスのメンバー関数は、そのクラス定義の中で定義してください。 結果として、ローカル・クラスのメンバー関数は、暗黙的にインライン関数になります。 これらのインライン・メンバー関数はリンケージを持ちません。
関連参照