C++ Структура (struct)

Массивы C/C++ позволяют определять переменные, которые могут хранить элементы данных одного типа, ноСтруктура— это ещё один доступный определяемый пользователем тип данных в C++, который позволяет хранить элементы данных разных типов.

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

  • Название: название
  • Автор: автор
  • Тема: категория
  • ID книги: идентификатор книги

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

В C++ инструкция struct используется для определения структуры.

Структура — это определяемый пользователем тип данных, используемый для объединения данных различных типов. Подобно классам, структуры позволяют определять переменные-члены и функции-члены.

Чтобы определить структуру, необходимо использоватьstruct-инструкцию. Инструкция struct определяет новый тип данных, содержащий несколько членов; формат инструкции struct следующий:

struct type_name { member_type1 member_name1; member_type2 member_name2; member_type3 member_name3; . . } object_names;

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

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

Преимущества структур:

  • Простая инкапсуляция данных: подходит для инкапсуляции простых данных нескольких типов, обычно используется для хранения данных.
  • Легковесность: по сравнению сclass, синтаксис структуры более лаконичен и подходит для небольших объектов данных.
  • Поддержка объектно-ориентированного программирования: поддерживает конструкторы, функции-члены и управление доступом, позволяя реализовать объектно-ориентированный дизайн.

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

Чтобы получить доступ к членам структуры, мы используемоператор доступа к членам (.). Оператор доступа к членам — это точка между именем переменной структуры и членом структуры, к которому мы хотим получить доступ.

Следующий пример демонстрирует использование структур:

Пример

#include <iostream> #include <cstring> using namespace std; // Объявление типа структуры Books struct Books { char title[50]; char author[50]; char subject[100]; int book_id; }; int main( ) { Books Book1; // Определение переменной Book1 типа структуры Books Books Book2; // Определите переменную Book2 типа структуры Books // Детали Book1 strcpy( Book1.title, "Учебник по C++"); strcpy( Book1.author, "Пример"); strcpy( Book1.subject, "Язык программирования"); Book1.book_id = 12345; // Детали Book2 strcpy( Book2.title, "Учебник по CSS"); strcpy( Book2.author, "Пример"); strcpy( Book2.subject, "Фронтенд-технология"); Book2.book_id = 12346; // Вывод информации о Book1 cout << "Название первой книги:" << Book1.title <<endl; cout << "Автор первой книги:" << Book1.author <<endl; cout << "Категория первой книги:" << Book1.subject <<endl; cout << "ID первой книги:" << Book1.book_id <<endl; // Вывод информации о Book2 cout << "Название второй книги:" << Book2.title <<endl; cout << "Автор второй книги:" << Book2.author <<endl; cout << "Категория второй книги:" << Book2.subject <<endl; cout << "ID второй книги:" << Book2.book_id <<endl; return 0; }

Пример определяет тип структуры Books и две её переменные Book1 и Book2. Когда приведённый выше код компилируется и выполняется, он выдаёт следующие результаты:

第一本书标题 : C++ 教程
第一本书作者 : Example
第一本书类目 : 编程语言
第一本书 ID : 12345
第二本书标题 : CSS 教程
第二本书作者 : Example
第二本书类目 : 前端技术
第二本书 ID : 12346

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

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

Пример

#include <iostream> #include <cstring> using namespace std; void printBook( struct Books book ); // Объявление типа структуры Books struct Books { char title[50]; char author[50]; char subject[100]; int book_id; }; int main( ) { Books Book1; // Определить переменную Book1 типа struct Books Books Book2; // Определить переменную Book2 типа struct Books // Детали Book1 strcpy( Book1.title, "Учебник по C++"); strcpy( Book1.author, "Пример"); strcpy( Book1.subject, "Язык программирования"); Book1.book_id = 12345; // Детали Book2 strcpy( Book2.title, "Учебник по CSS"); strcpy( Book2.author, "Пример"); strcpy( Book2.subject, "Фронтенд-технология"); Book2.book_id = 12346; // Вывод информации о Book1 printBook( Book1 ); // Вывод информации о Book2 printBook( Book2 ); return 0; } void printBook( struct Books book ) { cout << "Название книги:" << book.title <<endl; cout << "Автор книги:" << book.author <<endl; cout << "Категория книги:" << book.subject <<endl; cout << "ID книги:" << book.book_id <<endl; }

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

书标题 : 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.

Давайте используем указатель на структуру, чтобы переписать приведённый выше пример, это поможет вам понять концепцию указателей на структуры:

Пример

#include <iostream> #include <string> using namespace std; // Объявить тип структуры Books struct Books { 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) {} }; // Функция для вывода информации о книге, принимает указатель на структуру Books void printBookInfo(const Books* book) { cout << "Название книги:" << book->title << endl; cout << "Автор книги:" << book->author << endl; cout << "Категория книги:" << book->subject << endl; cout << "ID книги:" << book->book_id << endl; } int main() { // Создать два объекта книг Books Book1("Учебник по C++", "Пример", "Язык программирования", 12345); Books Book2("Учебник по CSS", "Пример", "Фронтенд-технология", 12346); // Использовать указатели для указания на объекты этих двух книг Books* ptrBook1 = &Book1; Books* ptrBook2 = &Book2; // Вывести информацию о книге, передать указатели printBookInfo(ptrBook1); printBookInfo(ptrBook2); return 0; }

Описание:

  • Определение структуры: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, подходящая для простой инкапсуляции данных без слишком большого количества сложных возможностей.

Объединение структур с функциями

Вы можете инициализировать структуру через конструктор, а также передавать структуру по ссылке, чтобы избежать ненужных копирований.

Пример

struct Books {
    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();
}
Другие расширения