Структуры


Предыдущая страница
Следующая страница  

Структура представляет собой еще один пользовательский тип данных, доступный в программировании на языке D, который позволяет комбинировать элементы данных разных типов.

Структуры используются для представления записей. Предположим, вы хотите отслеживать свои книги в библиотеке. Вы можете отслеживать следующие атрибуты каждой книги:

Определение структуры

Чтобы определить структуру, вы должны использовать оператор struct. Оператор struct определяет для вашей программы новый тип данных с более чем одним членом. Формат выражения struct такой:

struct [тег структуры] { 
   объявление члена; 
   объявление члена; 
   ... 
   объявление члена; 
} [Одна или несколько переменных типа структуры]; 

Тег структуры является необязательным, а объявление каждого члена является обычным объявлением переменной, таким как int i; или float f;, или любое другое допустимое определение переменной. В конце определения структуры до точки с запятой вы можете указать одну или несколько переменных типа этой структуры, которые являются необязательными. Вот как вы бы объявили структуру Books:

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

Доступ к членам структуры

Чтобы получить доступ к любому члену структуры, вы используете оператор доступа к члену (.). Оператор доступа в коде выглядит как точка между именем переменной структуры и членом структуры, к которому мы хотим получить доступ. Вы можете использовать ключевое слово struct для определения переменных типа структуры. В следующем примере объясняется использование структуры:

import std.stdio; 
 
struct Books { 
   char [] title; 
   char [] author; 
   char [] subject; 
   int   book_id; 
}; 
 
void main( ) { 
   Books Book1;        /* Объявление Book1 типа Book */ 
   Books Book2;        /* Объявление Book2 типа Book */ 
   
   /* спецификация книги 1 */ 
   Book1.title = "D Programming".dup; 
   Book1.author = "Raj".dup; 
   Book1.subject = "D Programming Tutorial".dup;
   Book1.book_id = 6495407; 
   
   /* спецификация книги 2 */ 
   Book2.title = "D Programming".dup; 
   Book2.author = "Raj".dup; 
   Book2.subject = "D Programming Tutorial".dup; 
   Book2.book_id = 6495700; 
   
   /* вывести информацию о Book1 */ 
   writeln( "Заголовок Book1 : ", Book1.title); 
   writeln( "Автор Book1 : ", Book1.author); 
   writeln( "Тема Book1 : ", Book1.subject); 
   writeln( "Идентификатор Book1 : ", Book1.book_id);  
   
   /* вывести информацию о Book2 */ 
   writeln( "Заголовок Book2 : ", Book2.title); 
   writeln( "Автор Book2 : ", Book2.author); 
   writeln( "Тема Book2 : ", Book2.subject); 
   writeln( "Идентификатор Book2 : ", Book2.book_id); 
}

Когда вы скомпилируете и выполните эту программу, она возвратит следующий результат:

Заголовок Book1 : D Programming
Автор Book1 : Raj
Тема Book1 : D Programming Tutorial
Идентификатор Book1 : 6495407
Заголовок Book2 : D Programming
Автор Book2 : Raj
Тема Book2 : D Programming Tutorial
Идентификатор Book2 : 6495700

Структуры как аргументы функции

Вы можете передавать структуру как аргумент функции практически таже, как вы передаете любую другую переменную или указатель. Вы можете получать доступ к переменным структуры таким же образом, как вы получали доступ в приведенном выше примере:

import std.stdio;

struct Books { 
   char [] title; 
   char [] author; 
   char [] subject; 
   int   book_id; 
}; 
 
void main( ) { 
   Books Book1;        /* Объявление Book1 типа Book */ 
   Books Book2;        /* Объявление Book2 типа Book */  
   
   /* спецификация книги 1 */ 
   Book1.title = "D Programming".dup; 
   Book1.author = "Raj".dup; 
   Book1.subject = "D Programming Tutorial".dup; 
   Book1.book_id = 6495407;  
   
   /* спецификация книги 2 */ 
   Book2.title = "D Programming".dup; 
   Book2.author = "Raj".dup; 
   Book2.subject = "D Programming Tutorial".dup; 
   Book2.book_id = 6495700;  
   
   /* вывести информацию о Book1 */ 
   printBook( Book1 );  
   
   /* вывести информацию о Book2 */ 
   printBook( Book2 );  
}
 
void printBook( Books book ) { 
   writeln( "Заголовок книги : ", book.title); 
   writeln( "Автор книги : ", book.author); 
   writeln( "Тема книги : ", book.subject); 
   writeln( "Идентификатор книги : ", book.book_id); 
}

Когда вы скомпилируете и выполните эту программу, она возвратит следующий результат:

Заголовок книги : D Programming
Автор книги : Raj
Тема книги : D Programming Tutorial
Идентификатор книги : 6495407
Заголовок книги : D Programming
Автор книги : Raj
Тема книги : D Programming Tutorial
Идентификатор книги : 6495700

Инициализация структуры

Структуры можно инициализировать в двух формах: в одной используется конструктор, а другая с использованием формата {}. Пример показан ниже.

Пример

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); 
   writeln( "Автор книги : ", book.author); 
   writeln( "Тема книги : ", book.subject); 
   writeln( "Идентификатор книги : ", book.book_id); 
}

Когда вы скомпилируете и выполните эту программу, она возвратит следующий результат:

Название книги : D Programming
Автор книги : Raj
Тема книги : D Programming Tutorial
Идентификатор книги : 6495407
Название книги : D Programming
Автор книги : Raj
Тема книги : D Programming Tutorial
Идентификатор книги : 6495407
Название книги : Obj C programming
Автор книги : Raj
Тема книги : Empty
Идентификатор книги : 1001

Статические члены

Статические переменные инициализируются только один раз. Например, чтобы иметь уникальные идентификаторы для книг, мы можем сделать id статическим, увеличивать эту переменную и присваивать её в поле book_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); 
   writeln( "Автор книги : ", book.author); 
   writeln( "Тема книги : ", book.subject); 
   writeln( "Идентификатор книги : ", book.book_id); 
}

Когда вы скомпилируете и выполните эту программу, она возвратит следующий результат:

Название книги : D Programming
Автор книги : Raj
Тема книги : D Programming Tutorial
Идентификатор книги : 1001
Название книги : D Programming
Автор книги : Raj
Тема книги : D Programming Tutorial
Идентификатор книги : 1002
Название книги : Obj C programming
Автор книги : Raj
Тема книги : Empty
Идентификатор книги : 1003

К сожалению, авторы этого учебника не упомянули о возможности объявлять методы (функции-члены) в структуре. Таким образом, про них рассказано гораздо меньше, чем можно было бы (например, о конструкторах, о перегрузке операций и т.д.). Фактически структуры в языке D имеют большинство свойств класса (см. раздел ООП), за исключением следующих отличий:

Возможно, я ещё чего-то не знаю, и моё описание тоже не полное – прим. пер.


Предыдущая страница
Следующая страница