392 _________ ________Часть III. Современное программирование на C++
принципы сокрытия данных и инкапсуляции. В последнем же примере доступ к целочисленной части класса INT разрешен только на чтение.
Определить функцию преобразования достаточно просто. Синтаксис ее выглядит несколько странно:
operator data_type () { return variable_of_data type; }
Похоже на оператор-функцию, но без типа возвращаемого значения. Имя операции преобразования является в действительности именем возвращаемого типа, поэтому его указывать излишне.
Операция преобразования применительно к классу INT выглядит так:
operator int () { return data; }
Теперь там, где требуется объект типа int, а имеет место тип INT, будет вызываться эта функция.
Напомним еще раз, что класс INT создан только в качестве примера. Ваша дело — развить его и использовать там, где это разумно. Для этого есть несколько путей. Один из них — просмотреть массу программ; другой — поэкспериментировать.
Рассмотрим класс STRING. Есть много хороших функций для работы со строками типа char* (строки в стиле С), но STRING — это не char*. Однако ничто не мешает классу STRING содержать члены типа char* для хранения строк. Было бы странно отправить на помойку все функции библиотеки string.h, вроде strcmp (сравнение строк), strlen (длина строки) и многие другие. За счет преобразования типов этого не произойдет. Можно просто определить
class STRING
{
public:
//' .....
operator const char* () ( return rep; } private:
char* rep;
);
чтобы обеспечить доступ к члену типа char* объекта STRING. Как и другие оператор-функции, функции преобразования обычно вызываются неявно.
Развернутое представление операций
Мы уже знаем, что оператор-функции обычно вызываются неявно. Пользовательские оператор-функции синтаксически используются совершенно так же, как операции для базовых типов данных. Если бы это было не так, то работать с ними было бы трудно, а программа была бы нечитаемой.