Об’єкти, що повертаються функцією 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Об’єкти, що повертаються функцією



В програмі 9.6 ми бачили, що об’єкти можна передавати в функцію в якості аргументів. Тепер розглянемо, як функція може повертати об’єкт у викликаючу програму. Модифікуємо попередню програму (програма 9.7)

#include <iostream.h>

#include <conio.h>

#include <bios.h>

class Distance

{private:

int feet;

float inches;

public:

 

Distance():feet(0),inches(0.0) //constructor bez argumentiv

{ }

 

//constructor z 2 argumentamy

Distance(int ft,float in):feet(ft),inches(in)

{ }

 

void getdist()

{cout <<"\nВведіть число футів "; cin >>feet;

cout << "дюймів"; cin>>inches;

}

 

void showdist()

{cout <<feet << “\’ “<< inches <<”\’’”;}

 

Distance add_dist(Distance); //Прототип

};

//dodavanna d2 i d3

Distance Distance::add_dist(Distance d2)

{

Distance temp;

temp.inches=inches+d2.inches;

 if(temp.inches>=12.0)

 {temp.inches-=12.0;

 temp.feet++;}

 temp.feet+=feet+d2.feet;

 return temp;

}

 

int main()

{

clrscr();

Distance dist1,dist3;

Distance dist2(11,6.25);

dist1.getdist();

dist3=dist1.add_dist(dist2);

cout <<”\ndist1=”;dist1.showdist();

cout << “\ndist2=”;dist2.showdist();

cout << “\ndist3=”;dist3.showdist();

cout <<endl;

bioskey(0);

return 0;

}

Програма 9.7

Хоча програми 9.6 та 9.7 схожі, різниця між ними вказує на важливі аспекти роботи функцій з об’єктами.

В прикладі 9.6 два об’єкти були передані в якості аргументів в функцію add_dist(), а результат був збережений в об’єкті dist3, методом якого і є викликана функція add_dist(). В програмі 9.7 в якості аргумента в функцію add_dist() передається лише один аргумент: об’єкт dist2. dist2 додається до об’єкту dist1, до якого відноситься викликаний метод add_dist(). Результат повертається в функцію main() і присвоюється об’єкту dist3.

dist3=dist1.add_dist(dist2);

Такий запис доволі близький до природного. Ще більш спростити його можна за допомгою використання перезавантажених функцій.

Функція add_dist() з прикладу 9.7 виглядає так:

Distance Distance::add_dist(Distance d2)

{

Distance temp;

temp.inches=inches+d2.inches;

 if(temp.inches>=12.0)

 {temp.inches-=12.0;

 temp.feet++;}

 temp.feet+=feet+d2.feet;

 return temp;

}

Всередині функції створюється тимчасовий об’єкт класу Distance. Цей об’єкт зберігає значення обчисленої суми доти, доки вона не буде повернута викликаючій програмі. Сума обчислюється шляхом додавання двох об’єктів класу Distance. Перший з об’єктів – dist1, по відношенню до якого функція add_dist() є методом, другий об’єкт dist2 передається в функцію у якості аргумента. Звертання до його полів з функції виглядає так: d2.feet та d2.inches. Результат додавання зберігається в об’єкті temp і звертання до його полів виглядає так: temp.feet та temp.inches. Значення об’єкту temp повертається у викликаючу програму за допомогою оператора

return temp

Викликаюча програма main() присвоює значення, повернуте функцією, об’єкту dist3. Значення змінної dist1 не змінюється, а тільки використовується функцією add_dist().

 

Класи, об’єкти та пам’ять

Можливо, в процесі вивчення класів та об’єктів у нас сформувалося уявлення про об’єкт як про копію класу з точки зору внутрішньої структури. Це не зовсім точно. Кожен об’єкт має незалежні поля даних, але всі об’єкти одного класу використовують ті самі методи. Методи класу створюються і поміщаються в пам’ять комп’ютера один раз – при створенні класу. Між об’єктами не виникає конкуренції за спільний ресурс, оскільки в будь-який момент виконується не більше одної функції.

 

Статичні дані класу

Познайомившись з тим, що кожен об’єкт класу містить свої власні дані, поглибимо своє розуміння даної концепції. Якщо поле даних класу описане з ключовим полем static, то значення цього поля буде одинаковим для всіх об’єктів даного класу. Статичні дані класу корисні в тих випадках, коли необхідно, щоб всі об’єкти включали в себе якесь одинакове значення. Статичне поле за своїми характеристиками нагадує статичну змінну: воно видиме тільки всередині класу, але час його життя співпадає з часом життя програми. Таким чином, статичне поле існує навіть тоді, коли не існує жодного об’єкта класу. Тим не менше, на відміну від статичної змінної функції, призначеної для збереження значень між викликами, статична змінна класу використовується для зберігання даних, які спільно використовуються об’єктами класу.

Програма 9.8 ілюструє просте використання статичного поля класу:

#include <iostream.h>

#include <conio.h>

#include <bios.h>

class foo

{private:

static int count; //Спільне поле

public:

foo()

{count++;} //Інкрементування при створенні

int getcount()

{return count;}

};

int foo:: count=0; //Визначення count

 

int main()

{clrscr();

foo f1,f2,f3;//Створення 3 обєктів

cout << "Число обєктів " <<f1.getcount()<<endl;

cout << " Число обєктів " <<f2.getcount()<<endl;

cout << " Число обєктів " <<f3.getcount()<<endl;

bioskey(0);

return 0;

}

Програма 9.8

 В цьому прикладі клас foo містить єдине поле count, що має тип static int. Конструктор класу інкрементує значення поля count. В функції main() ми визначаємо 3 об’єкти класу foo. Оскільки конструктор в цьому випадку викликається тричі, інкрементування поля count теж відбувається тричі. Метод getcount() повертає значення count. Ми викликаємо цей метод для кожного з об’єктів і в кожному випадку одержуємо ту саму величину.

Статичні поля класу використовуються значно рідше, ніж автоматичні, однак існують ситуації, коли їх зручно використовувати.

 



Поделиться:


Последнее изменение этой страницы: 2021-12-15; просмотров: 46; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.191.211.66 (0.008 с.)