Конструктор копирования. Передача и возврат объектов по значению.
имя_класса :: имя_класса(const имя_класса & ссылка_на_объект) {…}
Конструктор копирования вызывается в ситуации, когда один объект присваивается другому, но не явным способом (с помощью оператора присваивания), а только при инициализации объекта, когда:
· Происходит явная инициализация при объявлении объекта типа класса ( Тип A = B, или Тип А(В))
· Инициализация объекта при передаче объекта по значению (f(A))
· Инициализация путем копирования при создании временного возвращаемого объекта (B = f(A))
Если в классе отсутствует явно заданный конструктор копирования, то вызывается автоматический конструктор побитового копирования данных объекта
Объекты (экземпляры класса) можно передавать в функции как обычные переменные – по значению. Когда объект передается в функцию по значению, создается его копия:
· Путем вызова автоматического конструктора копирования создает побитовую копию объекта
· Путем вызова специального конструктора копирования
· Когда копия объекта выходит из зоны видимости (окончание функции) вызывается ее деструктор.
Функция может возвращать объект вызывающему модулю по значению, для этого выполняются следующие действия:
· Автоматически создается временный объект с помощью конструктора копирования
· Выполняется операция присваивания значения временного объекта внешней переменной
· Временный объект уничтожается (вызывается деструктор)
Основной проблемой передачи и возвращения объектов по значению является то, что при наличии в данных возвращаемого объекта указателей на динамически выделенные ресурсы требуется создание собственного конструктора копирования с обязательным дублированием ресурсов.
class example
{
int a;
public:
example () { a = 0; }
example (int A) { a = A; }
example (const example & E) { a = E.a; }
example & operator = (example & E)
{
a = E.a;
return *this;
}
void setInt(int A) { a = A; }
int getInt() { return a; }
};
example function(example & E)
{
example temp;
temp.setInt(E.getInt()+1);
return temp;
}
Деструктор. Виртуальный деструктор.
имя_класса :: ~имя_класса() {…}
Деструктор – особая функция-член класса (антипод конструктора). Имя деструктора начинается с символа ~ и дальше совпадает с именем класса.
Особенности:
· Не имеет аргументов
· Не возвращает никаких значений
· В классе может быть определен только один деструктор
· Вызывается автоматически при разрушении объекта
· глобальные объекты разрушаются после завершения функции main()
· Обычно используется для освобождения ресурсов
Дата добавления: 2022-02-05; просмотров: 259;