С++ для начинающих



         

Определенные пользователем преобразования - часть 2


SmallInt si( 3 );

si + 3.14159

разрешается в два шага:

1.      Константа 3.14159 типа double преобразуется в целое число 3.

2.      Вызывается operator+(const SmallInt &,int), который возвращает значение 6.

Если мы хотим поддержать битовые и логические операции, а также операции сравнения и составные операторы присваивания, то сколько же необходимо перегрузить операторов? Сразу и не сосчитаешь. Значительно удобнее автоматически преобразовать объект класса SmallInt в объект типа int.

В языке C++ имеется механизм, позволяющий в любом классе задать набор преобразований, применимых к его объектам. Для SmallInt мы определим приведение объекта к типу int. Вот его реализация:

class SmallInt {

public:

   SmallInt( int ival ) : value( ival ) { }

   // конвертер

   // SmallInt ==> int

   operator int() { return value; }

   // перегруженные операторы не нужны

private:

   int value;

};

Оператор int() – это конвертер, реализующий определенное пользователем преобразование,  в данном случае приведение типа класса к заданному типу int. Определение конвертера описывает, что означает преобразование и какие действия компилятор должен выполнить для его применения. Для объекта SmallInt смысл преобразования в int заключается в том, чтобы вернуть число типа int, хранящееся в члене value.

Теперь объект класса SmallInt можно использовать всюду, где допустимо использование int. Если предположить, что перегруженных операторов больше нет и в SmallInt определен конвертер в int, операция сложения

SmallInt si( 3 );

si + 3.14159

разрешается двумя шагами:

1.      Вызывается конвертер класса SmallInt, который возвращает целое число 3.

2.      Целое число 3 расширяется до 3.0 и складывается с константой двойной точности 3.14159, что дает 6.14159.

Такое поведение больше соответствует поведению операндов встроенных типов по сравнению с определенными ранее перегруженными операторами. Когда значение типа int складывается со значением типа double, то выполняется сложение двух чисел типа double (поскольку тип int расширяется до double) и результатом будет число того же типа.




Содержание  Назад  Вперед