【C++】类型转换

C++中的显示类型转换有如下方式:

命名的强制类型转换

static_cast、dynamic_cast、const_cast和reinterpret_cast

旧式类型转换

type (expr)、(type) expr

 

static_cast

任何具有明确定义的类型转换,只要不含底层const,都可以使用static_cast。

对于较大算术类型转换为较小的算术类型,static_cast可以关闭警告信息。

static_cast对于编译器无法自动执行的类型转换也非常有用,例如可以找回存于void*指针中的值

使用

static_cast (expr)

double i;
int j = static_cast (i);

void* p = &i;
double *dp = static_cast p;

dynamic_cast

我们可以将基类的指针或引用安全地转换成派生类的指针或引用,并用派生类的指针或引用来调用非虚函数。

注意:如果是基类指针或引用调用的是虚函数无需转换就能在运行时调用派生类的虚函数(即动态绑定)。

     使用

dynamic_cast (e) //e为type*指针, 转换失败返回空指针;可以转换空指针,结果是目标类型空指针

dynamic_cast (e) //e为type&左值,转换失败抛出bad_cast异常

dynamic_cast (e) //e为type&&右值,转换失败抛出bad_cast异常

其中e的类型有如下3中选择

【C++】类型转换_第1张图片

const_cast

只能改变对象的底层const(所指对象是常量),用于去掉const性质,转为非常量。只能通过指针和引用来去掉,常量对象不能直接转为非常量。

     使用

const_cast (expr)

cosnt_cast (expr)

int main(void){
    const int a = 2;
    const int *p = &a;
    int *np = const_cast (p);
    *np = 5;
    cout << *np; //输出5
    return 0;
}

 

reinterpret_cast

reinterpret_cast为运算对象的位模式提供较低层次上的重新解释,即它会产生一个新的值,这个值会有与原始表达式有完全相同的比特位。使用reinterpret_cast非常危险,本质上依赖于机器。

type (expr) 

函数形式的类型转换,即通过转换构造函数进行。

(type) expr

C语言风格的强制类型转换。

 

你可能感兴趣的:(C++)