
クラス内の「staticではないメンバ関数内で定義される」static変数の初期化タイミングはいつでしょうか?
自分としてはクラスのインスタンス生成時に初期化されるものだと思っていたのですが、どうもそうでは無さそうだという現象に出会ったもので。
例えば以下のようなサンプルプログラムがあるとします。
---------------------------------------
class TA {
public:
void func(int i);
};
void TA::func(int i)
{
static int d=0;
d += i;
std::cout << d << std::endl;
}
int main()
{
for(int i=1; i < 3;i++) {
TA ta;
ta.func(i);
ta.func(i);
ta.func(i);
}
}
---------------------------------------
これを実行した時、自分としては
1
2
3
2
4
6
という結果を期待していた訳ですが、実際には
1
2
3
5
7
9
という結果になりました。
ということは、もしかしてメンバ変数ではなくともクラス内に現れるstatic変数はstaticなメンバ変数と同等ということなのでしょうか?
実際、上記ソースのforループ内にもう一つclass TAのインスタンスtbを追加してみると、
---------------------------------------
for(int i=1; i < 3;i++) {
TA ta;
ta.func(i);
ta.func(i);
ta.func(i);
TA tb;
tb.func(i);
tb.func(i);
tb.func(i);
}
---------------------------------------
1
2
3
4
5
6
8
10
12
14
16
18
となりました。
(まぁstaticではないメンバ変数に置き換えれば一応解決するのですが、個人的に何か凄く気持ち悪く感じて・・・)

No.1ベストアンサー
- 回答日時:
C++では、メンバ関数は、「暗黙の引数 this(インスタンスを指すポインタ)を持つ関数」に過ぎません。
実際に、インスタンスの生成とは関係なく存在しています。
なので、内部static変数の初期化は、最初に関数が呼ばれたときということになります。
逆に、「そのインスタンスに固有の情報」は、やはり、メンバ変数として持たないとだめということになります。
なるほど、つまりメンバ関数の実体はインスタンス毎に用意される訳ではないので、staticな変数はクラス単位で共有化(?)されてしまうということですかね。そう考えれば納得できます。
ありがとうございました。
No.3
- 回答日時:
1.インスタンスの時に生成されるのはクラスのメンバ変数です。
staticではありませんしたがって貴方の求めた振る舞いをするのはメンバ変数です。
2.メンバstatic変数と関数内のstatic変数は、初期化以外は同じです。
メンバ変数はstatic変数の値の定義の仕方で変わりますが、大体関数外にstatic変数作った時と振る舞いが同じです。
関数内のstatic変数は、非クラスのものと同じ働きをします。したがって、最初に呼び出された時にインスタンスが生成されます。
どうも私の疑問は、初期化タイミングというよりメンバ関数やstatic変数がどこにどう取られるのか、というようなものだったようです。
回答については了解です、ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
変数名の付け方
-
C#において、同じインスタンス...
-
インスタンス参照でアクセスで...
-
クラスのインスタンス名をクラ...
-
フォームのCheck boxとOLEObjec...
-
C# インスタンスの破棄
-
C#の構造体の開放のしかた
-
JSPでの表示
-
SQLを連続発行する時の正しい(?...
-
Eclipse3でVisualEditorが起動...
-
VB.NET Newしたものを変数に代...
-
VB.NET getとsetの概念がわかり...
-
[VB.NET] インスタンス生成とイ...
-
エクセル(複数インスタンス)...
-
objective-cで分かりにくい所教...
-
「インスタンス」の意味をわか...
-
「タイプ初期化子が例外をスロ...
-
中学のクラス数
-
eclipse-Tomcatでのデバッグに...
-
【sendkeysメソッドが動かずに...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
インスタンス参照でアクセスで...
-
変数名の付け方
-
private static という変数の修飾
-
C#において、同じインスタンス...
-
複数の変数を宣言する時、同時...
-
オブジェクト参照がオブジェク...
-
VB.NET getとsetの概念がわかり...
-
フォームの存在をチェックする方法
-
変数の参照でエラーが出てしま...
-
C# インスタンスの破棄
-
生成したインスタンスを削除す...
-
文字列を日付に変換でParseExce...
-
次の日本語の意味を教えて下さい
-
C#「オブジェクト参照が必要で...
-
SQLを連続発行する時の正しい(?...
-
「インスタンス」の意味をわか...
-
[Visual C#] 優先される処理に...
-
newしないインスタンス?実体化...
-
C#の構造体の開放のしかた
-
javaのクラスの作り方、エラー...
おすすめ情報