Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lek2.doc
Скачиваний:
22
Добавлен:
15.11.2018
Размер:
173.57 Кб
Скачать

Именованные (символические) константы

Часто в программах встречаются константы, которым имеет смысл дать имя. Такие константы называются символическими.

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

Примеры оопределения символических констант:

const int x = 5;

const double z = 1E-5;

const float PI = 3.141593;

const char Smb = ‘t’;

Символические константы можно задавать (но не рекомендуется) средствами препроцессора.

Например: #define BTBuenos tardes, amigos // Определение символической строковой константы

#define PI 3.141593 // Определение символической числовой константы

Другой способ задания символических целочисленных констант – использование типа enum.

Например, в результате такого объявления

еnum { OK, NO_OPEN, NO_CREATE, FALL = 5 };

мы получим константы с указанными в списке именами и со значениями 0, 1, 2 и 5 соответственно.

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

Операнды в выражениях можно смешивать. При этом выполняются неявные (по умолчанию) преобразования данных, а именно:

  • если один из операндов – вещественный, то другие преобразуются к вещественному типу;

  • если операнды имеют разный диапазон представления, то они преобразуются к большему диапазону;

  • если смешиваются типы char, short, unsigned char, unsigned short и enum ( в любых сочетаниях ) и если их значения могут быть представлены как int, то все они преобразуются в int; иначе – в unsigned int;

  • если операнды – целые и один из них имеет тип unsigned long, то остальные преобразуются к этому типу;

  • если один операнд имеет тип long int, а остальные – unsigned int и если long int может представить все значения unsigned int, то unsigned int преобразуется в long; иначе оба операнда преобразуются к типу unsigned long.

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

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

Преобразования данных можно выполнять и явно, используя так называемое функциональное преобразование.

Постфиксная операция приведения типа:

type (выражение)

cлужит для формирования значений типа type на основе выражения, помещенного в круглых скобках.

Префиксная операция преобразования типа:

(type) выражение

Примеры явного приведения типов:

i = i + (int)3.14; // вначале 3.14 преобразуется к типу int

i = i + int(3.14);

int count=1066, total=1337;

double ratio;

ratio = double(count) / total; // здесь целое count преобразуется к типу double

Пример неявного преобразования типов

Пусть определены переменные следующих типов:

char ch;

int i;

float f;

double d;

long double r;

Тогда при вычислении выражения (см. ниже) произойдут следующие автоматические преобразования типов:

r = ch * 2 + (i – 0.5) + (f + d) - 7

char int int double float double int

int int double double double double

int double double

Далее дорисовать самостоятельно!

double double

double

double double

double

double double

double

long double

Стандартом С++ описываются 4 специальных оператора, предназначенные для приведения типов (преобразования выражения из одного типа в другой): static_cast < тип > ( выражение ) Преобразует выражение к указанному типу, без каких-либо проверок во время выполнения программы. В MSDN рекомендуется использовать этот оператор для приведения числовых типов - например, из enum или int в float Пример:

Цитата

   char ch;    int i = 65;    float f = 2.5;    double dbl;    enum eSomeEnum{ONE=0, TWO, THREE, SIXTY_FIVE=65} e;    ch = static_cast< char>(i);         // int to char    dbl = static_cast< double>(f);      // float to double    e = static_cast< eSomeEnum>(e); // enum to int

dynamic_cast < тип > ( выражение ) Преобразует выражение (ссылку на объект класса или указатель) к указанному типу, с проверкой во время выполнения программы, является ли выражение ссылкой или указателем на объект класса, эквивалентного или производного от того, что указан в треугольных скобках. Для возможности использования этой функции, в проекте должна присутствовать поддержка RTTI (опция компилятора /GR ). В случае, если проверка показала, что выражение не является объектом класса тип или производного класса (а также в случае неоднозначных ситуаций вроде дублирования одного и того же базового класса двумя родительскими классами, или при использовании виртуальных базовых классов) - генерируется исключение RTTI (которое можно "поймать" и обработать). Пример:

class B { ... }; class C : public B { ... }; class D : public C { ... }; void f(D* pd) {    C* pc = dynamic_cast< C*>(pd);    B* pb = dynamic_cast< B*>(pd); }

reinterpret_cast < тип > ( выражение ) Позволяет преобразовать выражение, являющееся указателем любого типа, к указанному типу (являющемуся также указателем любого типа, либо числовым типом - int, long). Чаще всего используется для приведения указателя на один тип к указателю на другой тип без необходимости промежуточного преобразования к void*. Пример:

   int  *iptr;    char *chptr = reinterpret_cast< char *> (iptr);

В MSDN рекомендуется использовать этот оператор для построения хэш-функций по указателям на объект:

// expre_reinterpret_cast_Operator.cpp // compile with: /EHsc #include < iostream> unsigned short Hash( void *p ) // Returns a hash code based on an address {    unsigned int val = reinterpret_cast< unsigned int>( p );    return ( unsigned short )( val ^ (val >> 16)); } using namespace std; void main() {    int a[20];    for ( int i = 0; i < 20; i++ )       cout << Hash( a + i ) << endl; }

const_cast < тип > ( выражение ) Используется для удаления атрибутов "const", "volatile" и "__unaligned" из выражения. Например: Цитата

  const char *cptr;   char *ptr = const_cast < char*> (cptr);

Наиболее очевидной необходимость оператора const_cast является в теле функций, объявленных с модификатором const - в таких функциях "не разрешено" выполнять никаких операций над текущим объектом (this), модифицирующих его каким-либо образом. Для обхода этого ограничения, MSDN рекомендует использовать оператор const_cast: Цитата

// expre_const_cast_Operator.cpp, compile with: /EHsc #include < iostream> using namespace std; class CCTest { public:    void setNumber( int );    void printNumber() const; private:    int number; }; void CCTest::setNumber( int num ) { number = num; } void CCTest::printNumber() const {    cout << "\nBefore: " << number;    const_cast< CCTest * >( this )->number--;    cout << "\nAfter: " << number; } void main() {    CCTest X;    X.setNumber( 8 );    X.printNumber();}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]