C での静的メンバー変数の初期化 : なぜクラスの外で行うのですか?
C では、静的メンバー変数はクラス宣言の外で初期化されます。より直観的なクラス内初期化からのこの逸脱は、開発者の間で好奇心を引き起こしました。この設計上の決定の背後に論理的な理由はありますか?
基本的な理由は、静的メンバーが 1 つの変換単位内で定義される必要があることにあります。クラス内で初期化が許可されている場合、異なる翻訳単位で同じ変数が複数定義され、単一定義ルールに違反する可能性があります。
これを説明するために、次の例を考えてみましょう。
struct Gizmo { static string name = "Foo"; };
このコードが許可された場合、名前はこのヘッダー ファイルを含む各翻訳単位で定義されます。これは、変数が 1 つの定義のみを持つことを義務付ける 1 つの定義ルールと矛盾します。
ただし、C では、宣言内で整数の静的メンバーの初期化を許可する糖衣構文が提供されています。
struct Gizmo { static const int count = 42; };
これは、式が const 整数型または列挙型であり、コンパイル時に評価でき、かつ定義がまだ存在する限り許容されます。単一定義ルールに違反しない単一の翻訳単位。例:
// gizmo.cpp #include "gizmo.h" const int Gizmo::count;
以上がC の静的メンバー変数をクラス宣言の外で初期化する理由の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。