オーバーロードされた関数たちの中にある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変数は、各々が独立しているようです。
(今気づいたけど、各々のアドレスを表示させれば済む話だった。)
ひとつの変数を複数の関数で共有したい
思いついた順にメモ
一番下のやつはすごくいい感じがするので、実際に書いてみました
#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
意味あんのかなぁ。