Претоварване оператор

16.1. Общи правила

В C ++ програмен език оператори се третират като функции, които имат следния прототип:

тип imya_operatora оператор (списък);

Тук оператора - ключовата дума. Ето защо, на операторите, както и функции, може да се претоварени. Трансбордирали почти всички оператори, с изключение на случаите, посочени по-долу:

 не може да претовари следните оператори:

. - точка, достъпът на оператора до член на класа;

.* - достъпът на оператора до член на класа чрез показалеца;

. - оператор резолюция обхват;

 предпроцесорни не могат да бъдат претоварени оператори:

# - преобразуване на низ;

 не може да претовари оператори sizeof и typeof;

 оператори претоварване не могат да преобразуват типове данни:

static_cast. const_cast. reinterpret_cast. dynamic_cast.

Претоварването операторите трябва да отговаря на следните изисквания:

 не могат да въвеждат нови оператори;

 не се претовари оператори с вградени типове данни като параметри, вид, най-малко един параметър, за да бъде претоварен клас оператор;

 оператор не може да промени броя на параметрите;

 асоциативност претоварен оператори не се променя;

 приоритети претоварени оператори не се променят;

 оператор не може да има аргументи по подразбиране, с изключение на оператора на извикване на функция ();

 оператор може да има неограничен брой параметри, с изключение на оператора на извикване на функция ().

Претоварени оператори имат право да се определи като членовете на групата и като функция на не членове на класа. Един оператор може да бъде претоварен няколко пъти. Ако операторът е претоварен като член на класа, а след това не трябва да бъде статичен спецификатор и първия си операнд е по подразбиране обект на класа, за който се нарича този оператор. В този случай, на първия тип аргумент преобразуване такъв оператор от типа на първия параметър не се произвежда поради невъзможността на ефективното му прилагане. При избора на това как да се претовари операторът трябва да вземе под внимание неговата семантика, т.е.. Д. значение. Би било хубаво, ако натоварването на оператори, за да се вземе предвид факта, че в повечето случаи те изпълняват алгебрични операции на обекти, и така запази алгебрични характер на тези оператори.

Претоварване на едноместно и бинарни оператори ще вземем примера на Булева клас. определението на която е показана на Обявата 16.1.

Обявата 16.1. Дефиницията на клас четни числа

#if! определено BOOL #define BOOL

// едноместно оператори логично събиране и умножение

Булева оператор + = (конст Булева б); Булева оператор * = (конст Булева б);

// превръщане тип оператор

булев оператор (свободен) конст;

// едноместно логично приятел отрицание оператор Булева оператор! (Конст Булева б);

// бинарни оператори логично събиране и умножение приятел Булева оператор + (Конст Булева b1, Конст Булева b2); приятел Булева оператор * (Конст Булева b1, Конст Булева b2);

// бинарни оператори за сравнение

приятел Булева оператор == (Конст Булева b1, Конст Булева b2); приятел Булева оператор! = (Конст Булева b1, Конст Булева b2);

приятел станд :: istream оператор >> (STD :: istream в, Булева б); приятел станд :: ostream оператор <<(std::ostream& out,

Конст Булева б);

Изпълнение на претоварени оператори ще бъдат дадени в следващите раздели. В същото време, ние се отбележи, че повечето от въпросните оператори имат прости изпълнение. Поради това, те могат да се определят директно в тялото на класа като вградени функции.

Имайте предвид, че претоварени оператори могат да бъдат извикани по два начина: изрично, като функция, или по подразбиране, използвайки обозначението оператор. Например, над тип обекти Булева могат да изпълняват следните операции: