C++ Структура (struct)
Массивы C/C++ позволяют определять переменные, которые могут хранить элементы данных одного типа, ноСтруктура— это ещё один доступный определяемый пользователем тип данных в C++, который позволяет хранить элементы данных разных типов.
Структуры используются для представления записи. Предположим, вы хотите отслеживать движение книг в библиотеке; возможно, вам потребуется отслеживать следующие атрибуты каждой книги:
- Название: название
- Автор: автор
- Тема: категория
- ID книги: идентификатор книги
Определение структуры
В C++ инструкция struct используется для определения структуры.
Структура — это определяемый пользователем тип данных, используемый для объединения данных различных типов. Подобно классам, структуры позволяют определять переменные-члены и функции-члены.
Чтобы определить структуру, необходимо использоватьstruct-инструкцию. Инструкция struct определяет новый тип данных, содержащий несколько членов; формат инструкции struct следующий:
type_name— это имя типа структуры,member_type1 member_name1— это стандартное определение переменной, напримерint i;илиfloat f;или другие допустимые определения переменных. В конце определения структуры, перед последней точкой с запятой, можно указать одну или несколько переменных структуры; это необязательно. Далее объявляется тип структурыBooks, переменная —book:
Преимущества структур:
- Простая инкапсуляция данных: подходит для инкапсуляции простых данных нескольких типов, обычно используется для хранения данных.
- Легковесность: по сравнению с
class, синтаксис структуры более лаконичен и подходит для небольших объектов данных. - Поддержка объектно-ориентированного программирования: поддерживает конструкторы, функции-члены и управление доступом, позволяя реализовать объектно-ориентированный дизайн.
Доступ к членам структуры
Чтобы получить доступ к членам структуры, мы используемоператор доступа к членам (.). Оператор доступа к членам — это точка между именем переменной структуры и членом структуры, к которому мы хотим получить доступ.
Следующий пример демонстрирует использование структур:
Пример
Пример определяет тип структуры Books и две её переменные Book1 и Book2. Когда приведённый выше код компилируется и выполняется, он выдаёт следующие результаты:
第一本书标题 : C++ 教程 第一本书作者 : Example 第一本书类目 : 编程语言 第一本书 ID : 12345 第二本书标题 : CSS 教程 第二本书作者 : Example 第二本书类目 : 前端技术 第二本书 ID : 12346
Структуры как параметры функций
Вы можете передать структуру в качестве параметра функции так же, как переменные или указатели других типов. Вы можете использовать способ из приведённого выше примера для доступа к переменным структуры:
Пример
Когда приведенный выше код скомпилирован и выполнен, он выдает следующие результаты:
书标题 : C++ 教程 书作者 : Example 书类目 : 编程语言 书 ID : 12345 书标题 : CSS 教程 书作者 : Example 书类目 : 前端技术 书 ID : 12346
Подробное введение в различные части структуры
ключевое слово struct:используется для определения структуры; оно сообщает компилятору, что далее следует пользовательский тип.
Переменные-члены:Переменные-члены — это элементы данных, определённые в структуре; они могут быть любого базового типа или других пользовательских типов. В struct эти члены по умолчанию являются public и доступны напрямую.
-
Функции-члены:Структуры также могут содержать функции-члены, что делает их функционально похожими на классы. Функции-члены могут работать с переменными-членами структуры, обеспечивая инкапсуляцию и манипулирование данными.
-
Права доступа:Как и в случае с class, в struct можно использовать public, private и protected для определения прав доступа к членам. В struct все члены по умолчанию public, а в class — private.
Указатель на структуру
Вы можете определять указатели на структуры так же, как и указатели на переменные других типов, как показано ниже:
struct Books *struct_pointer;
Приведённый выше код определяет указатель struct_pointer на структуру Books.
Теперь вы можете сохранить адрес переменной структуры в переменной-указателе, определённой выше. Чтобы найти адрес переменной структуры, поставьте&оператор перед именем структуры, как показано ниже:
struct_pointer = &Book1;
Приведённый выше код присваивает адрес переменной структуры Book1 переменной struct_pointer.
Чтобы получить доступ к членам структуры с помощью указателя на эту структуру, необходимо использовать->оператор, как показано ниже:
struct_pointer->title;
Приведённый выше код обращается к члену title структуры Book1 через struct_pointer.
Давайте используем указатель на структуру, чтобы переписать приведённый выше пример, это поможет вам понять концепцию указателей на структуры:
Пример
Описание:
Определение структуры:
BooksОпределение структуры такое же, как и раньше, и содержитtitle、author、subjectиbook_idчетыре переменные-члена, а также конструктор для инициализации этих членов.printBookInfoФункция: Теперь эта функция принимает указатель наBooksУказатель на структуруconst Books* book. Внутри функции мы используем->оператор для доступа к переменной-члену, на которую указывает указатель на структуру.mainФункция:Создано два
Booksобъекта типаBook1иBook2。Использование
&оператор для получения адресов двух объектов и присваивания их указателямptrBook1иptrBook2。Вызов
printBookInfoПри передаче в функцию передаётся указатель наBooksУказатель на объект.
Когда приведенный выше код скомпилирован и выполнен, он выдает следующие результаты:
书籍标题: C++ 教程 书籍作者: Example 书籍类目: 编程语言 书籍 ID: 12345 书籍标题: CSS 教程 书籍作者: Example 书籍类目: 前端技术 书籍 ID: 12346
ключевое слово typedef
Ниже приведён более простой способ определения структуры: можно задать псевдоним для созданного типа. Например:
typedef struct Books
{
char title[50];
char author[50];
char subject[100];
int book_id;
}Books;
Теперь вы можете напрямую использоватьBooksдля определенияBooksпеременных этого типа, без необходимости использовать ключевое слово struct. Вот пример:
Books Book1, Book2;
Вы можете использовать ключевое словоtypedefдля определения типов, не являющихся структурами, как показано ниже:
typedef long int *pint32; pint32 x, y, z;
x, y и z — все указатели на long int.
Различия между структурами и классами
В C++ struct и class по сути очень похожи; единственное различие — разрешение доступа по умолчанию:
structДоступ к членам и наследование по умолчаниюpublic。classДоступ к членам и наследование по умолчаниюprivate。
Вы можетеstructрассматриваются как упрощённая формаclass, подходящая для простой инкапсуляции данных без слишком большого количества сложных возможностей.
Объединение структур с функциями
Вы можете инициализировать структуру через конструктор, а также передавать структуру по ссылке, чтобы избежать ненужных копирований.
Пример
string title;
string author;
string subject;
int book_id;
// конструктор
Books(string t, string a, string s, int id)
: title(t), author(a), subject(s), book_id(id) {}
void printInfo() const {
cout << Название книги: << title << endl;
cout << Автор книги: << author << endl;
cout << Категория книги: << subject << endl;
cout << ID книги: << book_id << endl;
}
};
void printBookByRef(const Books& book) {
book.printInfo();
}