3. Структуры (structures)
Немного посложнее выглядят структуры. Структуры – это способ хранения информации в нескольких переменных. Поясню поподробнее. В одной переменной можно хранить сразу несколько. Объявляется структура вот так:
1 2 3 4 5 |
struct tank{ int health; string name; int power }; |
Осталось лишь понять, как информацию из структуры собственно говоря извлечь. Делается это с помощью оператора «точка» - оператор бинарный. Первый операнд – имя переменной, из которой извлекается, второй – имя переменной, которая извлекается (к примеру, tank.health). Как правило, хоть это и не принципиально, пробелов не ставится. Возвращаемый тип соответственно зависит от типа извлекаемой переменной.
Кроме того, в структуре могут быть и функции – члены структур. Это единственные функции, из которых структурные переменные видны напрямую, без применения оператора «точка». И еще один аспект – в этих функциях виден специальный указатель – this, это указатель на всю переменную, содержащую структуру.
Еще одна вещь – это конструкторы и деструкторы. Тут все просто. Конструкторы – функции-члены, вызываемые непосредственно перед созданием экземпляра структуры, деструкторы – перед непосредственным уничтожением – к примеру, после выполнения программы или после уничтожения содержимого указателя оператором delete. Ни тот ни другой не имеют возвращаемого типа вообще. Даже void. Конструктор имеет имя такое же, как и у структуры, к деструктору прибавляется тильда (~, над “ё”).
Любые функции, включая функции-члены структуры, кроме деструкторов можно перегружать. Перегруженная функция – функция, имеющая несколько реализаций, различающихся возвращаемым типом или списком аргументов, но имеющих одно имя. В зависимости от требуемого получаемого типа или получаемых аргументов компилятор вызывает нужную функцию. С перегруженными конструкторами сложнее.
Конструкторы, не имеющеие списка аргументов, называются конструкторами по умолчанию. Они вызываются, если нет ничего перечисленного далее.
Конструкторы, имеющие один аргумент типа «const c&”, где с – имя структуры называются конструкторами копирования или конструкторами копии. Они вызываются при вызове оператора «=» между двумя значениями типа c.
Конструкторы, имеющие один аргумент другого типа, называются конструкторами преобразования и вызываются при явном преобразовании к типу структуры (явно написано «преобразовать к типу») или неявном (при приравнивании к значению другого типа).
И, наконец, конструкторы, имеющие другой список аргументов, вызываются видом «a(b,c,d) e», что означает «создается экземпляр класса a конструктором со списком аргументов типов переменных как у переменных соответственно b, c, d и именем e. Запутано, но разберетесь.
4. Константы
С константами все просто – константы – переменные, которые невозможно изменить, то есть задал один раз значение, и все, только читай. Обозначаются константы в духе
1 |
const int c; |
Константами могут быть и функции-члены структуры. С ними все тоже достаточно просто. То, что функция является константой, гарантирует, что структурные переменные не будут изменены. Если константа является функцией, то ключевое слово пишется в заключительной части прототипа, то есть перед точкой с запятой или открывающей фигурной скобкой.
В редких случаях требуется, чтобы переменная, от которой не зависит состояние структуры, была в функции-константе изменена. В таком случае перед объявлением переменной ставится ключевое слово mutable, что значит, что переменная не может быть константой. Так-то.
