Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: ТОП 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; просмотров: 83; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 216.73.216.196 (0.007 с.) |