誰かがstatic
とconst
変数の違いを説明できますか?
定数値は変更できません。インスタンスまたはオブジェクトではなく、関数またはクラスに対して静的変数が存在します。
これら2つの概念は相互に排他的ではなく、一緒に使用できます。
短い答え:
const
は、一度設定すると値を変更しようとしないことを約束します。
static
変数は、オブジェクトの存続期間がプログラムの実行全体であり、その値がプログラムの起動前に一度だけ初期化されることを意味します。明示的に値を設定しない場合、すべての静的は初期化されます。静的初期化の方法とタイミングはunspecifiedです。
C99は、C++からconst
の使用を借用しました。一方、static
は、しばしば混乱するセマンティクスのために(両方の言語で)多くの議論の源となっています。
また、C++ 11までのC++ 0xでは、static
キーワードの使用は、名前空間スコープでオブジェクトを宣言するために非推奨になりました。この非推奨は、さまざまな理由でC++ 11で削除されました( here を参照)。
長い答え:あなたが知りたいと思ったよりも多くのキーワードについて(標準から):
C99
#include <fenv.h>
#pragma STDC FENV_ACCESS ON
/* file scope, static storage, internal linkage */
static int i1; // tentative definition, internal linkage
extern int i1; // tentative definition, internal linkage
int i2; // external linkage, automatic duration (effectively lifetime of program)
int *p = (int []){2, 4}; // unnamed array has static storage
/* effect on string literals */
char *s = "/tmp/fileXXXXXX"; // static storage always, may not be modifiable
char *p = (char []){"/tmp/fileXXXXXX"}; // static, modifiable
const char *cp = (const char []){"/tmp/fileXXXXXX"} // static, non-modifiable
void f(int m)
{
static int vla[ m ]; // err
float w[] = { 0.0/0.0 }; // raises an exception
/* block scope, static storage, no-linkage */
static float x = 0.0/0.0; // does not raise an exception
/* ... */
/* effect on string literals */
char *s = "/tmp/fileXXXXXX"; // static storage always, may not be modifiable
char *p = (char []){"/tmp/fileXXXXXX"}; // automatic storage, modifiable
const char *cp = (const char []){"/tmp/fileXXXXXX"} // automatic storage, non-modifiable
}
inline void bar(void)
{
const static int x = 42; // ok
// Note: Since an inline definition is distinct from the
// corresponding external definition and from any other
// corresponding inline definitions in other translation
// units, all corresponding objects with static storage
// duration are also distinct in each of the definitions
static int y = -42; // error, inline function definition
}
// the last declaration also specifies that the argument
// corresponding to a in any call to f must be a non-null
// pointer to the first of at least three arrays of 5 doubles
void f(double a[static 3][5]);
static void g(void); // internal linkage
C++
短い回答に記載されている場合を除き、ほとんど同じセマンティクスを持ちます。また、static
sを修飾するパラメーターはありません。
extern "C" {
static void f4(); // the name of the function f4 has
// internal linkage (not C language
// linkage) and the function’s type
// has C language linkage.
}
class S {
mutable static int i; // err
mutable static int j; // err
static int k; // ok, all instances share the same member
};
inline void bar(void)
{
const static int x = 42; // ok
static int y = -42; // ok
}
C++のstatic
のニュアンスがいくつかありますが、ここでは省略します。本や標準をご覧ください。
静的変数:
定数変数:
定数を変更することはできません。静的変数は、定数の割り当て方法とアクセス可能な場所に関係しています。
これを確認してください site 。
クラスのコンテキスト内の静的変数は、クラスのすべてのインスタンス間で共有されます。
関数では、変数は永続変数のままなので、たとえば関数が呼び出された回数をカウントできます。
関数またはクラスの外部で使用する場合、変数はその特定のファイル内のコードでのみ使用でき、他の場所では使用できないようにします。
ただし、定数変数は変更できません。 constとstaticの一般的な使用法は、クラス定義内で何らかの定数を提供することです。
class myClass {
public:
static const int TOTAL_NUMBER = 5;
// some public stuff
private:
// some stuff
};
const
は#define
と同等ですが、値のステートメントのみです(例:#define myvalue = 2
)。宣言される値は、コンパイル前に変数の名前を置き換えます。
static
は変数です。値は変更できますが、変数はプログラムの実行中にpersistになります変数が関数で宣言されている場合でもです。これは、使用スコープが宣言されたブロックのスコープであるグローバル変数と同等ですが、その値のスコープはグローバルです。
そのため、静的変数は一度だけ初期化されるです。これは、変数が関数で宣言されている場合、初期化が関数の最初の呼び出しでのみ行われることを保証するため、特に重要です。
静的の別の使用法にはオブジェクトが含まれます。オブジェクトで静的変数を宣言すると、この値はオブジェクトのすべてのインスタンスで同じになるという効果があります。そのため、オブジェクトの名前では呼び出せず、クラスの名前でのみ呼び出すことができます。
public class Test
{
public static int test;
}
Test myTestObject=new Test();
myTestObject.test=2;//ERROR
Test.test=2;//Correct
CやC++などの言語では、静的なグローバル変数を宣言することは意味がありませんが、関数やクラスでは非常に便利です。マネージ言語では、グローバル変数の効果を得る唯一の方法は、それを静的として宣言することです。
staticは、コンパイルユニットのローカル(つまり、単一のC++ソースコードファイル)を意味します。つまり、グローバルネームスペースに追加されないことを意味します。 同じ nameを使用し、名前の競合がない異なるC++ソースコードファイルに複数の静的変数を含めることができます。
constは定数であり、変更できません。
静的変数は、型のすべてのインスタンスに共通です。
定数変数は型の個々のインスタンスに固有ですが、その値はコンパイル時に既知であり、修正され、実行時には変更できません。
定数とは異なり、静的変数の値は実行時に変更できます。
静的変数は、一度だけ初期値を取得できます。つまり、サンプル関数に「static int a=0
」などのコードがあり、このコードがこの関数の最初の呼び出しで実行され、その後の関数の呼び出しでは実行されない場合。静的変数は1回だけ初期値を取得するため、変数(a)は現在の値(たとえば、現在の値5)のままです。
定数変数は、コード全体でその値が定数です。たとえば、「const int a=5
」のような定数変数を設定すると、「a」のこの値はプログラム全体で一定になります。
static
キーワードは変数のスコープを定義し、const
キーワードはプログラムの実行中に変更できない変数の値を定義します
簡単で短い答えは、メモリは静的およびconstに一度だけ割り当てられるということです。しかし、constでは、静的な値のように変化するかもしれないが、プログラムの最後までメモリ領域は同じままである1つの値のみです。
静的
変数をクラス変数にするために使用されます。宣言中に静的変数を定義する必要はありません。
例:
#include <iostream>
class dummy
{
public:
static int dum;
};
int dummy::dum = 0; //This is important for static variable, otherwise you'd get a linking error
int main()
{
dummy d;
d.dum = 1;
std::cout<<"Printing dum from object: "<<d.dum<<std::endl;
std::cout<<"Printing dum from class: "<<dummy::dum<<std::endl;
return 0;
}
これは印刷します:オブジェクトからダムを印刷:1クラスからダムを印刷:1
変数dumはクラス変数です。オブジェクトを介してアクセスしようとすると、コンパイラにそれがどのクラスの変数であるかが通知されます。変数を使用して、作成されたオブジェクトの数をカウントできるシナリオを考えてください。そこでは静的が役立ちます。
const
読み取り専用変数にするために使用されます。 const変数を一度に定義および宣言する必要があります。
上記と同じプログラムで、dumもconstにしましょう。
class dummy
{
public:
static const int dum; // This would give an error. You need to define it as well
static const int dum = 1; //this is correct
const int dum = 1; //Correct. Just not making it a class variable
};
主に、私がこれをやっていると仮定します:
int main()
{
dummy d;
d.dum = 1; //Illegal!
std::cout<<"Printing dum from object: "<<d.dum<<std::endl;
std::cout<<"Printing dum from class: "<<dummy::dum<<std::endl;
return 0;
}
Staticは理解しやすいものですが、C++ではconstは台無しになります。次のリソースは、理解を深めるのに役立ちます。 http://duramecho.com/ComputerInformation/WhyHowCppConst.html
定数は「変更不可」を意味します
静的は「静的インスタンス(メモリ内) vs動的インスタンス(スタック上)」を意味します。静的変数はプログラムの実行中に存在します。動的なものは、必要に応じて作成および破棄されます。
変数は1つまたは両方にすることができます。
定数変数は変更できません。静的変数はファイルに対してプライベートであり、プログラムコード内でのみアクセス可能であり、他のユーザーにはアクセスできません。
constは定数を意味し、その値は実行時に明示的に変更するのではなく、コンパイル時に定義されます。定数の値は実行時に変更できません
ただし、静的変数は、実行時に初期化および変更できる変数です。ただし、静的変数は、静的変数がプログラム全体で値を保持するという意味で変数とは異なります。つまり、その有効期間はプログラムのものであるか、動的割り当て方法を使用してメモリがプログラムによって割り当て解除されるまでです。ただし、プログラムの有効期間全体にわたって値を保持していても、コードブロックの外部ではアクセスできません
静的変数の詳細については、 here を参照してください