
クラス内の「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で質問しましょう!
似たような質問が見つかりました
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- Java Java プログラム public class Main { public static void 3 2023/08/10 23:46
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- C言語・C++・C# Cのオブジェクトファイルの逆アセンブル 5 2023/05/13 01:51
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
- Java Java 配列<選挙> 4 2023/07/31 15:07
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- Java java 飾子を付けること(public static・・・) ・コンソールへの出力処理はmainメ 2 2022/06/16 19:34
- カスタマイズ(車) 2003年式レガシィB4 2.0GT TA-BL5に乗ってるのですが このマイルドダンパーという車高 2 2023/06/11 22:09
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
private static という変数の修飾
-
生成したインスタンスを削除す...
-
複数の変数を宣言する時、同時...
-
インスタンス参照でアクセスで...
-
C# インスタンスの破棄
-
変数名の付け方
-
VB.NET getとsetの概念がわかり...
-
「インスタンス」の意味をわか...
-
javaのクラスの作り方、エラー...
-
インスタンスを同じ名前で作成...
-
オブジェクト参照がオブジェク...
-
C#において、同じインスタンス...
-
newしないインスタンス?実体化...
-
変数の参照でエラーが出てしま...
-
フォームの存在をチェックする方法
-
C# 外部のDLLの名前空間取得方...
-
クラスのメンバ関数の呼出しに...
-
Delphiでインスタンスが作成さ...
-
staticメソッドにするかどうか...
-
サーブレットでレスポンスが返...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
オブジェクト参照がオブジェク...
-
private static という変数の修飾
-
変数名の付け方
-
複数の変数を宣言する時、同時...
-
C#において、同じインスタンス...
-
インスタンス参照でアクセスで...
-
生成したインスタンスを削除す...
-
C# インスタンスの破棄
-
VB.NET getとsetの概念がわかり...
-
変数の参照でエラーが出てしま...
-
フォームの存在をチェックする方法
-
「インスタンス」の意味をわか...
-
[Visual C#] 優先される処理に...
-
javaのクラスの作り方、エラー...
-
クラスのインスタンス名をクラ...
-
C#の構造体の開放のしかた
-
エクセル(複数インスタンス)...
-
VB6.0で、DLLを動的に参照したい
-
C#「オブジェクト参照が必要で...
-
vb.netでFAXを送信する方法
おすすめ情報