Информатика и технология программирования

         

Функции -элементы структуры


Рассмотрим пример со структурой, представляющей дату:


struct dat
{
int day,month,year;
int TestData(); // Проверка даты


void NextData(); // Добавить 1 день


void PlusData(int n) // Добавить n дней


{
while(n-- !=0) NextData();
}
};


static int mm[] = {31,28,31,30,31,30,31,31,30,31,30,31};
//----------- Проверка на корректность ------------------


int dat::TestData()
{
if (month ==2 &#38&#38 day==29 &#38&#38 year %4 ==0) return(1);
if (month ==0 || month &#62 12 || day ==0 || day &#62mm[month])
return(0);
return(1);
}
//----------- Следующая дата ----------------------------


void dat::NextData()
{
day++;
if (day &#60= mm[month]) return;
if (month ==2 &#38&#38 day==29 &#38&#38 year %4 ==0) return;
day=1;
month++;
if (month !=13) return;
month=1;
year++;
}
//--------- Основная программа --------------------------


void main()
{
dat a;
do cin &#60&#60 a.day &#60&#60 a.month &#60&#60 a.year;
while(a.TestData() ==0);
a.PlusData(17);
}

Как видно из примера, в качестве элементов структуры могут выступать функции. Такие элементы-функции имеют следующие особенности:



-тело функции может быть определено в самой структуре (функция PlusData ). В этом случае функция имеет стандартный вид;



-в определении структуры дается только прототип функции (заголовок с перечислением типов формальных параметров). Определение самой функции дается отдельно, при этом полное имя функции имеет вид


. имя_структуры::имя_функции



-в теле функции неявно определен один формальный параметр с именем this -указатель на структуру, для которой вызывается функция (В нашем примере это будет struct dat *this ). Элементы этой структуры доступны через явное использование этого указателя или неявно:


this-&#62month = 5;
this-&#62day++;
month = 5;
day++;



-для структурированной переменной вызов функции - элемента этой структуры имеет вид:


. имя_переменной.имя_функции (список_параметров)

Приведем фрагмент этой же программы в виде эквивалента на " классическом" Си:




void dat_PlusData(dat *this, int n)
//---------- Добавить n дней ----------------------------


{
while(n-- !=0) NextData(this);
}
void dat_NextData(dat *this)
//----------- Следующая дата ----------------------------


{
this-&#62day++;
...
this-&#62month=1;
this-&#62year++;
}
//--------- Основная программа --------------------------


void main()
{ dat a;
...
dat_PlusData(&#38a,17);
}



Содержание раздела