c++中的4种强制类型转换

c++中的4种强制类型转换

c语言的强制类型转换:

int k = 5 % (int)3.2;
//or
int k = 5 % int(3.2);//函数风格类型转换

c++的强制转换格式:

xxx_cast<type>(express);

static_cast

静态转换,编译时执行,与c中的强制类型转换差不多。

可以用于:

不可用于:

  • 指针类型的转换如int *double *

    double f = 100.0;
    double * pf = &f;
    int * i = static_cast(pf); //error
    float * fd = static_cast(pf); //error

dynamic_cast

运行时类型识别和检查 runtime

进行父类型转子类型。代价大,保证安全性

const_cast

去除指针或者引用的const属性。只能用于此

编译时进行

const int ai = 90;
int ai2 = cosnt_cast<int>(ai); //error ai不是指针或引用
const int * pai = &ai;
int * pai2 = const_cast<int *>(pai); //yes
*pai2 = 120; //未定义行为,实际上是const的

如果本来就是常量而强硬去掉并写入,是一种未定义行为。除非原来不是常量,后来被变为常量,这是我们可以用const_cast给他变回去并写入。

不能改变表达式类型,需要用static_cast改。

当用到它时,往往意味着设计上的缺陷。

reinterpret_cast

编译时执行。处理无关类型的转换,随便转。

用于:

  • 整型地址转换成指针,一种类型指针转换成另外一种类型的指针

  • 指针类型转换成整型

    int i = 10;
    int * pi = &i;
    int * p2 = reinterpret_cast(&i);
    char * pc = reinterpret_cast(pi);

非常危险的转换,安全性差

()

发表评论