Читать лекция по информатике, вычислительной технике, телекоммуникациям: "Объектное программирование как технология программирования" Страница 4

назад (Назад)скачать (Cкачать работу)

Функция "чтения" служит для ознакомления с работой. Разметка, таблицы и картинки документа могут отображаться неверно или не в полном объёме!

образом:

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

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

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

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

----------------------------- неявный параметр

datInc(dat x)voidInc(dat *r,dat x)

{{

x.day++;x.day++;

return(x);*r = x;// Копирование

}}// результатаvoidmain()voidmain()

{{

data,b*p;data,b,*p;

datt,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;

intTestData();

voidNextData();

voidPlusData(int n)

{

while(n-- !=0) dat::NextData(this);

}

};

//----------- набор функций для класса объектов "дата" --------static intmm[] = {31,28,31,30,31,30,31,31,30,31,30,31};

//----------- Проверка на корректность -----------------------intdat::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);

}

//----------- Следующая дата ----------------------------------voiddat::NextData()

{

day++;

if (day month = 5;

this->day++;или неявноmonth = 5;

day++;- для переменной, имеющей тип некоторой структуры, вызов

функцииэлемента этой структуры имеет вид. ( )2.4. Переопределение функций

---------------------------В Си++ возможно определение нескольких функций с одинаковым

именем, но с разными типами формальных параметров. При этом компилятор выбирает соответствующую функцию по типу фактических параметров. Переопределяемую функцию необходимо объявить с ключевым

словом overload:overloadSetDat;

voidSetDat(int dd,int mm,int yy,dat *p)

{// Дата вводится в виде трех целых

p->day=dd;

p->month=mm;

p->year=yy;

}

voidSetDat(char *s,dat *p) // Дата вводится в виде строки

{

sscanf(s,"%d%d%d", &p->day, &p->month, &p->year);

}voidmain()

{

data,b;

SetDat(12, 12, 1990, &a);// Вызов первой функции

SetDat("12,12,1990", &b);// Вызов второй функции

}Функции-элементы также могут быть переопределены, при этом явного объявления не требуется.

struct dat

{

intday,month,year;

voidSetDat(int,int,int);

voidSetdat(char *);

}

voiddat::SetDat(int dd,int mm,int yy)

{

day=dd; month=mm; year=yy;

}

voiddat::SetDat(char *s)

{

sscanf(s,"%d%d%d",&day,&month,&year);

}

voidmain()

{

data,b;

a.SetDat(12,12,1990);

b.SetDat("12,12,1990");

}

2.5. Операторы управления динамической памятью

---------------------------------------------

В библиотеке Си имеются две функции управления динамической


Интересная статья: Основы написания курсовой работы