C++中的类型转换

类型转换

概述: 将一个类型显式地转换为另一个类型的过程

C风格的强制转换:

1
2
double pi = 3.14;
int iPi = (int)pi;
  • 不安全性:可能会导致一些隐式转换被执行,转换失败没有明显的错误提示
  • 不推荐

static_cast(静态转换):

在编译时进行类型检查,比C风格强制转换更安全

1
2
double pi = 3.14;
ubt iPi = static_cast<int>(pi);

适用于:

  • 基础类型之间的转换
  • 对象之间的转换,前提是二者之间存在继承关系
1
2
3
4
5
6
class Base {};
class Derived : public Base {};

Base* base_ptr = new Derived();
// 基类指针转换为派生类指针
Derived* derivedPtr = static_cast<Derived*> base;

不能用于:

  • 指针/引用类型不相关,即不在继承体系中
  • 跨不同类型的复杂转换(如将void* 转换为非void* 类型)

dynamic_cast(动态转换):

用于安全的运行时类型识别(RTTI),尤其是在多态层次中

1
2
3
4
5
6
7
8
9
10
11
12
13
class Base {
virtual void foo() {}
};
class Derived : public Base {};

Base* basePtr = new Derived();
Derived* derivedPtr = dynamic_cast<Derived*>(basePtr);

if (derived_ptr) {
// 转换成功
} else {
// 转换失败
}

const_cast(常量转换):

用于添加或移除常量性。可以使用它来去掉对象的const或volatile限定符,或者将const 指针转换为非const指针,他不会改变对象本身

1
2
const int x = 10;
int* y = const_cast<int*>(&x); // 将const int* 转换为int*

reinterpret_cast(重解释转换):

是C++中的最强转换,直接将对象的内存表示解释为另一种类型。它通常用于指针之间的转换(包括将任意类型的指针转换为void*或其他类型的指针)

1
2
int x = 42;
char* p = reinterpret_cast<char*>(&x);
  • 无视类型的实际内容,跳过了类型的安全检查
  • 不安全性

C++中的类型转换
http://example.com/2024/12/26/C-中的类型转换/
作者
凌云行者
发布于
2024年12月26日
许可协议