Конструктор копирования. Передача и возврат объектов по значению.


имя_класса :: имя_класса(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; просмотров: 268;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.009 сек.