何故メンバ関数はどのインスタンスにもアクセスできるのか

メンバ関数は同クラスのどのインスタンスから呼ばれても、そのインスタンスを操作することができる。でも、メンバ関数には、どのインスタンスを操作するかという記述はない。
どうなってるの?

答え

C++ではクラスのインスタンスは、そのメンバ関数を呼び出すとき、暗黙的にインスタンスのアドレスを第1引数として渡している。
おおざっぱに言うと、Class::function(int a)がfunction(Class *this, int a)と同等のコードになる。


メンバ関数のこの振る舞いと同様の動作をC言語で書いてみる。
まずC++でのソースコードは以下のようにする。

C++ソースコード
class C {
	int a;
public:
	void f(int x);
};

void C::f(int x)
{
	a = x;
}

int main()
{
	C c;
	c.f(4);
	return 0;
}

これと同等な動作をするC言語版は以下のようになる。

C言語ソースコード
struct C {
	int a;
};

void f(struct C *this, int x)
{
	this->a = x;
}

int main()
{
	struct C c;
	f(&c, 4);
	return 0;
}

gdbでは、メンバ関数の第1引数にインスタンスのアドレスが渡ってるように表示する。

Breakpoint 1, C::f (this=0xbfbfe880, x=4) at hoge.cpp:7

参考

DEBUG HACKSの72ページ