    ЗАМЕЧАНИЕ 

    Компилятор не навязывает математических концепций перегруженным 
операторам. Для ясности вы могла бы определить операции, подобные сложению, в 
виде перегруженного оператора сложения; действия, подобные умножению  — в 
виде перегруженного оператора умножения и т.д. Если вы не стремитесь следовать 
традициям (например,  определяя знак плюс,  который умножает вместо сложения), 
 результаты будут обескураживающими. 

    Имя функции operator+() может сначала показаться обескураживающим. Помните, 
operator+() — всего лишь имя функции. Если вы назовете функцию именем 
feeblewitzO вместо operator+(), вы сможете употреблять операторы следующего вида: 

    feeblewitz(a, b); 

    Здесь а и Ь — объекты типа ZZ. Заменив feeblewitz на operatof+, вы сможете 
вызывать функцию перегрузки оператора следующим образом: 

    operator+(a, d);	// Аналогично feeblewitz(a, b) 

    Нет никакой разницы между этими двумя вызовами функции, отличаются только 
их имена. Конечно, как перегруженный оператор, функция operator+() также может 
вызываться в выражениях, в которых используется знак плюс. Например, следующий 
оператор эквивалентен предыдущему вызову функции: 

    а + Ь;	// Аналогично operator+(a,  b),1 

    Выражения а + b и operator+(a, b) выполняют одну и ту же работу и в 
точности генерируют один и тот же код. Есть только одна причина использовать 
ту или иную форму — ясность. Перегрузка операторов не привносит в C++ ничего 
такого, чего бы вы уже не знали. Это всего лишь позволит вам использовать 
объекты в выражениях, вместо того чтобы передавать их функции. 
    Работающий пример класса, в котором используются перегруженные операторы, 
поможет проиллюстрировать эти концепции. В листинге 15.4 содержится класс, 
способный запоминать целые значения в виде строк. С помощью перегруженных 
операторов программа может вычислять выражения, в которых складываются и 
вычитаются строки в виде эквивалентных им числовых значений. 

    Листинг 15.4.  STROPS.CPP (функции перегруженных операторов) 

    1:	#include <iostream.h> 
    2:	#include <stdlib.h> 
    3:	#include <string.h> 
    4: 
    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:	   friend long operator+(TStrOp a,  TStrOp b); 
    13:	   friend long operator-(TStrOp a,  TStrOp b); 
    14:	}; 
    15: 
    16:	main() 
    17:	{
    18:	TStrOp a = "1234"; 
    19:	TStrOp b = "4321";
    20: 
    21:	cout « "\nValue of a == " « a.GetValue(); 
    22:	cout « "\nValue of b == " « b.GetValue(); 
    23:	cout « "\na + b + 6 == " « (a + b + 6); 
    24:	cout « "\na - b + 10 == " « (a + b + 10) 
    25:	« "\n" ; 
    26:	return 0; 
    27:	} 
    28: 
    29:	TStrOp::TStrOp(const char *s) 
    30:	{ 
    31:	  strncpy(value, s, 11): 
    32:	  value[11] = 0; 
    33:	}
    34: 
    35:	long operator+(TStrOp a,  TStrOp b) 
    36:	{ 
    37:	  return (atol(a,value) + atol(b.value)); 


    Гпава 15. Передовые средства C++     373 
