Программирование >>  Инициализация объектов класса, структура 

1 ... 244 245 246 [ 247 ] 248 249 250 ... 395


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. Например,



1 ... 244 245 246 [ 247 ] 248 249 250 ... 395

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика