Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Обчислення значення функцій

4.4. Обчислення значення функції — вихід із функції; особливості повернення та використання іменованого значення, іменованої константи

 

Звичайно функція повертає копію створеного (правостороннього) значення. Найпростіший випадок повернення функцією значення ілюструється прикладом

 

int min (int x, int y)

{

return x < y? x: y;

}

 

У випадку повернення іменованих (лівосторонніх) значень можливі проблеми. Нехай маємо визначення структури дерева

 

struct Tree

{

int node;

Tree *left;

Tree *right;

};

 

Як можна уявити собі створення його вузла. Наприклад, так: локальна змінна

 

Tree theTree;

 

резервує пам’ять для полів структури, а їх заповнення відбувається у функції

 

Tree createTree (int node, Tree * left, Tree * right)

{

Tree aTree;

aTree.node = node;

aTree.left = left;

newTree.right = right;

return aTree;

}

 

ЇЇ виклик очевидний, наприклад, такий

 

theTree = createTree (1, 0, 0);

 

Інший спосіб полягає у визначенні указника

 

Tree *theTreePtr;

 

йому необхідно відвести пам’ять під вершину і викликати функцію

 

theTreePtr = new Tree;

theTreePtr = createTree (1, 0, 0);

 

 

Хотілося б уникнути копіювання і одразу розмістити указник на збудований вузол. Цього можна було б досягти, додавши до функції ще один параметр

 

void createTree (Tree *aTree,

int node, Tree *left, Tree *right)

 

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

 

Tree* createTree (int node, Tree *left, Tree *right)

{

// Помилка: повернення адреси локального об’єкту

Tree aTree;

aTree.node = node;

aTree.left = left;

newTree.right = right;

return &aTree;

}

 

або ще не зрозуміліше

 

Tree& createTree (int node, Tree *left, Tree *right)

{

// Помилка: повернення адреси локального об’єкту

Tree aTree;

aTree.node = node;

aTree.left = left;

newTree.right = right;

return aTree;

}

 

Інша справа, якщо в підпрограмі використати указники

 

Tree* createTreePtr (int node, Tree *left, Tree *right)

{

Tree *aTree;

aTree = new Tree;

aTree -> node = node;

aTree -> left = left;

aTree -> right = right;

return aTree;

}

 

тоді відпадає необхідність попереднього створення вузла з подальшим копіюванням

 

Tree *theTree;

theTree = createTreePtr (1, 0, 0);

 

Ось трохи складніший приклад

 

int& getValue (int *vi, int ix, int sx)

{

if (ix>sx) return 0;

return vi [ ix ];

}

 

Якщо тепер вжити виклик функції в присвоєнні справа,то відбудеться обчислення правостороннього значення за лівостороннім значенням виразу і результат копіюється і передається в місце, визначене лівою стороною присвоєння

 

a = getValue(v, i, n);

 

Але ж функція, що повертає лівостороннє значення сама може стати зліва

 

getValue(v, i, n) = a;

 

і тоді значення a буде записане до масиву або ж такий виклик

 

getValue(v,1,5)++; //збільшує v[1] на 1

 

Якщо зміна значення лівостороннього виразу небажана перетворюємо його на сталий

 

 

<== предыдущая лекция | следующая лекция ==>
Передача параметрів | Довизначення (overloading) функцій
Поделиться с друзьями:


Дата добавления: 2014-01-04; Просмотров: 378; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.012 сек.