Введение

Тип структуры данных
справочная информация

Класс в C++ – это пользовательский тип или структура данных, объявленная одним из ключевых слов class, struct или union (первые два совместно называются не-union классами), который содержит данные и функции (также называемые переменными-членами и методами) в качестве своих членов, доступ к которым определяется тремя спецификаторами доступа: private, protected или public. По умолчанию доступ к членам класса C++, объявленного с помощью ключевого слова class, является закрытым (private). Закрытые члены недоступны вне класса; доступ к ним возможен только через методы класса. Публичные члены формируют интерфейс класса и доступны вне класса. Экземпляры класса называются объектами и могут содержать переменные-члены, константы, методы и перегруженные операторы, определенные программистом.

Различия между структурой и классом в C++

В C++, класс, определенный с помощью ключевого слова `class`, по умолчанию имеет закрытые члены и базовые классы. Структура — это класс, определенный с помощью ключевого слова `struct`. Её члены и базовые классы по умолчанию являются открытыми. На практике структуры обычно используются для хранения данных без функций. При наследовании структуры от класса или структуры спецификатор доступа по умолчанию для базового класса или структуры — открытый. А при наследовании класса спецификатор доступа по умолчанию — закрытый.

ПОД-структы

POD-структура (Plain Old Data Structure) — это агрегатный класс, не являющийся объединением, который не содержит нестатических членов данных типа non-POD структуры, non-POD объединения (или массива таких типов) или ссылки, а также не имеет пользовательского оператора присваивания и пользовательского деструктора. По этой причине POD-структуры иногда в разговорной речи называют "структурами в стиле C".

Свойства, общие для структур в C и POD-структов в C++

Данные членов располагаются в памяти таким образом, что последующие члены имеют более высокие адреса в объекте, за исключением случаев, когда они разделены спецификатором доступа. Два типа POD-структур совместимы по компоновке, если они имеют одинаковое количество нестатических членов данных, и соответствующие нестатические члены данных (в порядке их объявления) имеют совместимые по компоновке типы. POD-структура может содержать безымянные отступы. Указатель на объект POD-структуры, преобразованный с помощью reinterpret_cast, указывает на его первый член и наоборот, что означает отсутствие отступов в начале POD-структуры.

Декларация и использование

Классы C++ имеют свои собственные члены. Эти члены включают переменные (включая другие структуры и классы), функции (уникальные идентификаторы или перегруженные операторы), известные как методы, конструкторы и деструкторы. Члены объявляются с публичным или приватным доступом, используя спецификаторы доступа `public:` и `private:` соответственно. Любой член, объявленный после спецификатора, будет иметь соответствующий уровень доступа до тех пор, пока не будет объявлен другой спецификатор. Также существует наследование между классами, которое может использовать спецификатор `protected:`.

Глобальный и локальный класс

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

Сходство между конструкторами и деструкторами

Оба имеют то же имя, что и класс, в котором они объявлены. Если пользователь не определил их самостоятельно, они доступны в классе по умолчанию, но теперь могут только выделять и освобождать память для объектов класса в момент их создания или уничтожения. Для производного класса: во время выполнения конструктора базового класса конструктор производного класса ещё не вызывается; во время выполнения деструктора базового класса деструктор производного класса уже был вызван. В обоих случаях члены данных производного класса находятся в неопределённом состоянии.

Шаблоны классов

В C++ объявления классов могут быть сгенерированы из шаблонов классов. Такие шаблоны классов представляют собой семейство классов. Конкретное объявление класса получается путем специализации шаблона с одним или несколькими аргументами шаблона. Шаблон, специализируемый с определенным набором аргументов, называется специализацией шаблона.

Свойства

Синтаксис C++ стремится сделать каждый аспект класса похожим на синтаксис базовых типов данных. Поэтому перегруженные операторы позволяют оперировать классами так же, как целыми числами и числами с плавающей точкой, массивы классов могут быть объявлены с использованием синтаксиса квадратных скобок (например, имя_структурной_переменной[размер]), а к указателям на классы можно обращаться так же, как к указателям на встроенные типы данных.

Пройдите по ссылке

Многие программисты предпочитают использовать амперсанд (&) при объявлении аргументов функции, работающей со структурами. Это связано с тем, что при передаче по ссылке требуется передать в функцию только одно слово (обычно 4 байта на 32-битной машине, 8 байт на 64-битной машине), то есть адрес переменной. В противном случае, при передаче по значению аргумент необходимо копировать каждый раз при вызове функции, что неэффективно для больших структур. Поскольку передача по ссылке позволяет функции изменять исходную структуру, ключевое слово `const` следует использовать для гарантии того, что функция не изменит параметр (см. const-корректность), если это не требуется.