Объективное программирование — страница 5

  • Просмотров 9322
  • Скачиваний 351
  • Размер файла 45
    Кб

следующим образом: - при входе в функцию в стеке предполагается существование неявного параметра - "длинной" ссылки на структуру, в которой размещается результат функции; - при выполнении операции return(x), где x - локальная переменная или формальный параметр, выполняется побайтовое копирование переменной x по адресу, заданному неявным параметром; - если результат функции непосредственно присваивается другой

переменной-структуре, то при вызове такой функции в стек помещается неявный параметр - ссылка на переменную в левой части операции присваивания; - во всех остальных случаях в вызывающей функции создается по одной неявной автоматической переменной на каждый вызов функции, возвращающей структуру в качестве результата, а при вызове передается соответствующая ссылка на эту переменную-структуру. Такие переменные имеют все

свойства автоматических, они существуют все время работы вызывающей функции, возможно даже получить ссылку на такую переменную. Программа на Си++ Реализация ----------------- ---------- -- неявный параметр dat Inc(dat x) void Inc(dat *r,dat x) { { x.day++; x.day++; return(x); *r = x; // Копирование } } // результата void main() void main() { { dat a,b*p; dat a,b,*p; dat t,u; // Временнye переменнye a = Inc(b); Inc(&a,b); // Ссылка на левую часть p = &Inc(b); Inc(&t,b); // Присаивание временной p = &t; // переменной и получение

a = *p; a = *p; // ссылки на нее a = Inc(Inc(b)); Inc(&u,b); // Промежуточный результат Inc(&a,u); // во временной переменной } } 2.3. Функции - элементы структуры -------------------------------- Повторим рассмотренный выше пример в другой форме: //------------ структура dat - аналог класса объектов "дата" --struct dat { unsigned day; unsigned month; unsigned year; int TestData(); void NextData(); void PlusData(int n) { while(n-- !=0) dat::NextData(this); } }; //----------- набор функций для класса объектов "дата" --------static int mm[] =

{31,28,31,30,31,30,31,31,30,31,30,31}; //----------- Проверка на корректность -----------------------int dat::TestData() { if (month ==2 && day==29 && year %4 ==0) return(1); if (month ==0 || month >12 || day ==0 || day >mm[month]) return(0); return(1); } //----------- Следующая дата ----------------------------------void dat::NextData() { day++; if (day <= mm[month]) return; if (month ==2 && day==29 && year %4 ==0) return; day=1; month++; if (month !=13) return; month=1; year++; } //--------- Основная программа --------------------------------void main() { dat a; do { scanf("%d%d%d", &a.day, &a.month, &a.year); } while(a.TestData() ==0); a.PlusData(17); }

//------------------------------------------------------- Как видно из примера, в качестве элементов структуры могут выступать функции. Такие элементы-функции имеют следующие особенности: - тело функции может быть определено в самой структуре (функция PlusData). В этом случае функция имеет стандартный вид; - в определении структуры дается только прототип функции(заголовок с перечислением типов формальных параметров). Определение самой функции дается