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. Как и другие оператор-функции, функции преобразования обычно вызываются неявно.

Развернутое представление операций

Мы уже знаем, что оператор-функции обычно вызываются неявно. Пользовательские оператор-функции синтаксически используются совершенно так же, как операции для базовых типов данных. Если бы это было не так, то работать с ними было бы трудно, а программа была бы нечитаемой.