190 ___ ________Часть II. Программирование на C++
допустим, что вы хотели бы делать то же самое более естественным образом. Решением может служить использование настоящего обозначения операции сложения:
int +(int, int); // выглядит жутковато
Чтобы путаницы стало меньше, поставьте перед знаком ключевое слово operator. В результате получаем:
int operator=(int);
// Мысль раскрывает, но синтаксически неаккуратно int operator+( Int, int);
Для целых чисел функциональность обозначений и так ясна, но мы волнуемся не о них. Обобщим эти функции, предположив, что они будут работать с любыми типами данных:
type operator^( type) ;
И:
type operator+( type, type};
Здесь неявно участвует одно правило. Так как аргументы обеих функций не модифицируются — например, никогда не меняются левый и правый операнды в операции сложения целых 5+3; или правый операнд в операции присваивания — то мы можем подчеркнуть это обстоятельство, добавив следующее:
type operator^( const type);
type operator+(const type, const type);
Совет
Такие выражения обычно для оптимизации включают в себя адрес операции. Передача этого адреса делает код эффективнее, но лишает вас возможности добавлять операцию получения адреса к аргументам и возвращаемым значениям.
Когда вам встречается выражение, в котором есть операции и операнды, помните, что если вы имеете дело не с базовыми типами данных и не с адресной арифметикой, то, вероятно, за всем этим стоит оператор-функция. Определить наличие этой функции достаточно просто. Во-первых, количество аргументов должно соответствовать порядку операции: один для одноместной операции и два для бинарной. Во-вторых, вспомните, что тип объекта указывает на класс, в котором содержится определение оператор-функции, и, в-третьих, в определении должны присутствовать ключевое слово operator с обозначением операции.