    Перегрузка операторов 

    Тема перегрузки операторов едва ли не стала предметом суеверного 
поклонения. Проще говоря, перегрузка операторов позволяет определять действия 
для объектов класса в выражениях, использующих обычные операторы, такие как 
сложение (+) или вычитание (-). Вы можете объявить класс, подобный TAnyClass, 
а затем и несколько объектов этого класса с соответствующим образом 
переопределенными операторами:

    TAnyClass c1,  с2,  сЗ; 

    Вы можете использовать эти объекты в выражениях вида:	

    сЗ = с1 + с2; 

    Для лучшего понимания сути перегрузки операторов полезно провести ревизию 
того, что вам известно об операторах вообще. Конечно, обычный оператор знак 
плюс (+) суммирует два значения. Знак минус (-) осуществляет операцию 
вычитания. Эти и другие символы называются бинарными операторами, поскольку им 
необходимы два аргумента. Другие, например оператор отрицания (!), — унарные, 
им требуется только один аргумент. Еще один пример — унарный минус (-). 
Выражение -count меняет знак значения count. 
    Перегрузка операторов дает возможность добавлять к встроенным типам 
данных, используемых операторами С++, новые типы. Перегрузка операторов 
объявляется так же, как и обычная дружественная функция или функция-член 
класса. В следующем разделе объясняется, как писать и использовать 
перегруженные унарные и бинарные функции-члены операторов. 

    Перегрузка функций-операторов 

    Простой пример иллюстрирует перегрузку операторов для гипотетического 
класса с именем ZZ: 

    class ZZ { 
    public: 
       friend ZZ operator+(ZZ a,  ZZ b); 
       friend ZZ operator-(ZZ a,   ZZ b);
       friend ZZ operator*(ZZ a,   ZZ b);
       friend ZZ operator/(ZZ a,   ZZ b);
       // ... прочие открытые, защищенные и закрытые члены 
    };
 
    В классе ZZ объявлены четыре перегруженные функции-оператора. (На практике 
в ZZ могут объявляться и другие открытые, защищенные и закрытые члены.) Имена 
функций — operator+(), operator-O, operator*() и operator/(). Обычно вы не 
имеете права использовать символы типа +, -, * или / в идентификаторах, однако 
для перегрузки операторов в C++ имя функции может состоять из слова operator и 
одного из символов, приведенных в табл. 15.1. 

    Таблица 15.1. Список операторов, которые могут быть перегружены 

    /	+	-	%	~	&	| 
    1	,	=	<	>	<-	>= 
    •H-	«	»	==	1 =	44	II 
    /=	%=	"=	&=	1=	•»•=	-= 
    
    «=                »=	->	->*	[]	0	new	delete 

    Операторы +, -, * и & могут перегружаться как для бинарных, так и для 
унарных выражений. Операторы ., .*, :: и sizeof не могут перегружаться вообще. 
Кроме того, операторы =, (), [] и -> следует реализовать нестатическими 
функциями-членами. (Вы ознакомитесь со статическими функциями-членами далее в 
этой главе). 
    В гипотетическом классе ZZ объявляются функции для первых четырех 
операторов из таблицы. Каждая 1 функция имеет общий вид 

    friend ZZ operator-(ZZ a, ZZ b); 

    Функция объявляется дружественной классу, что дает функции operator+O 
доступ к закрытым и защищенным членам этого класса. Функция возвращает объекты 
типа ZZ (но может возвращать и любой другой тип), и этот результат можно 
присвоить другому объекту ZZ. (Присваивание одного объекта другому создает 
несколько "скользких" моментов. Эта тема будет обсуждаться позднее в этой 
главе.) Более важно то, что имя функции.operator+() идентифицирует функцию как 
метод, с помощью которого выражения, использующие оператор сложения, могут 
оперировать объектами класса. Предполагается, что функция operator+()
складывает два объекта способом, подходящим для класса ZZ. 


    372     Часть III. Программирование на ANSI C++ 
