关于c++的强制类型转换浅析

  

  

一说起强制类型转换大家都很熟悉,相信很多学习完c++的朋友还在使用C语言的强制类型的方式(类型)变量。

  

c++其实也具有自己的一套强制类型转换它们分明是:static_cast reinterpret_cast const_cast dynamic_cast四种类型。

  

那么肯定会有人好奇c++是不是闲,C语言的强制类型用的舒舒服服的,为什么要新推出来这几个& # 63;

  

新类型的强制转换可以提供更好的控制强制转换过程,允许控制各种不同种类的强制转换c + +中风格是static_cast c + +风格的强制转换其他的好处是,它们能更清晰的表明它们要干什么。程序员只要扫一眼这样的代码,就能立即知道一个强制转换的目

  

的。   

,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

  

static_cast用于非多态类型的转换(静态转换),任何标准转换都可以用它,但它不能用于两个不相关的类型进行转换。

  

何为不相关类型& # 63;比如int和double char短就是相关类型。和int *就是不相关类型。

  

我们来看一看static_cast的用法只例如,通过将一个运算对象强制转换成两类型就能使表达式执行浮点数除法:

        双斜率=static_cast (j)/我;      

当static_cast需要把一个较大的算术类型赋值给较小的类型时,static_cast非常有用。此时,强制类型转换告诉程序的读者和编译器:我们知道并且不在乎潜在的精度损失。一般来说,如果编译器发现一个的算术类型试图赋值给较小的类型,就会给出警告信息;但是当我们执行了显式的类型转换后,警告信息就会被关闭了。

  

,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

  

reinterpret_cast有着和C风格的强制转换同样的能力。它可以转化任何内置的数据类型为其他任何的数据类型,也可以转化任何指针类型为其他的类型。它甚至可以转化内置的数据类型为指针,无须考虑类型安全或者常量的情形。不到万不得已绝对用。

  

因为reinterpret_cast是一个蛮bug的操作,下面我来演示一下。

        typedef无效(* FUNC) ();   int DoSomething (int i)   {   cout<& lt;“DoSomething”& lt; & lt; endl;   返回0;   }   空白测试()   {//reinterpret_cast可以编译器以函数的定义方式去看待DoSomething函数//所以非常的BUG,下面转换函数指针的代码是不可移植的,所以不建议这样用//c++不保证所有的函数指针都被一样的使用,所以这样用有时会产生不确定的结果   函数f=reinterpret_cast DoSomething ();   f ();   }      

当你这样运行的时候,你会发现通过函数指针没有传参数调用这个有参数的函数居然可以调用,这就很尴尬了,所以我告诉你不到万不得已就不要使用reinterpret_cast

  

  

对于将常量对象转化为非常量对象的行为,我们一般称之为“去掉const性质“。一旦我们去掉了某个对象的常量性质,编译器就不再阻止我们对该对象进行写操作了。如果对象本身不是一个常量,使用强制类型转换获得写权限是合法的行为,然而如果对象是一个常量,再使用const_cast执行写操作就会产生未定义的后果。

  

<强>举个例子:

        # include   # include   # include      使用名称空间性病;      int main ()   {   const int=2;   int * p=const_cast      

我们有理由的认为在内存当中一个的值被修改为3,但是结果呢?我们来看一看

  

关于c++的强制类型转换浅析

  

这不科学啊? ?我们再打开监视窗口看一下一个的值。

  

关于c++的强制类型转换浅析

  

我们都知道监视窗口看到的都是从内存当中拿到的,但是为什么内存当中为3,打印出来就是2呢?我来解释一下。

  

c++编译器具有优化功能,当你定一个const的常量的时候,系统觉得它不会被改变了,于是做一个优化把该常量存到寄存器当中,下次访问的过程更快速一点。所以当显示窗口读取数据的时候,他会直接去寄存器当中读取数据。而不是去内存,所以导致我们明明该掉了一个的值,却打印不出来,但是如何解决这个问题呢? ?

关于c++的强制类型转换浅析