MSDN dynamic_cast static_cast const_cast reinterpret_cast

来源:互联网 发布:淘宝怎么申请天天特价 编辑:程序博客网 时间:2024/06/03 16:59
  • dynamic_cast  用于多态类型的转换

  • static_cast 用于非多态类型的转换

  • const_cast 用于移除 const, volatile, and__unaligned 属性.

  • reinterpret_cast 用于指针和类型间的相互转换

    // dynamic_cast_1.cpp// compile with: /cclass B { };class C : public B { };class D : public C { };void f(D* pd) {   C* pc = dynamic_cast<C*>(pd);   // ok: C is a direct base class                                   // pc points to C subobject of pd    B* pb = dynamic_cast<B*>(pd);   // ok: B is an indirect base class                                   // pb points to B subobject of pd}
    // dynamic_cast_2.cpp// compile with: /c /GRclass A {virtual void f();};class B {virtual void f();};void f() {   A* pa = new A;   B* pb = new B;   void* pv = dynamic_cast<void*>(pa);   // pv now points to an object of type A   pv = dynamic_cast<void*>(pb);   // pv now points to an object of type B}
    // static_cast_Operator.cpp// compile with: /LDclass B {};class D : public B {};void f(B* pb, D* pd) {   D* pd2 = static_cast<D*>(pb);   // not safe, pb may                                   // point to just B   B* pb2 = static_cast<B*>(pd);   // safe conversion}
    // 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;}int main() {   CCTest X;   X.setNumber( 8 );   X.printNumber();}
    // expre_reinterpret_cast_Operator.cpp// compile with: /EHsc#include <iostream>// Returns a hash code based on an addressunsigned short Hash( void *p ) {   unsigned int val = reinterpret_cast<unsigned int>( p );   return ( unsigned short )( val ^ (val >> 16));}using namespace std;int main() {   int a[20];   for ( int i = 0; i < 20; i++ )      cout << Hash( a + i ) << endl;}