68945

Передача об’єктів функціям. Повернення об’єктів

Лекция

Информатика, кибернетика и программирование

Об’єкти можна передавати функціям, як звичайні змінні. Для цього застосовується звичайний механізм передачі параметрів по значенню. Не дивлячись на зовнішню простоту, цей процес може привести до несподіваних наслідків, що стосуються конструкторів і деструкцій.

Украинкский

2014-09-27

37.5 KB

0 чел.

Лекція № 7

Тема: Передача об’єктів функціям. Повернення об’єктів.

План

  1.  Передача об’єктів функціям
  2.  Повернення об’єктів

Передача об'єктів функціям

Об'єкти можна передавати функціям, як звичайні змінні. Для цього застосовується звичайний механізм передачі параметрів по значенню. Не дивлячись на зовнішню простоту, цей процес може привести до несподіваних наслідків, що стосуються конструкторів і деструкцій. Спробуємо розібратися в цьому за допомогою наступної програми.

// Передача об'єкту функції.

#include <iostream>

using namespace std;

class myclass {

int i;

public:

myclass(int n);

~myclass();

void set_i(int n) { i=n; }

int get_i() { return i; }

};

myclass::myclass(int n)

{

i = n;

cout « "Створення " « i « "\n";

}

myclass::-myclass()

{

cout « "Знищення " « i « "\n";

}

void f(myclass ob);

int main() {

myclass про(l);

f (o);

cout « "Це змінна i у функції main: ";

cout « о.get_i() « "\n";

return 0;

}

void f(myclass ob)

{

ob.set_i(2);

cout « "Це локальна змінна i: " « ob.get_i(); cout « "\n";

}

В результаті роботи цієї програми на екрані з'являться наступні рядки.

Створення  1

Це локальна  змінна  i:   2

Знищення 2

Це  змінна  i  у  функції main:   1

Знищення  1

Як показують ці результати, в ході роботи програми конструктор викликався лише одного разу, при створенні об'єкту про у функції main(), в той же час, деструкція була викликана двічі. Розглянемо причини цієї ситуації.

Коли об'єкт передається у функцію, створюється його копія. Саме ця копія стає параметром функції. Це означає, що в програмі з'явився новий об'єкт. Після закінчення роботи функції копія аргументу (т.е. параметр) знищується. Це породжує два принципово важливих питання. По-перше, чи викликається конструктор при створенні копії аргументу? По-друге, чи викликається деструкція при знищенні параметра? Відповіді на ці питання вас здивують.

При створенні копії аргументу звичайний конструктор не викликається. Замість нього викликається конструктор копіювання. Саме він і створює нову копію аргументу. Як указується в розділі 14, конструктор копіювання можна визначати явно. Проте, якщо оголошення класу не містить явного визначення конструктора копіювання, як в нашому прикладі, викликається автоматичний конструктор копіювання, передбачений за умовчанням. Він створює побітову (ідентичну) копію об'єкту. Це легко зрозуміти. Адже звичайний конструктор не можна викликати для створення копії вже існуючого об'єкту, оскільки такий виклик замінив би поточний стан об'єкту первинним. В той же час при передачі об'єкту у функцію нам потрібний повний дублікат об'єкту, що відображає його поточне, а не первинний стан.

Після закінчення роботи функції копія об'єкту виходить з області видимості, тому викликається його деструкція. От чому в попередній програмі деструкція викликалася двічі. Спочатку він викликається, коли параметр функції f () виходить з своєї області видимості, а потім — коли при завершенні роботи програми знищується об'єкт о.

Підведемо підсумки. Якщо виникає необхідність створити копію об'єкту і передати її функції, звичайний конструктор не викликається. Замість нього викликається автоматичний конструктор копіювання, що створює побітовий дублікат об'єкту. Проте при знищенні копії об'єкту (як правило, у момент повернення з функції) викликається його деструкція.

Оскільки автоматичний конструктор копіювання створює точну копію оригіналу, він може стати джерелом проблем. Навіть якщо об'єкт передається функції по значенню, що теоретично дозволяє захистити аргумент від зміни, можливі побічні ефекти. Наприклад, якщо об'єкт, що передається як параметр, виділяє динамічну пам'ять у момент свого створення і звільняє її при своєму знищенні, його локальна копія усередині функції звільнятиме ту ж саму область пам'яті при виклику деструкції. Це приведе до пошкодження оригіналу. Для того, щоб запобігти появі таких проблем, в класі необхідно явно визначити конструктор копіювання (див. розділ 14).

Повернення об'єктів

Функція може повертати об'єкт модулю.  Як приклад проаналізуємо наступну програму.

// Повернення об'єктів з функцій.

#include <iostream>

using namespace std;

class myclass {

int i ;

public:

void set_i(int n) { i=n; }

int get_i() { return i; }

};

myclass f();  // Повернення об'єкту класу myclass.

int main()

{

myclass о;

о = f();

cout « о.get_i() << "\n";

return 0; }

myclass f()

myclass x;

x.set_i(l);

return x;

}

При поверненні з функції автоматично створюється тимчасовий об'єкт, в якому зберігається значення, що повертається. Саме цей об'єкт насправді повертається в зухвалий модуль. Після повернення цей об'єкт знищується. Це може привести до непередбачуваних наслідків. Наприклад, якщо деструкція об'єкту, що повертається, повинна звільняти динамічну пам'ять, вона звільнятиметься, навіть якщо об'єкт, якому привласнюється значення, що повертається, як і раніше посилається на неї. Уникнути цього можна за допомогою перевантаження оператора привласнення і визначення конструктора копіювання.


 

А также другие работы, которые могут Вас заинтересовать

53518. Калейдоскоп знань – нетрадиційна форма проведення уроків 707 KB
  Такі уроки допомагають учителю урізноманітнювати роботу учнів знімають напруження від звичної навчальної діяльності переключають увагу школярів вони є цінним засобом виховання розумової активності дітей що активізує психічні процеси викликає в учнів живий інтерес до процесу пізнання. Навчальний день для учнів 1 і 2 класів починається з лінійки де кожному класу вручається свій маршрутний лист. У маршрутному листі записуються уроки які будуть проводитися для учнів даного класу: математика українська мова читання музика Я і Україна. З...
53519. Геометричні перетворення 2.37 MB
  Яку найменшу кількість клітинок треба заштрихувати щоб фігура на рисунку мала вісь симетрії А. 6 Вісь симетрії Достатньо замалювати три клітинки. Які літери мають вісь симетрії А які центр симетрії № 5. За якою ознакою складені наступні літери алфавіту: А Д М Т П Ш вертикальна вісь симетрії В Е З К С Ю Є горизонтальна вісь симетрії Ж Н О Ф Х вертикальна та горизонтальна вісь симетрії Б Г Л Р У Ц Ч Щ Я літери не мають ні горизонтальної ні вертикальної вісі симетрії Паліндром це абсолютний прояв...
53520. Літературний калейдоскоп. Хороша книга 67 KB
  Сприяти формуванню читацьких смаків, Розширювати читацькі інтереси учнів; заохочувати до читання книг; розвивати пам'ять учнів, уміти переказувати та розповідати цікаві уривки з прочитаних творів; виховувати любов до книги.
53521. Математичний калейдоскоп 1.07 MB
  Перевірити знання учнів 5 класу з вивчених тем; розвивати логічне мислення, увагу, творчі здібності, вміння працювати в групі; виховувати наполегливість, взаємодопомогу.
53522. Я не мислю України без калини 35 KB
  Це харчова, лікарська, медоносна рослина. З неї готують варення, повидло, компоти, киселі, мармелад, начинку для цукерок, муси, приправи для мясних страв, чайно-кавовий сурогат. Калина - пізньовесняний медонос та фарбувальна рослина.
53523. Без верби й калини нема України 176 KB
  Розширити знання дітей про вербу і калину, як рослини-символи України; показати, як оспівував їх український народ; розвивати спостережливість, творчі здібності, тренувати пам’ять, мислення, зв’язне мовлення учнів; виховувати у дітей любов до рідного слова, до національний традицій, народної мудрості, до краси і гармонії навколишнього світу, любов до рідного краю.
53524. Посадіть калину коло серця 96 KB
  Нема такого села де б за тином чи біля криниці у лузі чи на березі річки не росла не квітла б навесні рясним білим цвітом не румяніла червоними ягідками з осені аж до зими калина. Калина - символ України. А коли зима приходить стоїть калина у червоному намисті урочиста і красива. Копали криницю недалеко від того місця де росла калина то вода буде чистою й смачною.
53525. Соціально-економічний розвиток Канади наприкінці ХХ – на початку ХХІ століть 3.92 MB
  Вчитель інформатики: Сьогодні у нас незвичайний урок на якому ми будемо застосовувати набуті на інформатиці знання до розвязування питань які виникли з іншого предмета а саме історії. Вчитель історії; Перевірку домашнього завдання ми пропонуємо здійснити через розгадування кросворду. Вчитель інформатики: Для цього на робочому столі відкрийте папку Історія та інформатика і файл ДОМАШНЄ ЗАВДАННЯ. Вчитель історіїї; Ви отримали слово Харпер.