static_cast用于编译时类型转换,支持基本类型转换、继承体系指针转换、void*转换及自定义类型转换,语法为static_cast(表达式),不进行运行时检查,向下转换需谨慎,不可去除const属性。

static_cast 是 C++ 中最常用的类型转换操作符之一,它在编译时进行类型转换,适用于有明确定义的类型之间转换。与 C 风格的强制转换相比,static_cast 更安全、更清晰,能帮助编译器检查部分非法转换。
基本语法
使用 static_cast 的语法如下:static_cast(表达式)
常见用法场景
1. 基本数据类型之间的转换
用于数值类型之间的转换,如 int 转 double,float 转 int 等。- int 转 double:防止整数除法丢失精度
- double 转 int:截断小数部分(注意精度丢失)
示例:
立即学习“C++免费学习笔记(深入)”;
double result = static_cast(5) / 2; // 结果为 2.5,不是 2 int i = static_cast (3.14); // i 的值为 3
2. 指针类型的向上和向下转换(在继承体系中)
在类的继承关系中,static_cast 可以用于:- 子类指针转父类指针(向上转换)——安全
- 父类指针转子类指针(向下转换)——需确保对象实际类型匹配,否则不安全
示例:
立即学习“C++免费学习笔记(深入)”;
class Base {};
class Derived : public Base {};
Derived d;
Base b = &d; // 向上转换,天然支持
Derived dp = static_cast(b); // 向下转换,需显式转换
注意:如果 b 实际指向的是 Base 对象而非 Derived,这种转换会导致未定义行为。3. void* 与其他指针类型之间的转换
C++ 不允许直接将 void* 赋值给其他指针类型,必须使用 static_cast 显式转换。示例:
立即学习“C++免费学习笔记(深入)”;
int value = 42; void* ptr = &value; int* ip = static_cast(ptr); // 将 void* 转回 int*
4. 自定义类型转换
如果类定义了构造函数或类型转换运算符,static_cast 可触发这些转换。示例:
立即学习“C++免费学习笔记(深入)”;
class A {
public:
A(int x) { /* 构造 */ }
};
class B {
public:
operator int() const { return 100; }
};
A a = static_cast(42); // 调用 A(int)
B b;
int n = static_cast(b); // 调用 operator int()
注意事项
static_cast 不进行运行时类型检查,因此在向下转型时容易出错。对于多态类型,建议使用 dynamic_cast 来实现安全的向下转换。- 不能用于去除 const 属性(应使用 const_cast)
- 不能在无关指针类型间随意转换(如 int* 转 char* 不推荐)
- 转换失败不会抛异常,可能导致未定义行为
基本上就这些。合理使用 static_cast 能提升代码可读性和安全性,但要避免滥用,特别是在继承体系中做向下转换时要格外小心。











