C++类型转换

C风格强制类型转换

C语言中强制类型转换的方式为

1
(type_name) expression

例如

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>

int main()
{
int sum = 17, count = 5;
double mean;

mean = (double) sum / count;
printf("Value of mean : %f\n", mean );

}

C风格的强制类型转换虽然方式简单,可以在任意类型之间转换,但这同时也导致了C风格强制类型转换极其不安全,需要严格的代码审查。

C++风格强制类型转换

因此C++在完全兼容C的基础上,引入了新的强制类型转换。

static_cast

用于基本数据类型之间的转换,例如

  • floatintintchar
  • 在有类型指针和void*之间转换使用,但不能使用static_cast有类型指针之间进行类型转换。
  • 子类对象指针转换成父类对象指针也可以使用static_cast。​

非多态类型转换一般都使用static_cast,而且最好把所有的隐式类型转换都用static_cast进行显式替换,但不能使用static_cast在有类型指针之间进行类型转换。

dynamic_cast

一般用于将父类的指针转换为子类的指针,此场景下父类必须要有虚函数,因为dynamic_cast是运行时检查,检查需要有运行时信息RTTI,而RTTI存储在虚函数表中

如果父类没有虚函数,或者转换的双方不是父子关系,dynamic_cast会返回nullptr

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
struct Base {​
virtual void Func() { cout << "Base Func \n"; }​
};​

struct Derive : public Base {​
void Func() override { cout << "Derive Func \n"; }​
};​

int main() {​
Derive d;​
d.Func();​
Base *b = dynamic_cast<Base *>(&d);​
b->Func();​
Derive *dd = dynamic_cast<Derive *>(b);​
dd->Func();​
return 0;​
}​

const_cast

一般用于常量指针与非常量指针之间的转换,只有const_cast才可以对常量进行操作,一般用它来去除常量性(也能够去除volatile),但去除常量性是危险操作,还是要谨慎使用。

1
2
3
4
5
6
7
int main() {​
int data = 10;​
const int *cpi = &data;​
int *pi = const_cast<int *>(cpi);​
const int *cpii = const_cast<const int *>(pi);​
return 0;​
}​

reinterpret_cast

类似C语言中的强制类型转换,基本上什么都可以转,有安全风险。如果其他的强制转换无法解决问题,再考虑reinterpret_cast


C++类型转换
https://guts.homes/2025/06/13/cpp-type-conversion/
作者
guts
发布于
2025年6月13日
许可协议