オーバーロードされた関数たちの中にあるstatic変数は共通か?

結論

それぞれ独立しています。

テストコード

#include <iostream>
using std::cout;

/*
 * 以下に、3種類の意味もなくオーバーロードされた、
 * static変数を持つ関数の定義が続きます。
 */
void overload( int i)
{
	static int static_var;

	// "変数iは一度も参照されてません"という警告が出るので、
	// コンパイラを黙らせるために、参照しとく。
	i;

	cout << static_var++ << "\n";
}
void overload( const char *str)
{
	static int static_var;

	str;	// 黙らせる

	cout << static_var++ << "\n";
}

void overload( int arr[], int size)
{
	static int static_var;

	arr + size;	// 黙れ

	cout << static_var++ << "\n";
}

/*
 * Main
 */
int main()
{
	for( int i = 0; i < 5; i++ ) {
		overload(0);
		overload("はひふへほ");
		overload( (int*)123, 123);
	}

	return 0;
}
実行結果

改行は省略します。

0 0 0 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5
どういうことか

オーバーロードされた関数内にあるstatic変数は、各々が独立しているようです。
(今気づいたけど、各々のアドレスを表示させれば済む話だった。)

ひとつの変数を複数の関数で共有したい

思いついた順にメモ
  • 関数の外に名前空間を作り、その中で変数を定義し、関数の中でusing .... と書く
  • 長い名前のグローバル変数(本質的には上と変わらず・・・。)
  • 関数たちを、ある一つのクラスのpublicなstaticメンバ関数として宣言し、共有したい変数をprivateなstaticメンバ変数にする(要はクラス化)
一番下のやつはすごくいい感じがするので、実際に書いてみました
#include <iostream>
using std::cout;

/*
 * オーバーロードされた関数たちが共有する変数を
 * 隠蔽するためのクラス
 */
class ClassOverload
{
private:
	static int static_var;	// 共有する変数

public:
	// オーバーロードされた関数たち
	static void overload( int i);
	static void overload( const char *str);
	static void overload( int arr[], int size);
};

/*
 * メンバ関数の実装
 */
void ClassOverload::overload( int i)
{
	i;

	cout << static_var++ << "\n";
}
void ClassOverload::overload( const char *str)
{
	str;

	cout << static_var++ << "\n";
}
void ClassOverload::overload( int arr[], int size)
{
	arr + size;

	cout << static_var++ << "\n";
}

// staticメンバ変数の実体
int ClassOverload::static_var;

/*
 * "ClassOverload::" といちいち書きたくなかったら、
 * 以下の宣言が必要。
 */
using ClassOverload::overload;

/*
 * Main
 */
int main()
{
	for( int i = 0; i < 5; i++ ) {
		overload(0);
		overload("はひふへほ");
		overload( (int*)123, 123);
	}

	return 0;
}

言うほど簡単ではないですね・・・。ですが、ばっちり共有されてます。実行結果は以下に(改行省略)。

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14

意味あんのかなぁ。