static_cast、dynamic_cast、 const_cast、reinpreter_cast-详解

首先回顾一下C++类型转换:

C++类型转换分为:隐式类型转换和显式类型转换

第1部分. 隐式类型转换-又称为“标准转换”

包括以下几种情况:

1) 算术转换(Arithmetic conversion) : 在混合类型的算术表达式中, 最宽的数据类型成为目标转换类型。

int ival = 3;
double dval = 3.14159;

ival + dval;//ival被提升为double类型

2)一种类型表达式赋值给另一种类型的对象:目标类型是被赋值对象的类型

​
int *pi = 0; // 0被转化为int *类型

ival = dval; // double->int

​

例外:void指针赋值给其他指定类型指针时,不存在标准转换,编译出错

3)将一个表达式作为实参传递给函数调用,此时形参和实参类型不一致:目标转换类型为形参的类型

extern double sqrt(double);

cout << "The square root of 2 is " << sqrt(2) << endl;
//2被提升为double类型:2.0

4)从一个函数返回一个表达式,表达式类型与返回类型不一致:目标转换类型为函数的返回类型

double difference(int ival1, int ival2)
{
    return ival1 - ival2;
    //返回值被提升为double类型
}

第2部分. 显式类型转换-被称为“强制类型转换”(cast)

C 风格: (type-id) C++风格: static_cast、dynamic_cast、reinterpret_cast、和const_cast..

经验分享 程序员 微信小程序 职场和发展