Cplusplus-cpp-storage-classes
C ++のストレージクラス
ストレージクラスは、C プログラム内の変数や関数のスコープ(可視性)と寿命を定義します。 これらの指定子は、変更するタイプの前にあります。 次のストレージクラスがあり、C プログラムで使用できます。
- auto
- 登録
- 静的
- 外面
- 可変
自動ストレージクラス
*auto* ストレージクラスは、すべてのローカル変数のデフォルトストレージクラスです。
{
int mount;
auto int month;
}
上記の例では、同じストレージクラスを持つ2つの変数を定義しています。autoは関数内でのみ使用できます。つまり、ローカル変数です。
レジスタストレージクラス
*register* ストレージクラスは、RAMではなくレジスタに保存するローカル変数を定義するために使用されます。 これは、変数の最大サイズがレジスタサイズ(通常は1ワード)に等しく、単項 '&'演算子を適用できないことを意味します(メモリ位置がないため)。
{
register int miles;
}
レジスタは、カウンタなどの迅速なアクセスを必要とする変数にのみ使用する必要があります。 また、「レジスタ」を定義しても、変数がレジスタに格納されるわけではないことに注意してください。 これは、ハードウェアと実装の制限に応じて、レジスタに格納される可能性があることを意味します。
静的ストレージクラス
*static* ストレージクラスは、プログラムの有効期間中にローカル変数を作成および破棄するのではなく、スコープに出入りするたびにローカル変数を保持するようコンパイラーに指示します。 したがって、ローカル変数を静的にすると、関数呼び出し間で値を維持できます。
static修飾子は、グローバル変数にも適用できます。 これが行われると、その変数のスコープは、それが宣言されているファイルに制限されます。
C ++では、静的がクラスデータメンバーで使用されると、そのメンバーの1つのコピーのみがそのクラスのすべてのオブジェクトで共有されます。
#include <iostream>
//Function declaration
void func(void);
static int count = 10;/*Global variable*/
main() {
while(count--) {
func();
}
return 0;
}
//Function definition
void func( void ) {
static int i = 5;//local static variable
i++;
std::cout << "i is " << i ;
std::cout << " and count is " << count << std::endl;
}
上記のコードをコンパイルして実行すると、次の結果が生成されます-
i is 6 and count is 9
i is 7 and count is 8
i is 8 and count is 7
i is 9 and count is 6
i is 10 and count is 5
i is 11 and count is 4
i is 12 and count is 3
i is 13 and count is 2
i is 14 and count is 1
i is 15 and count is 0
外部ストレージクラス
*extern* ストレージクラスは、すべてのプログラムファイルに表示されるグローバル変数の参照を提供するために使用されます。 'extern'を使用する場合、変数は初期化できません。これは、変数名が以前に定義された保存場所を指しているだけだからです。
複数のファイルがあり、他のファイルでも使用されるグローバル変数または関数を定義すると、別のファイルで_extern_が使用され、定義された変数または関数の参照が提供されます。 理解するために、_extern_は別のファイルでグローバル変数または関数を宣言するために使用されます。
extern修飾子は、以下で説明するように、同じグローバル変数または関数を共有する2つ以上のファイルがある場合に最も一般的に使用されます。
最初のファイル:main.cpp
#include <iostream>
int count ;
extern void write_extern();
main() {
count = 5;
write_extern();
}
2番目のファイル:support.cpp
#include <iostream>
extern int count;
void write_extern(void) {
std::cout << "Count is " << count << std::endl;
}
ここでは、_extern_キーワードを使用して、別のファイルでカウントを宣言しています。 今、次のようにこれらの2つのファイルをコンパイルします-
$g++ main.cpp support.cpp -o write
これは、*書き込み*実行可能プログラムを生成し、*書き込み*を実行し、次のように結果を確認しようとします-
$./write
5
可変ストレージクラス
*mutable* 指定子は、このチュートリアルで後述するクラスオブジェクトにのみ適用されます。 オブジェクトのメンバーがconstメンバー関数をオーバーライドできます。 つまり、可変メンバーはconstメンバー関数によって変更できます。