|
Программирование >> Инициализация объектов класса, структура
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 si( 3 ); SmallInt определен конвертер в int, операция сложения si + 3.14159 разрешается двумя шагами: 1. Выз1вается конвертер класса SmallInt, который возвращает целое число 3. 2. Целое число 3 расширяется до 3.0 и складывается с константой двойной точности 3.14159, что дает 6.14159. Такое поведение больше соответствует поведению операндов встроенных типов по сравнению с определенными ранее перегруженными операторами. Когда значение типа int складывается со значением типа double, то выполняется сложение двух чисел типа double (поскольку тип int расширяется до double) и результатом будет число того же типа. В этой программе иллюстрируется применение класса SmallInt: #include <iostream> #include SmallInt.h int main() { cout << Введите SmallInt, пожалуйста: ; while ( cin >> si1 ) { cout << Прочитано значение << si1 << \пОно ; SmallInt::operator int() вызывается дважды cout << ( ( si1 > 127 ) ? больше, чем : ( ( si1 < 127 ) ? меньше, чем : равно ) ) << 127\n ; cout << \Введите SmallInt, пожалуйста \ (ctrl-d для вода): ; cout До встречи\n ; Откомпилированная программа выдает следующие результаты: Введите SmallInt, пожалуйста: 127 Прочитано значение 127 Оно равно 127 Введите SmallInt, пожалуйста (ctrl-d для выхода): 126 Оно меньше, чем 127 Введите SmallInt, п Оно больше, чем 127 Введите SmallInt, пожалуйста (ctrl-d для *** Ошибка диапазона SmallInt: 256 *** Введите SmallInt, пожалуйста (ctrl-d для выхода): 128 выхода): 256 #include <iostream> class SmallInt { friend istreams operator>>( istream sis, SmallInt ss ); friend ostreams operator<<( ostream sis, const SmallInt ss ) { return os << s.value; } public: SmallInt( int i=0 ) : value( rangeCheck( i ) ){} int operator=( int i ) { return( value = rangeCheck( i ) ); } operator int() { return value; } private: int rangeCheck( int value; int ); В реализацию класса SmallInt добавили поддержку новой функциональности: istream& operator ( istream &is, SmallInt &si ) { int ix; is >> ix; si = ix; SmallInt::operator=(int) return is; int SmallInt::rangeCheck( int i ) /* если установлен хотя бы один бит, кроме первых восьми, * то значение ском веко; сообщить и сразу вти */ if ( i & ~0377 ) { << \n*** i << *** << endl; cerr << \n*** ибка диапазона SmallInt: << i << *** << endl; exit( -1 return i; Ниже приведены определения функций-членов, находящиеся вне тела класса: 15.9.1. Конвертеры Конвертер - это особый случай функции-члена класса, реализующий определенное пользователем преобразование объекта в некоторый другой тип. Конвертер объявляется в теле класса путем указания ключевого слова operator, за которым следует целевой тип преобразования. Имя, находящееся за ключевым словом, не обязательно должно быть именем одного из встроенных типов. В показанном ниже классе Token определено несколько конвертеров. В одном из них для задания имени типа используется typedef tName, а в другом - тип #include SmallInt.h typedef char *tName; class Token { public: Token( char *, int ); operator SmallInt() { return val; } operator tName() { return name; } operator int() { return val; } другие открытые члены private: SmallInt val; char *name; класса SmallInt. Обратите внимание, что определения конвертеров в типы SmallInt и int одинаковы. Конвертер Token::operator int() возвращает значение члена val. Поскольку val имеет тип SmallInt, то неявно применяется SmallInt::operator int() для преобразования val в тип int. Сам Token::operator int() неявно употребляется компилятором для преобразования объекта типа Token в значение типа int. Например,
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |