構造体 は、データ・オブジェクトの順序付けられたグループから構成されます。 配列のエレメントとは異なり、構造体の中のデータ・オブジェクトには、さまざまなデータ型を指定できます。 構造体内の各データ・オブジェクトは、 メンバー またはフィールド です。
構造体のメンバーは
、可変的に変更される型を除き、任意のオブジェクト型を持ちます。
最後のメンバーを除く すべてのメンバーは、完了型である必要があります。特別な場合として、複数のメンバーを持つ 構造体の最後のエレメントは、不完全な配列型を持つことができます。この型を柔軟な配列メンバー と呼びます。
C++ では、構造体メンバーは完了型である必要があります。
論理的に関連したオブジェクトをグループ化するには、構造体を使用します。例えば、 あるアドレスの複数のコンポーネントにストレージを割り振るには、次の変数を定義します。
int street_no; char *street_name; char *city; char *prov; char *postal_code;
複数のアドレスにストレージを割り振るには、構造体データ型と、構造体データ型を保持するのに必要な数のみ 変数を定義することによって、各アドレスのコンポーネントをグループ化します。
C++ では、
構造体は、そのメンバーおよび継承が、デフォルトにより public であるということを除けば、クラスと同じです。
次の例では、int street_no; から char *postal_code; までの行は、 構造体タグ address を宣言しています。
struct address { int street_no; char *street_name; char *city; char *prov; char *postal_code; }; struct address perm_address; struct address temp_address; struct address *p_perm_address = &perm_address;
変数 perm_address と temp_address は、 構造体データ型 address のインスタンスです。 これらの両方には、address の宣言に記述されたメンバーが含まれています。 ポインター p_perm_address は、address という構造体を指し、perm_address を指すように初期化されます。
ドット演算子 (.) 付きの構造変数の名前か、矢印演算子 (->) 付きのポインターとメンバー名を指定することによって、構造体のメンバーを参照します。 例えば、次の例
perm_address.prov = "Ontario"; p_perm_address -> prov = "Ontario";
は、ストリング "Ontario" を指すポインターを、構造体 perm_address にあるポインター prov に代入します。
構造体への参照はすべて、完全修飾されている必要があります。 例では、prov のみでは、4 番目のフィールドを参照することはできません。 このフィールドは、perm_address.prov によって参照する必要があります。
同一メンバーがあるが別の名前が付けられている構造体には、互換性はなく、互いに割り当てることはできません。
構造体は、ストレージを節約するためのものではありません。 バイト・マッピングの直接制御を行う必要がある場合は、ポインターを使用します。
構造体の定義ごとに、同じソース・ファイルにある他の構造体型とは異なる
、または互換性のない新規の構造体型を
作成します。ただし、すでに定義された構造体型への参照である型指定子は同じ型です。構造体タグが、参照と定義を関連付け、型名として
効果的に機能します。つまり、以下の例では構造体型 j および k だけが同じ型になります。
struct { int a; int b; } h; struct { int a; int b; } i; struct S { int a; int b; } j; struct S k;
関連参照