Стандартом С++ описываются 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 << "
Before: " << number; const_cast< CCTest * >(this)->number--; cout << "
After: " << number; } void main() { CCTest X; X.setNumber(8); X.printNumber();}
|
|