Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Лафоре Р. -> "Объектно-ориентированное программирование в С++" -> 29

Объектно-ориентированное программирование в С++ - Лафоре Р.

Лафоре Р. Объектно-ориентированное программирование в С++ — М.: Питер, 2004. — 992 c.
Скачать (прямая ссылка): obektnoorentprogramm2004.djvu
Предыдущая << 1 .. 23 24 25 26 27 28 < 29 > 30 31 32 33 34 35 .. 341 >> Следующая


// mixed.cpp

// использование смешанных выражений !include <iostream> using namespace std:

int mainO {

int count - 7:

float avgWeight = 155.5F:

double totalWeight = count *avgWeight;

cout «"Вес равен " « totalWeigtit « endl:

return 0:

}

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

Не все языки поддерживают смешанные выражения, и некоторые из них фиксируют ошибки при попытке применить арифметические операции к данным разных типов. Такой подход предполагает, что подобные действия вызваны ошибкой программиста, и призван «сигнализировать» ему об этом. С и С++ предполагают, что смешивание типов данных произошло сознательно и является задумкой программиста, и поэтому не мешают ему реализовывать свои идеи. Подобный подход отчасти объясняет столь значительную популярность языков С и С++. Эти языки дают программисту большую свободу. Разумеется, подобная либеральность увеличивает вероятность допущения ошибок.

Неявные преобразования типов

Давайте рассмотрим действия компилятора, когда он встречает выражения со смешанными типами, подобные приведенным в программе MIXED. Каждый тип данных можно условно считать «ниже» или «выше» по отношению к другим типам. Иерархия типов данных приведена в табл. 2.4. 76

Глава 2. Ot новы программирования на С++

Таблица 2.4. Иерархия типов данных

Тип данных_Старшинство_

long double Высший

double

float

long

int

short

char Низший

Арифметические операции, подобные + и *, действуют следующим образом: если их операнды имеют различные типы, то операнд с более «низким» типом будет преобразован к более «высокому» типу. Так, в программе MIXED тип int переменной count был преобразован в float с помощью введения временной переменной, содержимое которой умножается на переменную avgWeight. Результат, имеющий тип float, затем преобразовывается к типу double, чтобы его можно было присвоить переменной totalWeight. Процесс преобразования типов показан на рис. 2.9.

totalWeight

double

1. Создана временная переменная; значение приведено к типу float

= count

ш

int /

temporary variable

avgWeight;

I I 15^-5 I float

7.5

*

float

temporary variable

totalWeight

1088.5

I 1088.5| I
ч- float

2. Умножение временной переменной; float'float

3. Результат сохраняется во временной переменной

double 4. Результат, приведенный к типу double,

сохраняется в totalWeight

Рис. 2.9. Преобразования типов

Подобные преобразования типов данных происходят неявно, и обычно нет необходимости задумываться над ними, поскольку С++ сам выполняет то, что мы хотим. Однако в ряде случаев компилятор не столь понятно проводит преобразования типов, и мы скоро в этом убедимся. Когда мы научимся работать с объектами, мы фактически будем оперировать собственными типами данных. Возможно, нам захочется применять переменные таких типов в смешанных выражениях, включающих в себя как стандартные, так и пользовательские типы Преобразования типов 77

данных. В этом случае нам самим придется создавать средства, выполняющие необходимые преобразования типов, поскольку компилятор не сможет преобразовывать пользовательские типы данных так, как он делал это со стандартными типами.

Явные преобразования типов

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

В С++ существует несколько различных операций приведения типов, однако здесь мы ограничимся рассмотрением лишь одной из них.

Явные приведения типов в С++ ведут себя весьма требовательно. Вот пример оператора, осуществляющего преобразование типа int к типу char: aCharVar - static_cast<char>(anIntVar);

Здесь переменная, тип которой мы хотим изменить, заключена в круглые скобки, а тип, к которому мы приводим переменную, — в угловые скобки. Приведение типа переменной anlntVar происходит перед присваиванием значения переменной aCharVar.

Вспомните, как в программе SIGNTEST мы получили неверный результат из-за слишком большого промежуточного значения переменной. Мы решили эту проблему путем использования типа unsigned int вместо int, поскольку в этом случае диапазон представления оказался достаточным для хранения вычисленного значения. А если бы и этого оказалось недостаточно? Тогда для решения проблемы можно использовать операцию приведения типов. Рассмотрим следующий пример.

// cast.срр

// работа со знаковыми и беззнаковыми переменными #include <iostream> using namespace std:

int mainO {

int intVar = 1500000000: // 1 500 000 000

intVar = (intVar * 10) / 10: // слишком большой результат

cout « "Значение intVar равно " « intVar « endl:

// неверный результат intVar = 1500000000: // приведение к типу double
Предыдущая << 1 .. 23 24 25 26 27 28 < 29 > 30 31 32 33 34 35 .. 341 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100