Когда представление типа скрыто, необходимо дать пользователю средства для инициализации переменных этого типа.
Непонятно как выставить начальное значение age.
Простейшее решение – до использования переменной вызывать некоторую функцию для ее инициализации, специальный публичный метод setAge().
Но это некрасивое и чреватое ошибками решение. Хорошо бы выставлять возраст студента только один раз, при создании и инициализации объекта. Это можно реализовать при помощи специального метода — конструктора.
Конструктор выделяется среди всех прочих функций данного класса тем, что имеет такое же имя, как и сам класс.
Если объекты некоторого типа строятся нетривиально, то нужна еще одна дополнительная операция для удаления их после последнего использования. Функция удаления в С++ называется деструктором. Деструктор имеет то же имя, что и его класс, но перед ним стоит символ ~ (набирается на клавише с буквой Ё в английской раскладке).
Заметьте, тип возвращаемого значения у конструктора отсутствует (слово void тоже писать не нужно). Конструктор, как и все другие методы, может иметь параметры, так как их значения необходимы ему при инициализации объекта.
Конструктор вызывается при создании объекта, при этом фактические параметры, передаваемые в конструктор, перечисляются в круглых скобках через запятую.
Конструктор без параметров называется конструктором по умолчанию. Если ни один конструктор не объявлен программистом явно, то компилятор сам сгенерирует конструктор по умолчанию. Если же явно описан какой-либо конструктор, то компилятор не генерирует конструктор по умолчанию.
Что это значит для нас?
Заметим важное преимущество, которое у нас появилось —теперь нельзя начать использовать неинициализированный объект студента, у которого не выставлен возраст.
Таким образом, отсутствие конструктора по умолчанию при наличии конструктора с параметрами — это гарантия инициализации объектов данного класса.
Деструктор не имеет ни возвращаемого значения, ни параметров, так как он вызывается автоматически.
Конструкторов может быть много (они могут быть перегружены по типам и количеству параметров), а деструктор всегда один.
При помощи конструктора и деструктора можно реализовать, например, автоматический подсчёт количества существующих на данный момент объектов:
Поскольку локальные переменные существуют только во время работы своей области видимости:функции и даже блока из фигурных скобок, например, тела цикла или просто, как в примере, блока из фигурных скобок — мы увидим в результате работы примера числа: 0, 1, 2, 1, 2, 1. Причём перед второй двойкой будет выведено "in f()".
Что получится если сделать конструктор приватным?
В этом случае конструктор без параметров также не будет создан автоматически. И если никаких публичных конструкторов нет, то экземпляр такого класса создать извне класса невозможно.
Тем не менее, такие классы на практике существуют, и их экземпляры создаются из их же методов или из дружественных функций.