C++中的强制类型转换

来源:互联网 发布:如何在淘宝网上卖东西 编辑:程序博客网 时间:2024/05/29 16:21
    C++创始人 Stroustrop认为 C语言的类型转换太过松散。所以在 C++中添加了4个类型转换操作符。使得转换过程更加的规范。增加了 四个关键字。依次为 :static_cast 、 dynamic_cast 、reinterpret_case 、const_cast

    static_cast

        

可以将值从一种数据类型转换到另一种数据类型

例:

 int i;

Char c = static_cast<char> (i);

 *当 static_cast<type> (value)typevalue所属类型可以隐式转换时(单向即可),本转换才是合法的。

其他的 3个,如果type放的不是 指针 或者引用的话,就会报错(VS)。


    dynamic_cast:


将基类类型的指针或者引用安全的转换为派生类类型的指针或者引用    vstype必须为动态的)

运行时类型识别:RTTI

  有虚函数的情况   :运行时

  没有虚函数的情况: 编译时,静态(VS中编译就不过)

指针:

  如果转换失败 则返回 0 即空指针

引用:

  如果转换失败 则抛出 bad_cast异常


    reinterpret_case


用于天生危险的类型转换。

例:

 structdat{short a; short b};

 long value = 0x05A224B118;

Dat *pd = reinterpret_case<dat *>(&value);

Cout<<pd->a<<endl;

通常这种转换是适用于实现的底层编程技术。比如上例,在不同的大小端的环境中 运行结果是不同的。

注:它不支持所有的类型转换 ,比如:

  1不允许删除count

  2.不能将函数指针和数据指针之间转换

    3.可以将指针类型转换成int但是不能转成更小的char或者浮点型。


   const_cast:

由于编程中可能无意间同时改变类型和常量特征,因此使用const_cast更安全。

可以修改指向一个值的指针,但修改const值的结果是不确定的(C++标准指出这种行为是不确定的)

   也就是修改 有可能成功,也有可能不成功。

 intia = 10;

Const int ca = 100;

Void change(const int * pt ) {

  int * pi = null;

  pi = const_cast<int *>(pt);

    *pi = 0;// const_cast

void main () {

Change(&ia);//0

Change(&ca);// 100}


//-------------------------------------------------------------
个人的理解,欢迎指正交流。如有转载,请注明出处。

原创粉丝点击