Значення, що повертаються операцією 


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



ЗНАЕТЕ ЛИ ВЫ?

Значення, що повертаються операцією



Функція operator++() програми 10.1 має невеличкий дефект. Ми можемо його виявити, якщо використаємо в функції main() рядок:

c1=++c2

Компілятор видасть повідомлення про помилку. Причиною її є те, що ми визначили тип void для повернутого значення функції operator++(). А в нашому виразі присвоювання буде запитана змінна типу Counter. Тобто компілятор запитуватиме значення змінної с2, після того як вона буде оброблена операцією ++, і присвоїть її значення змінній с1. Але, при даному нами визначенні в 10.1, ми не можемо використовувати ++ для збільшення об’єкту Counter у виразі присвоювання: з таким операндом може бути використана лише операція ++.

Для того, щоб мати можливість використовувати написаний нами operator++() у виразах присвоювання, нам необхідно правильно визначити тип значення, яке він повертає. Це зроблено в програмі 10.2

#include <iostream.h>

#include <conio.h>

#include <bios.h>

class Counter

{private:

unsigned int count;

public:

Counter():count(0) //constructor

{ cout <<"constructor"<<endl;};

 

Counter operator++()

{++count;

Counter temp;

temp.count=count;

return temp;

}

unsigned int get_count()

{return count;}

};

 

int main()

{clrscr();

Counter c1,c2;

cout << "\nc1="<<c1.get_count();

cout <<"\nc2="<<c2.get_count();

++c1;

c2=++c1;

cout << "\nc1="<<c1.get_count();

cout <<"\nc2="<<c2.get_count();

cout <<endl;

bioskey(0);

return 0;

}

Програма 10.2

Тут функція operator++() створює новий об’єкт класу Counter з іменем temp, для використання його в якості значення, що повертається. Вона спершу збільшує змінну count в своєму об’єкті, а потім створює об’єкт temp і присвоює йому значення count – те саме, що і у власному об’єкті. В кінці функція повертає об’єкт temp. Одержуємо очікуваний ефект. Вираз типу

++с1

тепер повертає значення, яке можна використовувати в інших виразах, таких як

с2=++с1;

 

Тимчасові безіменні об’єкти

В програмі 10.2 ми створили тимчасовий об’єкт temp типу Counter, чиєю єдиною метою було збереження значення, яке повертає операція ++. Реалізація цього об’єкту вимагала трьох рядків програми

Counter temp;

temp.count=count;

return temp;

Існує багато способів повертати тимчасовий об’єкт з функції чи перезавантаженої операції. Розглянемо ще один спосіб в програмі 10.3

#include <iostream.h>

#include <conio.h>

#include <bios.h>

class Counter

{private:

unsigned int count;

public:

Counter():count(0) //constructor

{ };

Counter(int c):count(c)

{}

 

unsigned int get_count()

{return count;}

 

Counter operator++()

{++count;

return Counter(count);

}

};

 

int main()

{

clrscr();

Counter c1,c2;

cout << "\nc1="<<c1.get_count();

cout <<"\nc2="<<c2.get_count();

++c1;

c2=++c1;

cout << "\nc1="<<c1.get_count();

cout <<"\nc2="<<c2.get_count();

cout <<endl;

bioskey(0);

return 0;

}

Програма 10.3

В рядку цієї програми

return Counter(count);

відбуваються ті самі дії, які в програмі 10.2 займали три рядки. Тут створюється об’єкт типу Counter. Він не має імені, бо воно ніде не використовуватиметься. Цей об’єкт ініціалізується значенням, одержаним у вигляді параметра count.

Зверніть увагу, що, порівняно з попередньою програмою, додався конструктор з одним параметром

Counter(int c):count(c)

{}

Об’єкт, ініціалізований значенням count, може бути повернутий функцією. Результат цієї програми такий же, як і попередньої..

 

Постфіксні операції

Досі ми застосовували операцію збільшення, використовуючи тільки префіксний запис

++с1

А як можна використовувати постфіксний запис, де змінна збільшується після того, як її значення було використано у виразі с1++?

Щоб мати змогу працювати з двома версіями операції, ми визначимо два варіанти перезавантаження операції ++. Це показано в програмі 10.4

#include <iostream.h>

#include <conio.h>

#include <bios.h>

class Counter

{private:

unsigned int count;

public:

Counter():count(0) //constructor

{ }

Counter (int c):count(с)

{ }

 

unsigned int get_count()

{return count;}

 

Counter operator++ ()

{return Counter(++count);}

 

Counter operator++ (int)

{return Counter(count++);}

 

};

////////////////////

int main()

{

clrscr();

Counter c1,c2;

cout << “\nc1=”<<c1.get_count();

cout <<”\nc2=”<<c2.get_count()<<endl;

++c1;

c2=++c1;

cout <<”\nPrefix”<<endl;

cout << “c1=”<<c1.get_count();

cout <<”\nc2=”<<c2.get_count();

cout <<endl;

c2=c1++;

cout <<”\nPostfix”<<endl;

cout << “c1=”<<c1.get_count();

cout <<”\nc2=”<<c2.get_count();

bioskey(0);

return 0;

}

Програма 10.4

Тепер ми маємо два типи оголошення функції operator++. З однією з них, для префіксної операції, ми вже познайомилися.

Counter operator++ ()

Для реалізації постфіксної операції ++ використаємо нову функцію:

Counter operator++ (int)

Різниця між цими функціями лише в тому, що в дужках проставлено int. Тут int не грає ролі аргументу і не означає цілого числа. Це просто сигнал для компілятора, щоб використовувалася постфіксна версія операції. Розробники С++ вважали корисним повторне використання існуючих операцій і ключових слів; в даному випадку int призначена також для позначення постфіксної операції.

 



Поделиться:


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

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