C ++のストレージクラスとそのタイプとは何ですか?



このストレージクラスのブログでは、auto、register、static、extern、mutableなどのC ++で使用されるさまざまなストレージクラスを例を挙げて見ていきます。

のストレージクラス C ++ 変数/関数の存続期間と可視性を定義します。存続期間は変数がアクティブのままである期間であり、可視性はプログラムのさまざまなモジュールからの変数のアクセス可能性です。この プログラムの実行中に特定の変数の存在を追跡するのに役立ちます。このストレージクラスのブログでは、C ++で使用されるさまざまなストレージクラスについて説明します。

さぁ、始めよう。





C ++のストレージクラスとは何ですか?

C ++のすべての変数には、データ型とストレージクラスがあります。データ型は、int、float、charなどの変数に格納できるデータの型を指定します。ストレージクラスは、変数の2つの異なるプロパティ(有効期間とスコープ)を制御します。

すべての変数にデータ型があるのを見たことがあるでしょうが、これまでのところ、変数にアタッチされたストレージクラスを見たことがないかもしれません。実際、ストレージクラスを定義しない場合、コンパイラはデフォルトのストレージクラスを自動的に割り当てます。変数のストレージクラスは、メモリ内の変数の保存場所、デフォルトの初期値、変数のスコープ、およびその存続期間に関する情報を提供します。



ストレージクラスの種類

C ++プログラムには5つのストレージクラスがあります。

  • 自動
  • 登録
  • 静的
  • 外部
  • 可変

各ストレージクラスについて詳しく説明しましょう。

自動ストレージクラス

自動(自動)ストレージクラスは、関数またはブロック内で宣言されるすべてのローカル変数のデフォルトのストレージクラスです。 autoキーワードは、書き込み中に使用されることはめったにありません。 C ++プログラム



自動変数のスコープは、宣言されている関数またはブロック内にあり、その関数またはブロックの外部からアクセスすることはできません。また、自動変数が宣言された親ブロック/関数内のネストされたブロック内からアクセスすることもできます。

ポインター変数を使用して、スコープ外の自動変数にアクセスできます。変数が存在するのと同じメモリ位置を指す必要があります。

その寿命は、関数の寿命と同じです。関数の実行が終了すると、変数は破棄されます。

デフォルトでは、宣言時にガベージ値が割り当てられます。

構文:

データ型var_name1 [=値]

または

自動データ型var_name1 [= value]

上記の例では、2つの変数が同じストレージクラスで定義されています。 Autoは、ローカル変数を定義するためにのみ使用できます。つまり、関数内でのみ使用できます。

ストレージクラスの登録

名前が示すように、レジスタストレージクラスはレジスタ変数を宣言するために使用されます。レジスタ変数のすべての機能化は自動変数と同じですが、空きレジスタが使用可能な場合、コンパイラがこれらの変数をマイクロプロセッサのレジスタに格納しようとする点が異なります。空きレジスタが利用できない場合、これらはメモリにのみ保存されます。

したがって、レジスタ変数の操作は、プログラムの実行時にメモリに格納される他の変数の操作よりもはるかに高速です。

一般に、プログラムで頻繁にアクセスする必要のあるいくつかの変数は、プログラムの実行時間を改善するためにレジスタストレージクラス内で宣言されます。レジスタ変数のアドレスは、ポインタを使用して取得することはできません。

変数の最大サイズは、レジスタのサイズと同じです(つまり、約1ワード)。メモリの場所がないため、単項の「&」演算子を適用することはできません。

構文:

データ型を登録しますvar_name1 [= value]

例:

次のうち、制御ステートメントの例はどれですか?
{レジスタintpi}

「レジスタ」を定義することは、変数がレジスタに格納されることを意味するものではありません。ハードウェアと実装の制限によっては、レジスタに格納される場合があります。

レジスタと自動ストレージクラスの例を見てみましょう。

例:

#include using namespace std //外部化される変数の宣言//初期値はxに初期化することもできますintx void autoStorageClass(){printf( 'nDemonstrating auto classnn')//自動変数の宣言(単に// 'int a = 32'の書き込みも機能します)int num = 32 //自動変数 'a'を出力しますprintf( 'autoとして宣言された変数' num '' 'の値:%dn'、num)printf( '--------------------------------')} void registerStorageClass(){printf( 'nDemonstrating register classnn')/ /レジスタ変数の宣言registerchar c = 'G' //レジスタ変数の出力 'b' printf( 'レジスタとして宣言された変数' c '' 'の値:%dn'、c)printf( '---- ---------------------------- ')} int main(){//自動ストレージクラスをデモンストレーションするautoStorageClass()//デモンストレーションするレジスタストレージクラスregisterStorageClass()return 0}

出力:

出力-C ++のストレージクラス-Edureka静的ストレージクラス

静的ストレージクラスは宣言に使用されます 静的変数 。静的変数は、スコープ外の場合でも値(つまり最後の値)を保持します。静的変数は一度だけ初期化されます&プログラムが終了するまで存在します。

メモリは静的変数に1回だけ割り当てられ、再宣言されないため、新しいメモリは割り当てられません。グローバル静的変数には、プログラムのどこからでもアクセスできます。デフォルトでは、コンパイラーによって値0が割り当てられます。

C ++では、静的がクラスデータメンバーで使用されると、そのメンバーの1つのコピーのみがそのクラスのすべてのオブジェクトによって共有されます。

構文:

静的データ型var_name1 [= value]

例:

#include void function(void)static int c = 5 //グローバル静的変数main(){while(c-){function()} return 0} void function(void){static int cnt = 2 cnt ++ std :: cout<< 'cnt is ' << cnt std::cout << ' and c is ' << c << std::endl } 

出力:

外部ストレージクラス

変数を複数のファイル間で共有する必要がある場合は、externストレージクラスが必要です。外部変数にはグローバルスコープがあり、これらの変数は宣言されているファイルの外部に表示されます。 extern変数は、すべてのプログラムに表示されます。 2つ以上のファイルが同じ変数または関数を共有している場合に使用されます。

extern変数の存続期間は、それが宣言されているプログラムが終了している限りです。通常のグローバル変数は、任意の関数/ブロックの宣言/定義の前に「extern」キーワードを配置することによって、externにすることもできます。

「extern」を使用すると、以前に定義された保存場所に変数名を指定するだけなので、変数を初期化できません。

構文

外部データ型var_name1

#include int cnt extern void write_extern()main(){cnt = 5 write_extern()}

2番目のファイル:support.cpp

#include extern int cnt void write_extern(void){std :: cout<< 'Count is ' << cnt << std::endl } 

ここでは、externキーワードを使用して別のファイルでcntを宣言しています。次に、これら2つのファイルを次のようにコンパイルします&minus

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

これにより、書き込み実行可能プログラムが生成されます。書き込みを実行して、次のように結果を確認してください。

$ ./ write

5

C ++のストレージクラスを進めて、最後の1つ、つまり可変ストレージクラスを見てみましょう。

可変ストレージクラス

可変指定子はクラスオブジェクトにのみ適用されます。これにより、オブジェクトのメンバーがconstメンバー関数をオーバーライドできます。つまり、可変メンバーはconstメンバー関数で変更できます。

最後に、比較表を見て、異なるストレージクラス間の違いを理解しましょう。

ストレージクラス

Javaでのメソッドのオーバーロードとオーバーライド

キーワード

一生

可視性

初期値

自動

自動

ファンクションブロック

地元

ガービッジ

外部

外部

プログラム全体

グローバル

ゼロ

静的

静的

プログラム全体

地元

Javaのスキャナークラスとは何ですか

ゼロ

登録

登録

ファンクションブロック

地元

ガービッジ

可変

可変

クラス

地元

ガービッジ

上記のC ++プログラムを実行した後、C ++のさまざまなストレージクラスとその実装方法を理解できたはずです。このブログがあなたにとって有益で付加価値があることを願っています。

これで、「C ++のストレージクラス」に関するこの記事は終わりです。

詳細を知りたい場合は、 信頼できるオンライン学習会社であるEdurekaによる。 EdurekaのJavaJ2EEおよびSOAトレーニングおよび認定コースは、Hibernate&SpringなどのさまざまなJavaフレームワークに加えて、コアJavaコンセプトと高度なJavaコンセプトの両方についてトレーニングするように設計されています。

質問がありますか?このブログのコメントセクションでそれについて言及してください。できるだけ早くご連絡いたします。