type qualifiers storage classes c
C ++での型修飾子とストレージクラスの重要性。
これで 独占C ++トレーニングシリーズ 、変数のトピックをさらに拡張し、このチュートリアルでC ++の型修飾子とストレージクラスを確認します。これは小さなトピックですが、C ++プログラミングに関する限り、非常に重要で重要です。
C ++の型修飾子は、使用される変数またはエンティティの意味を変更せず、エンティティに追加情報を追加するだけです。
学習内容:
C ++の型修飾子
C ++の型修飾子は、変数が定数または揮発性であるなど、変数に追加のプロパティを追加します。
型修飾子は、変数の意味または解釈を同じに保つことにより、変数にアクセスする方法、または変数をメモリに格納する方法を表します。ある意味で、型修飾子は変数にさらに洗練を加えます。
C ++では、型修飾子は変数の型指定子(データ型)の直前に指定されます。
C ++の型修飾子は、次のように分類されます。
#1)const
型指定子「const」は、型constのオブジェクトを定義することです。 constオブジェクトまたは変数は、一度宣言すると変更できません。 constオブジェクトまたは変数を変更しようとすると、コンパイラーはエラーを発生させます。前のチュートリアルで定数/リテラルについてはすでに見てきました。
「const」キーワードを使用した定数の定義は、型修飾子「const」に対応します。
#2)揮発性
型修飾子「volatile」は、volatileとマークされた変数の値が、プログラムで指定されていない他の方法で変更される可能性があることを意味します。揮発性の変数は、通常、いくつかの外部要因が原因で変化しますが、必ずしもプログラムが原因であるとは限りません。言い換えれば、それらは本質的に揮発性です。
例えば、 読み取り温度がプログラムによって完全に制御されていない可能性があるため、実際の単語で温度を読み取る変数は揮発性にすることができます。
#3)可変
「可変」型修飾子は、メンバーまたは変数を変更可能にします。
可変修飾子は通常、非constおよび非参照型の非静的クラスメンバーに適用されます。特定の状況に応じて、いくつかの変数を不変(変更できない)のままにし、いくつかの変数を変更可能にする必要がある場合があります。このタイプの修飾子は、可変の特性が必要な場合に非常に役立ちます。
C ++のストレージクラス
これまで、すべてのC ++変数について詳しく説明してきました。変数がそれぞれのデータ型で宣言され、プログラムで使用されることを確認しました。変数を完全に定義するには、データ型とは別にストレージクラスも必要です。
例を含むUNIXのsortコマンド
これまで変数にストレージクラスを指定していませんが、すべての変数に適用されるデフォルトのストレージクラス「auto」がありました。
では、ストレージクラスとは何ですか?
ストレージクラスは、変数または関数がコンパイラーによってどのように扱われるか、およびストレージが変数にどのように割り当てられるかを指定します。変数の可視性またはスコープと存続期間を定義します。変数の有効期間は、変数がアクティブであり続ける期間です。
変数の可視性またはスコープは、変数にアクセスできる関数またはモジュールです。これらのストレージクラスは、変数のデータ型の前に指定されます。
C ++には、次のストレージクラスがあります。
#1)自動ストレージクラス
これはデフォルトのストレージクラスです。ストレージクラス「Auto」はローカル変数に適用され、コンパイラによってローカル変数に自動的に割り当てられます。 「auto」キーワードが前に付いたローカル変数は、宣言された関数でアクティブなままであり、関数が終了するとスコープ外になります。
「自動」ストレージクラスを持つ変数が初期化されていないか、値が割り当てられていない場合、それらにはガベージ値または未定義の値があります。
C ++プログラムの自動変数の例を見てみましょう。
#include using namespace std; int main() { int i; float f; cout<<'Variable i = '< #2)ストレージクラスを登録する 変数がより高速なアクセスを必要とするという要件がある場合は、レジスタストレージクラスを使用します。したがって、変数をランダムアクセスメモリ(RAM)に格納する代わりに、これらの変数はCPUレジスタに格納され、レジスタのサイズと同じサイズになります。
さらに、これらの変数にはメモリの場所がないため、これらの変数で「&」演算子を使用することはできません。
レジスタストレージクラスを持つ変数があるからといって、その変数が常にレジスタに格納されるとは限りません。代わりに、変数がレジスタに格納され、ハードウェアと実装に完全に依存していることを前提としています。
レジスタ変数のスコープと有効期間は、自動変数と同様です。
例えば、
#include using namespace std; int main() { int i; register float f; cout<<'Variable i = '< #3)外部ストレージクラス 変数を複数のファイル間で共有する必要がある場合は、externストレージクラスが必要です。外部変数にはグローバルスコープがあり、これらの変数は宣言されているファイルの外部に表示されます。
extern変数は、別のファイルの外部で宣言および定義された変数であるため、初期化されません。
外部変数にはグローバルスコープがあり、外部変数の有効期間は、それが終了したと宣言されているプログラムと同じです。
外部変数は次のように宣言できます。
extern int temp; int temp;
上記の例では、同じ名前の2つの変数宣言がありますが、最初の宣言は他の場所で定義されたextern変数です。このextern変数は、extern変数tempがプログラムで定義されているソースファイルを含めるときに役立ちます。
#4)静的ストレージクラス
静的ストレージクラスは、プログラムの存続期間を通じて変数の値を維持するようにコンパイラーに指示します。静的変数はローカル変数に似ていますが、前に「static」キーワードが付いています。
関数の終了後にスコープ外になるローカル変数とは異なり、静的変数は、関数またはブロックが終了してもスコープ外にならず、その値は関数呼び出し間で保持されます。
静的変数は初期化され、ストレージはプログラムの存続期間中に1回だけそれらに割り当てられます。静的変数は、宣言時にまだ初期化されていない場合は0に初期化されます。
静的ストレージクラスをよりよく理解するために、次の例を見てみましょう。
#include using namespace std; void printvar() { static int var; var++; cout<<'static variable var = '< 出力:
printvar呼び出し1:静的変数var = 1
printvar呼び出し2:静的変数var = 2
printvar呼び出し3:静的変数var = 3
printvar呼び出し4:静的変数var = 4
上記のコードには、int型の静的変数varを宣言した関数「printvar」があります。次に、この変数をインクリメントして出力します。 main関数では、printvar関数を4回呼び出します。
次に、出力を確認します。出力は、関数が呼び出されるたびに、静的変数varが前の値から1ずつ増加することを示しています。これは、変数が関数呼び出し間でその値を維持するのに役立つ静的ストレージクラスです。静的変数は、関数呼び出しごとに再初期化されるわけではありません。
また、printvar関数で、静的変数を宣言したばかりで、初期化していないことにも注意してください。静的変数を初期化しない場合、初期値0が割り当てられることに注意してください。
注意: 静的ストレージクラスは、グローバル変数にも適用できます。この場合、変数にはグローバルスコープと、さらに静的ストレージが含まれます。
#5)可変ストレージクラス
可変ストレージクラスは、クラスオブジェクトにのみ適用されます。可変ストレージクラスを適用することにより、オブジェクトのメンバーは「const」メンバー関数をオーバーライドできます。これは、変更可能なメンバーまたはオブジェクトが「const」であるメンバー関数によって変更できることを意味します。
C ++でのオブジェクト指向プログラミングについて学ぶときは、後のチュートリアルでconst関数とオブジェクトおよび可変メンバーについて詳しく学びます。
結論
これはすべて、C ++の型指定子とストレージクラスに関するものです。このチュートリアルを通じて、ストレージクラスと型指定子に関するすべての概念を明確にできたことを願っています。
次のチュートリアルでは、C ++で使用されるさまざまな演算子とその使用法について詳しく学習します。
=> ここで完全なC ++トレーニングシリーズを確認してください
推奨読書