Читаем C++ для начинающих полностью

#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;

}

<p>15.9.1. Конвертеры</p>

Конвертер – это особый случай функции-члена класса, реализующий определенное пользователем преобразование объекта в некоторый другой тип. Конвертер объявляется в теле класса путем указания ключевого слова operator, за которым следует целевой тип преобразования.

Имя, находящееся за ключевым словом, не обязательно должно быть именем одного из встроенных типов. В показанном ниже классе Token определено несколько конвертеров. В одном из них для задания имени типа используется typedef tName, а в другом – тип класса SmallInt.

#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 и int одинаковы. Конвертер Token::operator int() возвращает значение члена val. Поскольку val имеет тип SmallInt, то неявно применяется SmallInt::operator int() для преобразования val в тип int. Сам Token::operator int() неявно употребляется компилятором для преобразования объекта типа Token в значение типа int. Например, этот конвертер используется для неявного приведения фактических аргументов t1 и t2 типа Token к типу int формального параметра функции print():

#include "Token.h"

void print( int i )

{

cout "print( int ) : " i endl;

}

Token t1( "integer constant", 127 );

Token t2( "friend", 255 );

int main()

{

print( t1 ); // t1.operator int()

print( t2 ); // t2.operator int()

return 0;

}

После компиляции и запуска программа выведет такие строки:

print( int ) : 127

print( int ) : 255

Общий вид конвертера следующий:

operator type();

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных