Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Об’єкти, що повертаються функцією
В програмі 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 с.) |