C++类型转换解析

dynamic_cast: 动态类型转换
static_cast: 静态类型转换
reinterpret_cast: 重新解释类型转换
const_cast: 常量类型转换

1. dynamic_cast运算符
用途:类层次之间的上行转换和下行转换
特点:可在运行期间进行类型安全检查
2. static_cast运算符
用途:强制类型转换
特点:没有运行时检查来保证转换的安全性
3. reinterpret_cast运算符
用途:强制类型转换,把一个指针转换成一个整数等
特点:仅仅是修改了类型,重新解释了给出对象的比特模型而没有进行二进制转换,即将数据以二进制存在形式的重新解释
4. const_cast运算符
用途:用来修改类型的const或volatile属性


//TODO: dynamic_cast与static_cast比较
    dynamic_cast<type-id>(expression)
    (1) type-id必须是类的指针、类的引用或者void*
    (2) 如果下行转换(downcast)是安全的,则转换成功;如果下行转换(downcast)不安全,则失败,返回空指针
    (3) 在类层次间上行转换(upcast)时,dynamic_cast和static_cast的效果是一致的;然而在下行转换(downcast)时,dynamic_cast具有类型检查功能,比static_cast更安全
    (4) dynamic_cast用在多态语境中,即继承中需要有虚函数,否则编译出错(err:source type is not polymorphic);而static_cast则不需要,static_cast是编译期检查
    (5) dynamic_cast运行时检查需要运行时类型信息,而这个信息存储在类的虚函数表中
    (6) dynamic_cast支持交叉编译;而static_cast编译会出错
    
    static_cast<type-id>(expression)
    (1) 类层次之间指针/引用的转换;进行上行转换(upcast-派生类指针/引用转换成基类表示)时是安全的,进行下行转换(downcast-基类指针/引用转换成派生类表示)时是不安全的
    (2) 用于基本数据类型之间的转换,如int转换成char、int转换成enum,但转换也是不安全的
    (3) 把空指针转换成目标类型的空指针
    (4) 把任何类型的表达式转换成void类型
    // static_cast不能转换掉expression的const、volatile、或者__unaligned属性
    (5) C++中的static_cast执行非多态的转换,用于代替C语言中的转换操作,即作为一种显式类型转换
    
    reinterpret_cast<type-id>(expression)
    (1) type-id必须是一个指针/引用/算术类型/函数指针/成员指针;可以把一个指针转换成一个整型,也可以把一个整数转换成一个指针
    (2) reinterpret_cast不能像const_cast那样去除const修饰符
    
    
    const_cast<type_id> (expression)
    (1) 常量指针被转化成非常量的指针,并且仍然指向原来的对象;
    (2) 常量引用被转换成非常量的引用,并且仍然指向原来的对象;
    (3) const_cast一般用于修改底指针。如const char *p形式。
    
    
    
//Sample:
class A {
public:
        int m_memberA;
        virtual void foo() {// virtual for dynamic_cast
                printf("foo\n");
        }
};

class B : public A {
public:
        int m_memberB;
};

class D : public A {
public:
};

void func(A* pa) {
        B* pb1 = static_cast<B*>(pa);
        B* pb2 = dynamic_cast<B*>(pa);
}


int main(int argc, char* argv[]) {
        B* pb = new B();
        func(pb);

        //D* pd0 = static_cast<D*>(pb); //compile error
        D* pd1 = dynamic_cast<D*>(pb);

        int i;
        float f = 16.1;
        i = static_cast<int>(f);

        return 0;
}


//TODO: const_cast
class B
{
public:
    B() { }
public:
    int m_iNum;
};
void foo()
{
    const B b1;
    //b1.m_iNum = 100; //compile error
    // 可以做如下转换,体现出转换为指针类型
    B *b2 = const_cast<B*>(&b1);
    // 或者左侧也可以用引用类型,如果对b2或b3的数据成员做改变,就是对b1的值在做改变
    B &b3 = const_cast<B&>(b1);
    b2->m_iNum = 200;    //fine
    b3.m_iNum = 300;    //fine
}
int main( int argc, char * argv[] )
{
    foo();
    return 0;
}


你可能感兴趣的:(C++类型转换解析)