Структура представляет собой еще один пользовательский тип данных, доступный в программировании на языке 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 имеют большинство свойств класса (см. раздел ООП), за исключением следующих отличий:
Возможно, я ещё чего-то не знаю, и моё описание тоже не полное – прим. пер.