C++类型转换

隐式转换

 

显示转换

C++最新命名的强制类型转换形式如下:

cast-name <type> (expression);

 type:是转换的目标类型,如果type是引用类型,则结果是左值;

expression:是要转换的值; 

  cast-name: static_cast、reinterpret_cast、reinterpret_cast和 dynamic_cast;

 

旧式的强制类型转换:

type(expression)     函数形式的强制类型转换

(type)expression     c语言风格的强制类型转换

static_cast

任何具有明确定义的类型转换,不包含底层const(如const int* i=10;),都可以使用static_cast。

  例如:1、可以将j转换为double类型,进行计算。不要忘记()

  int j = 10;
  double slope = static_cast<double>(j) / 3;

          2、将一个较大的算术类型赋值给较小的类型;

          3、利用其找回存在于void*指针中的值:

    double d = 20;
    void* p = &d;
    double* dp = static_cast<double*>(p);
    std::cout << *dp << std::endl;

当把指针存放在void*中,使用static_cast将其强制转换会原来的类型时,应该确保指针的值保持不变。即确保转换后的所得类型就是指针所指类型。(原值为int 就需要转换为 int*,原值为double就需要转换为 double*)

 

const_cast

const_cast只能用来改变预算对象的底层const。

    double c = 3.14;
    const double* pc;
    pc = &c;
    *pc = 1.1;   //不合法
    double* p = const_cast<double*>(pc); 
    *p =3.1415;
    std::cout << *p << std::endl;

常量转换为非常量的行为,称为“去掉const性质(cast away the const)”。一旦去掉了某个对象的const性质,编译器就不在组织我们对该对象进行写操作了。如果对象本身不是一个常量,使用强制类型转换获得写权限是合法的行为。如果对象时常量,则会法生不确定行为。(不要这么干)

const_cast常常用于有函数重载的环境中。

 

reinterpret_cast

 

dynamic_cast

 

 

 

 

 

posted @ 2020-08-20 18:09  夏~  阅读(101)  评论(0)    收藏  举报