C++ - 类型转换 static_cast, dynamic_cast, reinterpret_cast, const_cast

来源:互联网 发布:linux编译4.13内核步骤 编辑:程序博客网 时间:2024/05/17 06:58

-- static_cast

用于类层次结构中基类和子类之间转换。(基类和子类之间的转换通常建议用dynamic_cast)
  进行上行转换(把子类的指针转换成基类)是安全的;
  进行下行转换(把基类的指针转换成子类)时,由于没有动态类型检查,所以是不安全的。
用于基本数据类型之间的转换,如把int转换成char,把int转换成enum。这种转换的安全性也要开发人员来保证。

 

-- dynamic_cast

用于类层次结构中基类和子类之间的转换
      进行上行转换(把子类的指针转换成基类)时, dynamic_cast和static_cast的效果是一样的;
      进行下行转换(把基类的指针转换成子类)时, dynamic_cast具有类型检查的功能,

      比static_cast更安全。但是要求类必须有虚函数表, 这是由于运行时类型检查需要运行时类型信息,而这个信息存储在类的虚函数表。

 

 

所以在进行类的:

上行转换时, static_cast和dynamic_cast是一样的, 都是安全的

下行转换时, static_cast是不安全的; dynamic_cast是安全的, 但是要求基类包含虚函数表。

相同父类的子类之间进行转换, static_cast和dynamic_cast都是不可以的

    static_cast:直接编译就报错

    dynamic_cast: 如果没有虚函数表, 就直接编译报错

                         : 如果有虚函数表, 编译不报错, 但是转换后的值是NULL

 

-- const_cast

常量指针被转化成非常量指针

 

class A
{
public:
    int i;
};

int main(int argc, char *argv[])
{
        A * a = new A();
        a->i = 10;
        const A * b = const_cast<A *>(a);
        //b->i = 10;    // compile error "The left operand cannot be assigned to."
        A * c = const_cast<A *>(b);
        c->i = 10;
}

 

 

-- reinterpret_cast

随你怎么解释, 举个例子

 

可以看到reinterpert_cast<>可以成功, 剩下的static_cast和dynamic_cast都不能成功。

 

但是reinterpert_cast非常危险, 举个例子如果父类不含虚函数, 而子类含有虚函数, 那么这两个类不能用reinterpert_cast进行转换

 

执行输出结果如下:

 

c1->a=1, c1->b=2
c2->a=1, c2->b=2, c2->c=3
c3->a=2
c4->a=137256

 

可以看出(c3,c4)上行和下行的转换都是失败的。

如果用C2 *c3 = (C2 *)(c1);转换, 上行下行都是成功的, 即能正确输出值1.

 

dd

原创粉丝点击