    38: }
    39: 
    40:	long operator-(TStrOp a, TStrOp b) 
    41:	{ 
    42:	return (atol(a.value) - atol(b.value)); 
    43:	} 

    Запуск STROPS на выполнение приведет к следующим результатам: 

    Value of a == 1234 
    Value of b == 4321 
    a + b + 6 == 5561 
    a - b + 10 == -3077 

    Перед тем как ознакомиться с классом и его функциями перегрузки операторов 
в программе, рассмотрим функцию main(). В строках 18-19 объявляются два 
объекта типа TStrOp — а и b. Объекты инициализируются символьными строками и 
могут быть реализованы также следующим образом: 

    TStrOp a("1234"); TStrOp b("4321"); 

    Несмотря на то что со всей очевидностью эти объекты представляют собой 
строковые значения, выражения в строках 23 и 24 складывают и вычитают их 
непосредственным образом: 

    (а + b + 6) 
    (а - b + 10) 

    Обычно вы не можете использовать строки или объекты в подобных выражениях; 
перегрузка операторов расширяет знания C++ о том, объекты каких типов можно 
складывать и вычитать. 
    Две дружественные функции, объявленные в строках 12-13, перегружают 
операторы сложения и вычитания для пары объектов класса TStrOp. Объявления 
сходны с теми, что пояснялись ранее в гипотетическом классе ZZ. Конечно, в 
данном случае функция возвращает длинное целое. Обычно функции перегрузки 
операторов имеют тип класса (или ссылки на объект класса), объектами которого 
они оперируют, но это не обязательно. Функции перегрузки операторов, равно как 
и другие функции, могут возвращать любые типы данных. 
    Рассмотрим реализацию перегруженных операторов в строках 35-43. Поскольку 
функции объявлены дружественными и не членами класса, их реализация идентична 
реализации обычных функций в C++. Единственное отличие заключается в 
специальных именах функций — operator+ и operator-, что позволяет компилятору 
вычислять выражения, использующие операторы сложения и вычитания с объектами 
класса TStrOp. 
    Поскольку функции операторов — друзья, они имеют доступ к закрытым и 
защищенным членам объектов TStrOp. Этот факт позволяет функциям 
преобразовывать строки-значения в параметрах а и b в длинное целое. Это 
преобразование осуществляется путем обращения к стандартной функции atol 
(ASCII to long), прототип которой содержится в заголовочном файле STDLIB.H. 
Функции просто возвращают сумму или разницу преобразованных значений. 

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

    Перегруженные функции могут быть членами класса, как это демонстрируется в 
листинге 15.5. Эта программа похожа на STROPS.CPP (листинг 15.4), однако в ней 
иллюстрируется перегрузка операторов функциями-членами . 

    Листинг 15.5.  STROPS2.CPP (перегрузка операторов функциями-членами) 

    1:	#include <iostream.h> 
    2:	#include <stdlib.h> 
    3: 
    4:	#include <string.h>	
    5:	class TStrOp { 
    6:	private: 
    7:	   char value[12]; 
    8:	public: 
    9:	   TStrOp ()  { value[0] = 0;   } 
    10:	   TStrOp(const char *s); 
    11:	    long GetValue(void) { return atol(value);   } 
    12:	    long operator+(TStrOp b); 
    13:	    long operator-(TStrOp b); 
    14:	}; 
    15: 
    16:	main() 
    17:	{ 
    18:	  TStrOp a = "1234"; 
    19:	  TStrOp b = "4321"; 


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