-
03-07-2019 - |
質問
キーワード static
の意味については言語によって違いがあると聞きましたが、それらの違いを統合する適切なリストは見つかりませんでした。
C ++での static
の意味について私が知っていること:
- 関数内のローカル静的変数の場合、変数は起動時に初期化され、値は関数呼び出し全体で保存されます。
- 静的データメンバーは、クラスのすべてのインスタンス間で共有されます。つまり、静的データメンバーのインスタンスは1つだけです。静的データメンバーは、ファイルスコープで初期化する必要があります。
- 静的メンバー関数は、静的メンバーにのみアクセスできます。
- 再帰コードでは、静的オブジェクトまたは変数は、コードブロックの異なるインスタンスで同じ状態になることが保証されています。
- ファイルスコープで定義された静的オブジェクトと変数には、内部リンケージのみがあります。他のファイルはそれらを使用できません。
static
の意味は他の言語でどのように変わりますか?
解決
C
- キーワードは、オブジェクトのリンケージまたは期間(ライフタイム)を変更できます。
- 変数は常に0に初期化されます
- 関数には内部リンケージがあります。
- ファイルレベルのスコープで宣言されている場合:変数には内部リンケージと静的期間があります(つまり、プログラムの存続期間中に存在します)
- ブロックスコープで宣言された場合:変数にはリンケージはありませんが、静的な期間
- 翻訳単位には、同じ静的変数の複数の宣言があります。ただし、それらは同じでなければならないことに注意してください。例:ファイルレベルのスコープ:
int a; // a has external linkage
static int a; // a now has static linkage
// same as if you wrote: static int a = 0;
//...
static int b; // static linkage
extern int b; // extern loses its meaning, b still has internal linkage
//...
extern int b; // b has external linkage
static int b; // error
//...
void func() {
static int x; // automatic linkage, static duration
// same as if you wrote: static int x = 0;
}
C ++
- ファイルレベルのスコープでは、変数とメンバーの両方の使用が非推奨になり、匿名の名前空間が採用されました。互換性としてのみ存在する
- 変数は、デフォルトで(Cのように)0に初期化されます
- " 6.7静的ストレージ期間(3.7.1)またはスレッドストレージ期間(3.7.2)を持つすべてのローカルオブジェクトのゼロ初期化(8.5)は、他の初期化が行われる前に実行されます[... ]"
- 変数は、
thread_local
指定子(C ++ 0x以降)を伴わない限り、静的な保存期間を持ちます - 翻訳単位には静的の定義が1つしかありません
- メンバー変数/関数は、インスタンスではなくクラスのプロパティであることを意味します 法的アクセス構文:instance.propertyまたはClass :: property
- 静的メンバー関数は静的メンバー変数のみにアクセスできます
そのような関数の
this
ポインターはありません - ただし、非静的メンバーは任意の静的メンバーにアクセスできます
- ファイルレベルのオブジェクトには、クラススコープを持つクラスメンバを除いて内部リンケージがあります
- クラスメンバは、クラス宣言またはクラス名とスコープ解決演算子を使用して明示的に外部で定義する必要があります
- 静的メソッドでは
this
を使用できません
ActionScript
- C ++のようなクラスメソッド
- 静的メソッドでは
this
またはsuper
を使用できません - インスタンス名ではなくクラス名のみを介してアクセス
- 継承されない
- ただし、派生クラスはベースの静的プロパティにアクセスできます
- staticキーワードとconstキーワードの両方で宣言された変数は、定数の宣言と同時に初期化する必要があります
オブジェクト指向デザイン
- シングルトンのデザインパターンは、多くの人が装飾的な静的オブジェクトと見なしています
- 工場設計パターンで使用
私は他の多くのことを見逃しているかもしれません-気軽に参加してください。
他のヒント
Delphiでは、静的キーワードはクラスメソッドの定義にのみ使用されます。 Delphiでは、 normal クラスメソッドをvirtualとして宣言し、サブクラスでオーバーライドできます。さらに、Delphiには、他の言語の this ポインターに似た self 変数があります。ただし、クラスメソッドでは、 self はインスタンスの代わりにメソッドが呼び出されるクラスを指します。
クラスメソッドの宣言 static の意味:
- サブクラスではオーバーライドできません
- self ポインターがありません
これは、静的クラスメソッドは定義されたクラスのクラスメンバーにのみアクセスでき、通常のクラスメソッドは派生クラスのオーバーライドされたクラスメンバーにアクセスできることを意味します。
Delphiのドキュメントには、通常、機能の変更不可能性を参照する静的な他の非公式の使用があります(それは単語ですか?たとえば、静的配列と動的配列。 Delphiのすべてのインスタンスメソッドは、特に宣言されていない限り静的です。
VB.NETでは、 Static
変数はC ++ローカルの静的変数に似ています。
ただし、クラス全体の Static
はありません。代わりに Shared
を使用してください。
C#では、静的キーワードを使用する3つの方法があります:
- クラス定義では、クラスは静的メンバーのみを公開し、インスタンス化することはできません
- クラスメンバー。つまり、クラスをインスタンス化することなくメンバーを呼び出すことができます。
- コンストラクター。つまり、静的メンバーが呼び出される前に静的コンストラクターが常に呼び出されます。 (これらは主にパフォーマンスのボトルネックであるため、推奨されません)
これが役立つことを願っています。
C#では、ほとんどの場合、「型のインスタンスではなく型に関連する」という意味です。
Pythonにはデコレーター@staticmethodがあります。これはクラスメンバーに適用されると、インスタンスではなくクラスでメソッドを使用可能にし、メソッドに自動引数を渡しません。 @classmethodデコレータは同様の機能を実行しますが、クラスを最初の引数として渡し、より便利にします。
Cでは、静的関数は、関数またはグローバル変数に、そのファイルが存在するファイルのローカルとしてフラグを立てます。
他の言語のプライベートのようなものです。並べ替え
関数内にある場合、staticは、実行時にスタック上ではなく、バイナリのデータセクションにその変数を事前に割り当てます。
VB.NETでは、staticはプロシージャレベルで使用され、変数がプロシージャのすべての実行に関連付けられていることを意味します(呼び出しごとに保存されます)。ただし、オブジェクト指向アプリケーションでのちょっとした難解な使い方です。
相手は「共有」ですこれは、メソッドまたはメンバーがタイプレベルであることを意味します(アクセスするためのインスタンスは必要ありません)。