c++ cast

static_cast

static_cast(expression)

用于非多态类型的低风险转换,如基类和派生类之间的转换,基本数据类型之间的转换(包括任何隐式转换),用户自定义转换,把void指针转换成目标类型的指针等。不进行运行时类型检查,只在编译时检查。

具体如下

  • 用于类层次结构中基类和派生类之间指针或引用的转换。这种转换与dynamic_cast的区别是,static_cast不会进行运行时类型检查,所以如果转换是不安全的,那么编译器也不会给出任何警告或者错误。
class B {};
class D : public B {};
void f(B* pb, D* pd) {
   D* pd1 = static_cast<D*>(pb);   // Not safe
   B* pb1 = static_cast<B*>(pd);   // Safe
}
  • 用于基本数据类型之间的转换,如把int转换成char,把int转换成enum。这种转换与C语言中的强制类型转换类似。
void f() {
    char ch;
    int i = 65;
    float f = 2.5;
    double dbl;
    enum bits {one = 1, two = 2, four = 4};
    bits bit;

    ch = static_cast<char>(i);   // int to char
    dbl = static_cast<double>(f);   // float to double
    i = static_cast<BYTE>(ch);
    i = static_cast<int>(two);   // enum to int
    bit = static_cast<bits>(i);   // int to enum
}
  • 用于把空指针转换成目标类型的指针。
    不同类型指针之间,指针和其他基本数据类型之间都不能进行static_cast转换
void f()
{
    void *p = malloc(4);
    int *q = static_cast<int*>(p);
    char* qq = static_cast<char*>(q); // wrong
    int qp = static_cast<int>(q); // wrong
}

reinterpret_cast

允许将任何指针转换为任何其他指针类型。 也允许将任何整数类型转换为任何指针类型以及反向转换。

unsigned short Hash( void *p ) {
   unsigned int val = reinterpret_cast<unsigned int>( p );
   return ( unsigned short )( val ^ (val >> 16));
}
int main() {
   int a[20];
   for ( int i = 0; i < 20; i++ )
      cout << Hash( a + i ) << endl;
}

const_cast

从某个类删除 const、volatile 和 __unaligned 属性。
底层const:指针指向的值是const;顶层const:指针本身是const
从以下例子可以看出,利用const_static试图对底层const进行修改得到了未定义行为,实际上并没有修改其值;而对象本身不是const,对应指针有底层const,这样可以通过const_cast修改其值。

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 << endl;
    const_cast< CCTest * >( this )->number--;
    cout << "After: " << number << endl;
}
int main() {
    CCTest X;
    X.setNumber( 8 );
    X.printNumber();
    X.printNumber();
    
    const int p = 10; 
    int *q = const_cast<int*>(&p);
    *q = 20;
    cout << &p <<" " << q << " " << p << endl;

    const int *pp = new int(10);
    int *qq = const_cast<int*>(pp);
    *qq = 20;
    cout << *pp << endl;
}
posted @ 2024-01-30 13:25  trashwin  阅读(10)  评论(0编辑  收藏  举报