D-programming-structs

提供:Dev Guides
移動先:案内検索

Dプログラミング-構造体

*structure* は、Dプログラミングで利用できるユーザー定義のデータ型です。これにより、さまざまな種類のデータ項目を組み合わせることができます。

構造は、レコードを表すために使用されます。 図書館で本を追跡したいとします。 あなたは、各本に関する次の属性を追跡することができます-

  • タイトル
  • 著者
  • 件名
  • ブックID

構造の定義

構造を定義するには、 struct ステートメントを使用する必要があります。 structステートメントは、プログラムに複数のメンバーを持つ新しいデータ型を定義します。 構造体ステートメントの形式はこれです-

struct [structure tag] {
   member definition;
   member definition;
   ...
   member definition;
} [one or more structure variables];
  • 構造タグ*はオプションであり、各メンバー定義はint iなどの通常の変数定義です。またはfloat f;または他の有効な変数定義。 セミコロンの前の構造の定義の最後で、オプションの構造変数を1つ以上指定できます。 Books構造を宣言する方法は次のとおりです-
struct Books {
   char [] title;
   char [] author;
   char [] subject;
   int   book_id;
};

構造体メンバーへのアクセス

構造体のメンバーにアクセスするには、* memberアクセス​​演算子(。)を使用します。 メンバーアクセス演算子は、構造変数名とアクセスする構造メンバーの間のピリオドとしてコーディングされます。 *struct キーワードを使用して、構造タイプの変数を定義します。 次の例は、構造の使用法を説明しています-

import std.stdio;

struct Books {
   char [] title;
   char [] author;
   char [] subject;
   int   book_id;
};

void main( ) {
   Books Book1;       /*Declare Book1 of type Book*/
   Books Book2;       /*Declare Book2 of type Book*/

  /*book 1 specification*/
   Book1.title = "D Programming".dup;
   Book1.author = "Raj".dup;
   Book1.subject = "D Programming Tutorial".dup;
   Book1.book_id = 6495407;

  /*book 2 specification*/
   Book2.title = "D Programming".dup;
   Book2.author = "Raj".dup;
   Book2.subject = "D Programming Tutorial".dup;
   Book2.book_id = 6495700;

  /*print Book1 info*/
   writeln( "Book 1 title : ", Book1.title);
   writeln( "Book 1 author : ", Book1.author);
   writeln( "Book 1 subject : ", Book1.subject);
   writeln( "Book 1 book_id : ", Book1.book_id);

  /*print Book2 info*/
   writeln( "Book 2 title : ", Book2.title);
   writeln( "Book 2 author : ", Book2.author);
   writeln( "Book 2 subject : ", Book2.subject);
   writeln( "Book 2 book_id : ", Book2.book_id);
}

上記のコードをコンパイルして実行すると、次の結果が生成されます-

Book 1 title : D Programming
Book 1 author : Raj
Book 1 subject : D Programming Tutorial
Book 1 book_id : 6495407
Book 2 title : D Programming
Book 2 author : Raj
Book 2 subject : D Programming Tutorial
Book 2 book_id : 6495700

関数の引数としての構造

他の変数またはポインターを渡すのと非常によく似た方法で、構造体を関数の引数として渡すことができます。 上記の例でアクセスしたのと同様の方法で構造変数にアクセスします-

import std.stdio;

struct Books {
   char [] title;
   char [] author;
   char [] subject;
   int   book_id;
};

void main( ) {
   Books Book1;       /*Declare Book1 of type Book*/
   Books Book2;       /*Declare Book2 of type Book*/

  /*book 1 specification*/
   Book1.title = "D Programming".dup;
   Book1.author = "Raj".dup;
   Book1.subject = "D Programming Tutorial".dup;
   Book1.book_id = 6495407;

  /*book 2 specification*/
   Book2.title = "D Programming".dup;
   Book2.author = "Raj".dup;
   Book2.subject = "D Programming Tutorial".dup;
   Book2.book_id = 6495700;

  /*print Book1 info*/
   printBook( Book1 );

  /*Print Book2 info*/
   printBook( Book2 );
}

void printBook( Books book ) {
   writeln( "Book title : ", book.title);
   writeln( "Book author : ", book.author);
   writeln( "Book subject : ", book.subject);
   writeln( "Book book_id : ", book.book_id);
}

上記のコードをコンパイルして実行すると、次の結果が生成されます-

Book title : D Programming
Book author : Raj
Book subject : D Programming Tutorial
Book book_id : 6495407
Book title : D Programming
Book author : Raj
Book subject : D Programming Tutorial
Book book_id : 6495700

構造体の初期化

構造体は2つの形式で初期化できます。1つはコンストラクターを使用し、もう1つは\ {}形式を使用します。 例を以下に示します。

import std.stdio;

struct Books {
   char [] title;
   char [] subject = "Empty".dup;
   int   book_id = -1;
   char [] author = "Raj".dup;
};

void main( ) {
   Books Book1 = Books("D Programming".dup, "D Programming Tutorial".dup, 6495407 );
   printBook( Book1 );

   Books Book2 = Books("D Programming".dup,
      "D Programming Tutorial".dup, 6495407,"Raj".dup );
   printBook( Book2 );

   Books Book3 =  {title:"Obj C programming".dup, book_id : 1001};
   printBook( Book3 );
}

void printBook( Books book ) {
   writeln( "Book title : ", book.title);
   writeln( "Book author : ", book.author);
   writeln( "Book subject : ", book.subject);
   writeln( "Book book_id : ", book.book_id);
}

上記のコードをコンパイルして実行すると、次の結果が生成されます-

Book title : D Programming
Book author : Raj
Book subject : D Programming Tutorial
Book book_id : 6495407
Book title : D Programming
Book author : Raj
Book subject : D Programming Tutorial
Book book_id : 6495407
Book title : Obj C programming
Book author : Raj
Book subject : Empty
Book book_id : 1001

静的メンバー

静的変数は一度だけ初期化されます。 たとえば、書籍の一意のIDを取得するには、book_idを静的として作成し、書籍IDをインクリメントします。 例を以下に示します。

import std.stdio;

struct Books {
   char [] title;
   char [] subject = "Empty".dup;
   int   book_id;
   char [] author = "Raj".dup;
   static int id = 1000;
};

void main( ) {
   Books Book1 = Books("D Programming".dup, "D Programming Tutorial".dup,++Books.id );
   printBook( Book1 );

   Books Book2 = Books("D Programming".dup, "D Programming Tutorial".dup,++Books.id);
   printBook( Book2 );

   Books Book3 =  {title:"Obj C programming".dup, book_id:++Books.id};
   printBook( Book3 );
}

void printBook( Books book ) {
   writeln( "Book title : ", book.title);
   writeln( "Book author : ", book.author);
   writeln( "Book subject : ", book.subject);
   writeln( "Book book_id : ", book.book_id);
}

上記のコードをコンパイルして実行すると、次の結果が生成されます-

Book title : D Programming
Book author : Raj
Book subject : D Programming Tutorial
Book book_id : 1001
Book title : D Programming
Book author : Raj
Book subject : D Programming Tutorial
Book book_id : 1002
Book title : Obj C programming
Book author : Raj
Book subject : Empty
Book book_id : 1003