192 Часть II. Программирование на C++
String str ("Пример");
char *rep = str.GetString(); // Функция доступа класса String int len = strlen( rep);
Как видите, пришлось создать временную переменную нужного типа и использовать функцию доступа, чтобы воспользоваться существующей функцией. Без операций преобразования приходилось выполнять много ненужной работы, объем которой увеличивался в зависимости от сложности извлечения лежащего в основе составного типа.
Отложим реализацию таких функций до главы 16. Сейчас нас больше заботит, как отыскивать подобные функции в программах. Когда вы видите, что аргумент принадлежит не к тому типу, которому по логике вещей он должен принадлежать, то, по всей видимости, дело не обошлось без функции преобразования. Определите класс подозреваемого объекта. Ищите функцию-член, которая, скорее всего, очень коротка — она может состоять даже из одного оператора return. Первым словом объявления должно быть operator, за которым следует тип данных, передаваемых вызвавшей сомнение функции.
Предполагая, что у нашего воображаемого класса string имеется функция
преобразования, преобразующая из string в char*, оператор:
/
int len = strlenf str); // str — это объект класса String
на самом деле вызывает функцию преобразования. Раскрытие этого выражения, а это можно сделать явно, превращает его в:
int len = strlenf str.operator char*());
Значит, функция
operator char*()( return char_J30 inter; }
в нашем классе точно есть. В противном случае типы аргументов не совпали бы, и у нас была бы ошибка.
Далее...
В языке C++ все продумано и взаимосвязано. И хотя между некоторыми элементами не всегда можно найти четко прослеживаемую связь, надо осознавать, что такая связь все-таки существует.
Богатство описанных здесь возможностей языка позволяет разработчикам писать на C++ добротные, элегантные программы, которые впоследствии могут быть использованы и другими программистами. Конечно, для программирования на таком уровне требуется больше понимания, чем для работы на BASIC, да и потребитель редко интересуется внутренней элегантно-