Полезное для программистов:

Фриланс
Новости
Статьи
   
Рубрики:


static_cast, dynamic_cast, reinterpret_cast...

Поиск:
Стандартом С++ описываются 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();
}
Автор: mr.DUDA
Сайт: http://






Просмотров: 15480

 

 

Новые статьи:


Популярные:
  1. Как сделать цикличным проигрывание MIDI-файла?
  2. Создание AVI файла из рисунков
  3. Как устройство "отключить в данной конфигурации"?
  4. Kто в данный момент присоединен через Сеть?
  5. Как узнать количество доступной памяти?
  6. Как реализовать в RichEdit разноцветный текст?
  7. Как скрыть свое приложение от ProcessViewer
  8. Как программно нажать/скрыть/показ кнопку "Start"?
  9. Модуль работы с ресурсами в PE файлах
10. Функции вызова диалоговых окон выбора
11. Проверка граматики средствами Word'а из Delphi.
12. Модуль для упрощенного вызова сообщений
13. Функции для записи и чтение своих данных в, ЕХЕ- файле
14. Рекурсивный просмотр директорий
15. Network Traffic Monitor
16. Разные модули
17. Универсальная функция для обращения к любым экспортируем функциям DLL
18. Библиотека от VladS
19. Протектор для UPX'а
20. Еще об ICQ, сообщения по контакт листу?
21. Использование открытых интерфейсов
22. Теория и практика использования RTTI
23. Работа с TApplication
24. Примеры использования Drag and Drop для различных визуальных компонентов
25. Что такое порт? Правила для работы с портами
26. Симфония на клавиатуре
27. Загрузка DLL
28. Исправление автоинкремента
29. Взаимодействие с чужими окнами
30. Проверить дубляжи в столбце


 

 

 
 
На главную