C++ ストレージ クラス


ストレージ クラスは、C++ プログラムの変数/関数のスコープ (可視性) とライフサイクルを定義します。これらの指定子は、変更する型の前に配置されます。 C++ プログラムで使用できるストレージ クラスを以下に示します。

auto ストレージ クラス

auto ストレージ クラスは、すべてのローカル変数のデフォルトのストレージ クラスです。

{
   int mount;
   auto int month;
}

上記の例では、同じストレージ クラスを持つ 2 つの変数を定義しています。Auto は関数内でのみ使用できます。つまり、auto はローカル変数のみを変更できます。

register ストレージ クラス

register ストレージ クラスは、RAM の代わりにレジスタに格納されるローカル変数を定義するために使用されます。これは、変数の最大サイズがレジスタのサイズ (通常はワード) に等しく、単項 '&' 演算子を変数に適用できないことを意味します (メモリ位置がないため)。

{
   register int  miles;
}

レジスタは、カウンターなど、すぐにアクセスする必要がある変数にのみ使用されます。 「レジスタ」の定義は、変数がレジスタに格納されることを意味するのではなく、ハードウェアと実装の制限に応じて、変数がレジスタに格納される可能性があることを意味することにも注意してください。

静的ストレージ クラス

static ストレージ クラスは、スコープに出入りするたびにローカル変数を作成して破棄することなく、プログラムの存続期間中ローカル変数を維持するようにコンパイラーに指示します。したがって、static を使用してローカル変数を変更すると、関数呼び出し間でその値が維持されます。

static 修飾子はグローバル変数にも適用できます。 static がグローバル変数を変更する場合、変数のスコープは変数が宣言されているファイルに制限されます。

C++ では、クラス データ メンバーで static が使用されると、クラスのすべてのオブジェクトでメンバーのコピーが 1 つだけ共有されます。

#include <iostream>
 
// 函数声明 
void func(void);
 
static int count = 10; /* 全局变量 */
 
int main()
{
    while(count--)
    {
       func();
    }
    return 0;
}
// 函数定义
void func( void )
{
    static int i = 5; // 局部静态变量
    i++;
    std::cout << "变量 i 为 " << i ;
    std::cout << " , 变量 count 为 " << count << std::endl;
}

上記のコードがコンパイルされて実行されると、次の結果が生成されます:

变量 i 为 6 , 变量 count 为 9
变量 i 为 7 , 变量 count 为 8
变量 i 为 8 , 变量 count 为 7
变量 i 为 9 , 变量 count 为 6
变量 i 为 10 , 变量 count 为 5
变量 i 为 11 , 变量 count 为 4
变量 i 为 12 , 变量 count 为 3
变量 i 为 13 , 变量 count 为 2
变量 i 为 14 , 变量 count 为 1
变量 i 为 15 , 变量 count 为 0

extern ストレージ クラス

extern ストレージ クラスは、すべてのプログラムで使用できるグローバル変数への参照を提供するために使用されます。ファイルが表示されます。初期化できない変数に対して「extern」を使用すると、変数名は以前に定義された格納場所を指します。

複数のファイルがあり、他のファイルで使用できるグローバル変数または関数を定義する場合、他のファイルで e​​xtern を使用して、定義された変数または関数への参照を取得できます。 extern は、別のファイルでグローバル変数または関数を宣言するために使用されることが理解できます。

extern 修飾子は、通常、以下に示すように、同じグローバル変数または関数を共有する 2 つ以上のファイルがある場合に使用されます。

最初のファイル: main.cpp

#include <iostream>
 
int count ;
extern void write_extern();
 
int main()
{
   count = 5;
   write_extern();
}

2 番目のファイル: cpp

#include <iostream>
 
extern int count;
 
void write_extern(void)
{
   std::cout << "Count is " << count << std::endl;
}

ここでは、 2 番目のファイルの extern キーワードは、最初のファイル main.cpp で定義されたカウントを宣言するために使用されます。次に、これら 2 つのファイルを次のようにコンパイルします。

$ g++ main.cpp support.cpp -o write

これにより、write 実行可能プログラムが生成され、write を実行しようとすると、次の結果が生成されます:

$ ./write
Count is 5

mutable storage class

mutable specifier 適用のみクラスのオブジェクトへの変換については、このチュートリアルの最後で説明します。これにより、オブジェクトのメンバーを定数に置き換えることができます。つまり、可変メンバーは const メンバー関数を通じて変更できます。