ホームページ  >  記事  >  バックエンド開発  >  静的データ メンバーの初期化がクラス定義の外部で行われる必要があるのはなぜですか?

静的データ メンバーの初期化がクラス定義の外部で行われる必要があるのはなぜですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-05 19:57:02351ブラウズ

Why Must Static Data Member Initialization Happen Outside the Class Definition?

静的データ メンバーの初期化について

静的データ メンバーの初期化の独特な側面の 1 つは、クラス外に配置されることです。これにより、なぜこれが必要なのか、静的データ メンバーの宣言と定義にはどのような性質があるのか​​という疑問が生じます。

クラス外での初期化の理由

静的データメンバーは、非静的メンバーとは異なり、クラスの特定のインスタンスから独立して存在します。これらはメモリ内に固定アドレスを持ち、その有効期間はプログラム全体に及びます。静的データ メンバーの定義が 1 つだけ存在するようにするには、その定義はクラス定義の外側にある必要があります。これは、クラス定義は通常、ヘッダー ファイルに含まれており、ヘッダー ファイルは複数のオブジェクト ファイルに含まれる可能性があるためです。静的データ メンバーの定義がクラス内で許可されている場合、同じ変数が複数定義され、リンカ エラーが発生します。

宣言と定義

クラス定義内で、静的データ メンバーの初期化子を提供できます。ただし、これは初期化子を使用した単なる宣言であり、定義ではありません。 C での定義では、特定のアドレスを使用してメモリを割り当てる必要があります。静的データ メンバーのアドレスは、メモリ内のその位置と、クラスのすべてのインスタンス間で共有されるという事実に依存するため、その定義はクラスの外側で行う必要があります。

Example

次のコードを考えてみましょう。

<code class="cpp">class X {
    int normalValue = 5; // Non-static data member initialization
    static int i;
};

int X::i = 0; // Definition of the static data member</code>

ここで、静的データ メンバー i の宣言はクラス定義内にありますが、その定義はクラスの外にあります。これは、i の定義が 1 つだけ存在し、メモリ内に一意のアドレスがあることを保証するために必要です。

本質的に、NSDMI ではクラス内の静的データ メンバーの初期化が容易ですが、その定義は次のとおりである必要があります。コンパイルされたプログラム内での複数の定義を避けるために、依然として個別に提供されます。静的データ メンバーの宣言と定義は異なる目的を果たし、適切なメモリ管理とリンク エラーの防止のためにクラスの外に配置する必要があります。

以上が静的データ メンバーの初期化がクラス定義の外部で行われる必要があるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。