Нельзя получить указатель на конструктор.
Для глобальных объектов конструктор объекта вызывается тогда, когда начинается выполнение программы. Для локальных объектов конструктор вызывается всякий раз при выполнении инструкции объявления переменной.
Конструктору можно передавать аргументы. Тогда при объявлении объекта необходимые аргументы записываются в качестве параметров.
CBox mybox(1,2,3);
Конструктор копирования – конструктор, получающий в качестве единственного параметра указатель на объект этого же класса. Этот конструктор вызывается, когда новый объект создается путем копирования существующего:
· при описании нового объекта с инициализацией другим объектом;
· при передачи объекта в функцию по значению;
· при возврате объекта из функции.
Компилятор предоставляет два типа конструкторов:
· конструктор по умолчанию
· конструктор копирования:
Класс может иметь несколько конструкторов, которые можно перегружать.
Если Вы определили какой-либо свой конструктор копирования, Вы обязаны явно определить конструктор по умолчанию.
Стандартный конструктор копирования нельзя использовать при работе с указателями.
Деструктор
Деструктор класса – специальная функция класса, которая уничтожает объект, когда необходимость в нем отпадает или время его жизни завершено.
Имя деструктора совпадает с именем класса, которому предшествует знак ~(тильда).
Деструктор не принимает параметров и не возвращает значения. Таким образом, деструктор в классе всегда один.
Компилятор предоставляет деструктор по умолчанию.
Однако, если Вы захватывали какие-либо ресурсы при создании объекта (например, динамически выделяли память), Вы обязаны переопределить деструктор для корректного освобождения ресурсов.
Указатель this
Указатель this – это скрытая внутренняя переменная каждого объекта, неявно используется внутри методов для ссылок на элементы объекта.
Указатель this инициализируется при определении объекта класса (каждый объект класса при создании получает значение указателя на начало, выделенной ему памяти).
*this – операция разыменования для получения значения объекта.
Указатель thisможет использоваться только в нестатических компонентных функциях класса, причем использовать его необходимо без предварительного определения – он определяется транслятором автоматически. Указатель thisхранит адрес объекта, для которого произведен вызов метода класса.
Выражение this –> имя_члена обеспечивает доступ к члену конкретного объекта (данному или функции) в приватной памяти объекта.
Дружественным функциям указатель this не передается.
Работа методов с полями именно того объекта, для которого они были вызваны, обеспечивается неявной передачей в функцию параметра this, в котором хранится константный указатель на вызвавший функцию объект.
Модификация указателя this в функциях класса недопустима.
Статические члены класса
Глобальные данные и глобальные методы класса называют статическими.
Статические члены класса являются глобальными, принадлежат всему классу и существуют в единственном экземпляре.
В объявлении класса перед оператором описания типа глобальной компоненты записывается спецификатор static.
Статические данные класса полезны, когда необходимо, чтобы все объекты включали в себя какое-либо одинаковое значение.
Статические данные-члены класса
· являются частью класса, но не является частью объекта этого класса.
· объявляются внутри класса.
· должны быть определены вне класса.
Статические функции-члены класса
· функции, общие для всех объектов этого класса
· имеют доступ только к статическим членам класса
· для доступа к нестатическим членам они должны получить адрес объекта как параметр
· не могут быть константными и виртуальными
Дружественные функции и классы
Переменные–члены классов являются закрытыми, доступ к ним через методы класса.
Дружественные функцииобъявляются в описании класса с помощью ключевого слова friend,получают доступ к переменным-членам класса, сами не будучи его членами.
Дружественная функция становится расширением интерфейса класса, и этот интерфейс реализует взаимодействие объекта с другими объектами программы.
Дружественная функция – это не член класса и она не может быть задана через имя объекта. Она должна вызываться точно также как и обычная функция.
В качестве параметра такой функции должен передаваться объект или ссылка на объект класса, т.к. указатель this ей не передается.
Объявление дружественности может помещаться в любое место описания класса (спецификаторы доступа не имеют отношения к объявлению дружественности).
Одна функция может быть дружественной нескольким классам.
Прототип дружественной функции записывается в объявлении всех классов, с которыми она дружит.
Дружественная функция не наследуется.
Если все методы класса должны иметь доступ к скрытым полям другого, то весь класс объявляется дружественным.
Вложенные классы
Класс, объявленный внутри другого класса, называется вложенным классом.
Класс, в котором объявлен вложенный класс, называется объемлющим классом.
Функции- члены объемлющего класса не имеют прав доступа к закрытым членам своего вложенного класса.
Также и функции-члены вложенного класса не имеют прав доступа к закрытым членам класса, внутри которого он объявлен.
Чтобы предоставить такие права вложенному или объемлющему классу, нужно объявить такой класс другом соответственно объемлющего или вложенного класса.
Шаблон классов
Шаблон классов – класс, в котором определены данные и методы, но фактический тип (типы) данных задаются в качестве параметра (параметров) при создании объекта класса.
Шаблоны классов позволяют многократно использовать один и тот же код, позволяющий компилятору автоматизировать процесс реализации типа.
Основные свойства шаблона классов:
· Шаблон позволяет передать в класс один или несколько типов в виде параметров.
· Параметрами шаблона могут быть не только типы, но и константные выражения.
· Объявление шаблона должно быть только глобальным.
· Статические члены-данные специфичны для каждой реализации шаблона.
· Спецификация и реализация шаблона классов при раздельной компиляции обязательно должны находиться в одном файле.
Объявление шаблона классов
Методы должны быть объявлены как шаблоны функций, поэтому заголовок метода, определение которого находится за пределами спецификации класса, имеет следующий формат:
template <class Параметр_Типа1, … , class Параметр_ТипаN>
Тип_функции Имя_шаблона < Параметр_Типа1, … , Параметр_ТипаN>
::Имя_функции (список параметров функции)
Параметр_типа – вводимый пользователем идентификатор, который затем используется в реализации как имя типа. Если параметр – константное выражение, в списке параметров ключевое слово класс перед ним не указывается.
Параметры шаблона могут иметь значения по умолчанию. В этом случае в объявлении шаблона классов в угловых скобках после имени параметра типа ставится знак = , а за ним указывается значение по умолчанию.
Например, template <class U = int, int Size = 100>
Объявление объектов шаблона классов
При объявлении переменных шаблона классов (объектов шаблона) создается конкретная реализация шаблона с типом, указанным в качестве параметра типа.
Объявление объекта шаблона классов имеет следующий формат:
Имя_Шаблона <Тип1, … , ТипN> Имя_Объекта;
Перегрузка операторов