Глава 8. Раскрытие выражений_________________________________789
щую объект типа someType, то, скорее всего именно эта оператор-функция и работает. Если же используется операция преобразования, она должна присутствовать в описании класса SomeType вместе с ключевым словом operator.
Найти "эпицентр" важно потому, что именно в нем и придется проверять значения, дописывать отладочный код или помещать контрольные точки при разработке и тестировании. Если вы сами являетесь разработчиком программы, то для вас это не будет большой проблемой, поскольку вы знаете, где что лежит. В общем же случае, когда вы работаете с программой написанной кем-то другим, это будет гораздо сложнее. Хотя у вас может не быть. возможности исправить чужую программу, эти знания могут помочь вам найти ошибку и сообщить о ней.
Раскрываем оператор-функции
Операции могут быть, а часто и являются, перегруженными. Возможно, в вашей самой первой программе тоже встречались такие операции. Скорее всего, выражения, содержащие операции типа +, -, / и =, знакомы всем, включая и тех, кто не занимается программированием. Более того, не будет преувеличением сказать, что большой опыт написания выражений обязательно включает в себя и использование операций.
Хотите вы того или нет, но операции используются по следующим причинам: из-за простоты употребления и потому, что с ними все знакомы. Теперь операции применяются еще шире. C++ позволяет программистам определять операции для их использования с новыми типами данных. Обычно операциям находятся семантически близкие применения, но разнообразие новых типов ведет иногда к совершенно разным действиям внешне одинаковых операций.
Читая программы на C++, старайтесь мыслить о таких простых выражениях, как:
int а = b + с;
на двух уровнях: во-первых, как о выражении, а во-вторых, как о двух оператор-функциях, по одной для каждой операции. Это не вполне верно для операций над базовыми типами данных, но полностью соответствует истине для пользовательских типов, число которых во много раз превосходит число базовых. Для простоты рассмотрим тип int.
Во-первых, давайте запишем две функции для выполнения указанных выше
действий. Например:
I
int Assign( int val) ;
int Sum( int, int);
Первая функция Assign получает аргумент и просто возвращает его для присваивания. Вторая функция sum берет два аргумента и складывает их. Теперь