Читать лекция по информатике, вычислительной технике, телекоммуникациям: "Объектное программирование как технология программирования" Страница 4
образом:
- при входе в функцию в стеке предполагается существование неявного параметра - "длинной" ссылки на структуру, в которой размещается результат функции;
- при выполнении операции 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. Операторы управления динамической памятью
---------------------------------------------
В библиотеке Си имеются две функции управления динамической
Похожие работы
Интересная статья: Основы написания курсовой работы

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