C++中四种温和的类型转换
首先要了解C++基本类型转化就要了解,什么情况下用到隐式转化,什么时候用到强转。
1.任何基本类型的变量之间都可以隐式转换。
不难理解
基本类型之间的转换都会遵循(等号两边类型不一样,编译器将其右边数据类型转换成和左边类型一致)的规则。
2.任何其他类型的指针到void*都可以隐式转换。
int m_iXd;
void * m_pWp = &m_iXd
3.void*到任何其他类型的指针都必须强转。
int *m_pHf = (int *)m_pWp;
int *m_pHf = static_cast
4.任何类型的非常指针到同类型的常指针都可以隐式转换。
const int* m_pXr = m_pHf;
5.任何类型的常指针到同类型的非常指针都必须强转。
m_pHf = (int *)m_pXr;
m_pHf = const_cast
6.除了void*外,其他类型的指针与指针之间的转换都必须强转。
double *m_pFq;
m_pFq = (double *)m_pHf ;
m_pFq = reinterpret_cast
##不同的场景下,用不同的转换。
static_cast<目标类型>(变量名)
第一个场景:
隐式类型转换的逆转换,能在单 一个方向隐式转换,他的反方向上就能用静态类型转换。
编译器在做转换时,首先会看想转方向的反方向可不可以隐式转换,静态转就会成功,否则就会失败。
例如1,2都可以用静态类型转换。
示例4(特殊)4实际上也是单一个方向上可以隐身转换,但是它满足了去常转换的条件,所以它使用去常转换。(术业有专攻)
第二个场景:
自定义转换,自定义转换规则,复合类型的转换编译器时不知道的所以用到静态转换。
动态类型转换
dynamic_cast<目标类型>(类型变量)
不做详细解释。
去常转换
const_cast<目标类型>(类型变量)
去除指针或者引用上的const属性。
只干一件事,常指针到非常指针的去常属性;
常引用到非常引用的去常属性。
普通类型之间的转换不能使用。
重解释转换(暴力)
reinterpret_cast<目标类型>(类型变量)
/ˌriːɪnˈtɜːprət/
任何类型的指针之间的转换或者引用之间的转换,
任意类型的指针和整数之间的转换。(态度强硬),
普通类型之间的转换不能使用。
关于C和C++中的类型转换(int*)p;和 int*§;虽然写法不一致,但是意思是一样的。



