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