プロが教えるわが家の防犯対策術!

クラス内の「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ではないメンバ変数に置き換えれば一応解決するのですが、個人的に何か凄く気持ち悪く感じて・・・)

A 回答 (3件)

C++では、メンバ関数は、「暗黙の引数 this(インスタンスを指すポインタ)を持つ関数」に過ぎません。


実際に、インスタンスの生成とは関係なく存在しています。

なので、内部static変数の初期化は、最初に関数が呼ばれたときということになります。

逆に、「そのインスタンスに固有の情報」は、やはり、メンバ変数として持たないとだめということになります。
    • good
    • 0
この回答へのお礼

なるほど、つまりメンバ関数の実体はインスタンス毎に用意される訳ではないので、staticな変数はクラス単位で共有化(?)されてしまうということですかね。そう考えれば納得できます。
ありがとうございました。

お礼日時:2013/09/27 12:52

1.インスタンスの時に生成されるのはクラスのメンバ変数です。

staticではありません
したがって貴方の求めた振る舞いをするのはメンバ変数です。
2.メンバstatic変数と関数内のstatic変数は、初期化以外は同じです。
メンバ変数はstatic変数の値の定義の仕方で変わりますが、大体関数外にstatic変数作った時と振る舞いが同じです。
関数内のstatic変数は、非クラスのものと同じ働きをします。したがって、最初に呼び出された時にインスタンスが生成されます。
    • good
    • 0
この回答へのお礼

どうも私の疑問は、初期化タイミングというよりメンバ関数やstatic変数がどこにどう取られるのか、というようなものだったようです。

回答については了解です、ありがとうございました。

お礼日時:2013/09/27 12:55

原則は「最初にそこに到達したとき」だったような気がする.

    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!