staitc_cast,const_cast....

#include <iostream>
using namespace std;
int main()
{
    //1.const_cast
    //const int a = 10;
    //int* ptr = const_cast<int*>(&a);//将const属性去除
    //*ptr = 100;

    //2.static_cast
    //编译器隐式执行的操作都可以由static_cast显示完成,显示的强制类型转换会产生警告,当使用static_cast会关闭警告
    //static_cast就是基本的类型转换
    double dNum = 12.2356;
    void* ptr = &dNum;
    //double* dp = static_cast<double*>(ptr);//这个是c++标准的形式
    double* dp = (double*)ptr;//c语言的强制转换,效果和上一句一样

    //3.reinterpret_cast 我到底要看看这个是干啥的
    //根据二进制位进行重新解释,看这个没啥意义吧

    //4.dynamic_cast有时间再看一下
    getchar();
    return 0;
}

//一个区别static_cast和reinterpret_cast的例子
reinterpret_cast是为了映射到一个完全不同类型的意思,这个关键词在我们需要把类型映射回原有类型时用到它。我们映射到的类型仅仅是为了故弄玄虚和其他目的,这是所有映射中最危险的。(这句话是C++编程思想中的原话)
    static_cast和reinterpret_cast的区别主要在于多重继承,比如
class A {
public:
    int m_a;
};

class B {
public:
    int m_b;
};

class C : public A, public B {};
那么对于以下代码:
    C c;
printf("%p, %p, %p", &c, reinterpret_cast<B*>(&c), static_cast <B*>(&c));
前两个的输出值是相同的,最后一个则会在原基础上偏移4个字节,这是因为static_cast计算了父子类指针转换的偏移量,并将之转换到正确的地址(c里面有m_a,m_b,转换为B*指针后指到m_b处),而reinterpret_cast却不会做这一层转换。
    因此, 你需要谨慎使用 reinterpret_cast.

 

posted @ 2014-06-30 11:14  zzyoucan  阅读(357)  评论(0编辑  收藏  举报