КАТЕГОРИИ: Архитектура-(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
Якщо зміна значення лівостороннього виразу небажана перетворюємо його на сталий
Дата добавления: 2014-01-04; Просмотров: 405; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |