Унарні операції мають лише один операнд. Прикладом унарної операції можуть бути операції зменшення і збільшення – та ++, або унарний мінус: -34.
Раніше (програма 11.4 ) ми створили клас Counter для зберігання значень лічильника. Об’єкт цього класу ми збільшували викликом методу:
c1.inc_count();
Він виконував свою роботу, але лістінг програми стане зрозумілішим, якщо ми використаємо замість цього запису операцію збільшення ++.
++с1;
Модернізуємо програму 11.4 так, щоб зробити цю дію можливою. Приведемо лістінг програми 10.1.
#include <iostream.h>
#include <conio.h>
#include <bios.h>
class Counter
{private:
unsigned int count;
public:
Counter():count(0) //Конструктор
{ };
void operator++()
{++count;}
unsigned int get_count()
{return count;}
};
int main()
{
clrscr();
Counter c1,c2;
cout << “\nc1=”<<c1.get_count();
cout <<”\nc2=”<<c2.get_count();
++c1;
++c2;
++c2;
cout << “\nc1=”<<c1.get_count();
cout <<”\nc2=”<<c2.get_count();
cout <<endl;
bioskey(0);
return 0;
}
Програма 10.1
В цій програмі ми створили два об’єкти класу Counter: c1 та c2. Значення лічильників виведені на дисплей, спершу вони рівні 0. Потім, використовуючи перезавантаження операції ++, ми збільшуємо с1 на 1, а с2 на 2. Операція ++ один раз використана по відношенню до с1 і двічі по відношенню до с2. В цьому прикладі ми використали префіксну версію операції ++, пізніше пояснимо також постфіксну форму.
Ключове слово operator
Як використати звичайні операції з визначеними користувачем типами? В цьому оголошенні використане ключове слово operator для перезавантаження операції ++
void operator++()
Спершу пишуть повернутий тип (в нашому випадку void), потім ключове слово operator, потім саму операцію (++) і нарешті список аргументів, взятий у дужки (в даному випадку порожній). Такий синтаксис повідомляє оператору, що коли аргумент належить класу Counter, то потрібно викликати функцію з таким іменем, зустрівши в тексті програми операцію ++.
Компілятор може розрізняти перезавантажувані функції за типом даним та кількістю аргументів (сигнатурою). Перезавантажувані операції компілятор розрізняє за типом даних їх операндів. Якщо операнд має базисний тип, такий як int в операторі
++intvar;
то компілятор буде використовувати свою вбудовану процедуру для збільшення змінної типу int. Але, якщо операнд є об’єктом класу Counter, то компілятор буде використовувати написану програмістом функцію operator++() (нагадаємо, що це явище називається поліморфізмом).