Язык программирования C++. Вводный курс



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


складывается со значением типа double, то выполняется сложение двух чисел типа double

(поскольку тип int

расширяется до double) и результатом будет число того же типа.

В этой программе иллюстрируется применение класса SmallInt:

#include <iostream>

#include "SmallInt.h"

int main() {

   cout << "Введите SmallInt, пожалуйста: ";

   while ( cin >> si1 ) {

      cout << "Прочитано значение "

           << si1 << "\nОно ";

      // 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, пожалуйста (ctrl-d для выхода): 128

Оно больше, чем 127

Введите SmallInt, пожалуйста (ctrl-d для выхода): 256

*** Ошибка диапазона SmallInt: 256 ***

В реализацию класса SmallInt добавили поддержку новой функциональности:

#include <iostream>

class SmallInt {

   friend istream&

      operator>>( istream &is, SmallInt &s );

   friend ostream&

      operator<<( ostream &is, const SmallInt &s )

      { 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 );

   int value;

};

Ниже приведены определения функций-членов, находящиеся вне тела класса:

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 ) {

      cerr << "\n*** Ошибка диапазона SmallInt: "

           << i << " ***" << endl;

      exit( -1 );

   }

   return i;

}




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