C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++の静的(static)ストレージクラスとは?使い方と動作を実例で解説

staticストレージクラスとは

C++のstatic(静的)ストレージクラスをローカル変数に指定すると、スコープに入るたびに生成し、抜けるたびに破棄するという通常の動作の代わりに、プログラムが終了するまでその変数を存続させ続けるようコンパイラに指示します。
そのため、ローカル変数をstaticとして宣言すれば、関数呼び出しをまたいで値を保持できるようになります。

static修飾子はグローバル変数にも適用できます。この場合、その変数のスコープは宣言されたファイル内に限定されます。同じプログラム内の他のソースファイルからは参照できなくなるため、意図しない名前の衝突を防ぐのに役立ちます。

さらにC++では、クラスのデータメンバーにstaticを使用すると、そのメンバーのコピーは1つだけ生成され、そのクラスのすべてのオブジェクト間で共有されることになります。

staticの3つの主な使い方

1. 関数内のローカル変数

初回呼び出し時に一度だけ初期化され、それ以降の呼び出しでは前回の値が引き継がれます。呼び出し回数のカウントなどに利用できます。

2. ファイルスコープのグローバル変数

変数の可視範囲をそのファイル内部だけに制限します(内部リンケージ)。モジュール外に公開したくない変数を定義する際に使われます。

3. クラスの静的データメンバー

オブジェクトごとではなくクラスごとに1つの実体が作られ、すべてのインスタンスで共有されます。

サンプルコード

#include <iostream>

static int count = 6; /* グローバル変数 */

void func( void ) {
    static int i = 10; // ローカルなstatic変数
    i++;
    std::cout << "i is " << i;
    std::cout << " and count is " << count << std::endl;
}

int main() {
    while(count--)
    {
        func();
    }
    return 0;
}

グローバル変数countは6で初期化されており、main()のwhileループによってfunc()が6回呼び出されます。

実行結果

このプログラムを実行すると、次のような出力が得られます。

i is 11 and count is 5
i is 12 and count is 4
i is 13 and count is 3
i is 14 and count is 2
i is 15 and count is 1
i is 16 and count is 0

コードのポイント

  • ローカルのstatic int iは、最初のfunc()呼び出し時に一度だけ10で初期化され、以降は毎回のi++による増分が次回の呼び出しに引き継がれます。
  • グローバルのstatic int countは宣言されたファイル内でのみ有効ですが、この例では同一ファイル内で使用しているため正常に動作します。
  • while(count--)は後置デクリメントのため、条件判定の後に値が減り、出力には5から0までの値が順に表示されます。

このようにstaticを活用することで、変数の寿命やスコープ(可視範囲)を柔軟に制御できます。状態を保持したいローカル変数や、外部に公開したくない補助的な変数がある場合に、ぜひ活用してみてください。

  1. C++で文字列内の母音ペアを数える方法を解説

    はじめに 文字列が与えられ、その中に「隣り合う2文字がどちらも母音であるペア」がいくつ含まれるかを数えるのが今回の課題です。英語のアルファベットには a、i、e、o、u の5つの母音があり、それ以外の文字は子音と呼ばれます。 入力例と出力例 入力: string str = tutorials point 出力: 与えられた文字列内の母音ペアの数:2 説明: 与えられた文字列から作れる隣接ペアは (t, u)、(u, t)、(t, o)、(o, r)、(r, i)、(i, a)、(a, l)、(l, s)、(s, p)、(p, o)、(o, i)、(i, n)、(n, t) です。このうち、

  2. C++で円をN回カットしたときのピース数を計算する方法

    問題の概要整数Nが与えられます。このNは、2次元平面上の円に対して加える「カット(切り込み)」の回数を表します。1回のカットによって円は2つに分けられるため、N回のカットを行った後に円がいくつのピースに分割されるかを求めるのが、この問題の目的です。計算式この問題はとてもシンプルで、次の式で答えを求めることができます。ピースの数 = 2 × カットの回数(N)各カットが円の中心を通って切断されると考えると、カット1回ごとにピースが2つずつ増えていくため、この式が成り立ちます。具体例入力: N = 1出力: 円のピース数: 2説明: 1回のカットで、円はちょうど2つの半分に分けられます。入力: N