Глава 8. Раскрытие выражений_________________________________191

То, что вы нашли, может оказаться и объявлением дружественной функции (см. главу 14 "Базовые концепции классов"), но все-таки вы это объявление нашли. Нахождение объявления — первый шаг к пониманию, так как дальше вы сможете отследить появление функции по всему тексту и понять, как она работает в программе.

Замечание

Здесь мы коснемся более сложного материала. Если вы не поймете его сейчас, то все станет яснее по мере работы с книгой и углубления знакомства с C++.

Как уже было сказано, порядок операции указывает на количество ее аргументов. Тем не менее нужного числа объектов можно достичь двумя способами. Хотя главы 14 и 16 детально все объясняют, запомните это правило сейчас: если оператор-функция определена как элемент класса (а не дружественная и не глобальная), то количество аргументов — переменных в скобках функции — будет на единицу меньше порядка операции. Если функция глобальна (или дружественная), то действительное число передаваемых аргументов будет совпадать с порядком операций. Это правило вытекает из того обстоятельства, что одним из операндов является сам объект класса.

Выявление операций преобразования

Проблемы с операциями преобразования заключаются в основном в том, что они до сих пор остаются несколько в тени и могут показаться чересчур сложными. Операции преобразования — это весьма мощное средство, которое порой работает даже там, где отказывают все другие инструменты.

Операция преобразования — это функция, возвращающая объект одного типа при получении объекта другого типа. Для использования таких функций может быть много причин. В качестве примера можно привести большие библиотеки С, существующие уже многие годы. Разработчики, создающие новые составные типы данных, могут захотеть воспользоваться уже существующими возможностями — кто упрекнет их в этом? Вопрос в том, как это сделать.

Во-первых, давайте рассмотрим нечто, называемое контекстуальным ожиданием (contextual expectation). Например:

String str ("Пример");

int len = strlen(str); ,

Функция strlen всем известна. В качестве аргумента она получает const char*, но ясно, что str — это объект типа String. Таким образом, в данном примере контекстуальное ожидание состоит в том, что для strlen ожидается const char*. Такие проблемы иногда решаются следующим образом: