C++ストレージクラス完全解説:スコープ、ライフタイム、使い方
ストレージクラスは、C++プログラム内での変数および/または関数のスコープ(可視性)とライフタイムを定義します。これらの指定子は、修飾する型の前に置かれます。C++プログラムで使用できるストレージクラスは以下の通りです:
- auto
- register
- static
- extern
- mutable
auto ストレージクラス
auto ストレージクラスは、すべてのローカル変数のデフォルトストレージクラスです。
{ int mount; auto int month; }
上記の例では、同じストレージクラスを持つ2つの変数を定義しています。auto は関数内、つまりローカル変数でのみ使用できます。
register ストレージクラス
register ストレージクラスは、RAMではなくレジスタに格納されるべきローカル変数を定義するために使用されます。これは、変数の最大サイズがレジスタサイズ(通常1ワード)に等しく、単項 '&' 演算子を適用できない(メモリ位置を持たないため)ことを意味します。
{ register int miles; }
register は、カウンタなど、高速アクセスを必要とする変数にのみ使用すべきです。また、'register' と定義しても、その変数がレジスタに格納されることを保証するものではない点に注意してください。ハードウェアと実装の制約により、レジスタに格納される「可能性がある」ことを意味します。
static ストレージクラス
static ストレージクラスは、ローカル変数をプログラムのライフタイム中ずっと存在させ、スコープに入ったり出たりするたびに作成・破棄されるのではなく、存続させるようコンパイラに指示します。したがって、ローカル変数を static にすると、関数呼び出し間で値を保持できるようになります。
static 修飾子はグローバル変数にも適用できます。これを行うと、その変数のスコープが宣言されているファイルに制限されます。
C++では、static をクラスのデータメンバに使用すると、そのクラスのすべてのオブジェクトでそのメンバのコピーが1つだけ共有されるようになります。
Live Demo#include <iostream>
// 関数宣言
void func(void);
static int count = 10; /* グローバル変数 */
main() {
while(count--) {
func();
}
return 0;
}
// 関数定義
void func( void ) {
static int i = 5; // ローカル静的変数
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 は別のファイルでグローバル変数や関数を宣言するために使用されます。
extern 修飾子は、2つ以上のファイルが同じグローバル変数や関数を共有する場合に最もよく使用されます。
第1ファイル: 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 キーワードを使って別のファイルで count を宣言しています。これら2つのファイルを以下のようにコンパイルします:
$g++ main.cpp support.cpp -o write
これにより write 実行プログラムが生成されます。write を実行して結果を確認します:
$./write 5
mutable ストレージクラス
mutable 指定子は、このチュートリアルの後で説明するクラスオブジェクトにのみ適用されます。const メンバ関数をオーバーライドして、クラスオブジェクトのメンバを変更可能にします。つまり、mutable なメンバは const メンバ関数によって変更できます。
C言語
- C++演算子完全ガイド:算術・代入・関係・論理・ビット演算子と実例
- C++クラスとオブジェクト完全ガイド:オブジェクト指向プログラミングの実践
- C++フレンド関数とフレンドクラス:アクセス制御のマスター
- C++クラステンプレート完全ガイド:実践的なジェネリックプログラミング
- C言語ストレージクラス完全理解:スコープ・ライフタイム・パフォーマンス
- C言語のストレージクラス:スコープ、ライフタイム、使い分け
- C++ポリモーフィズム完全理解:仮想関数と純粋仮想関数
- C++データ抽象化完全マスター:インターフェースと実装の分離
- C++データカプセル化:コードを守る仕組みと実装例
- C++インターフェース完全理解:抽象クラスと純粋仮想関数
- C#のクラス完全ガイド:定義・カプセル化・コンストラクタ・デストラクタ・静的メンバー