C++ 中几种类型转换

C++中常用的类型除了隐式转换,还有显示转换,如:static_cast, dynamic_cast, const_cast, reinterpret_cast
其中隐式转换如常见的double、int、bool、float 等类型之间的转换。显示转换的用法具体如下:

一、static_cast静态转换

  1. 使用条件:
    (1) 用于不同类型之间的转换,相当于隐式转换
    (2) 默认类型指针与空指针void*之间的转换,如int*, double*void*指针之间,但是不能用于 int*double*等之间的转换
    (3) 类指针或引用之间的转换,用于基类与派生类之间

  2. 使用案例

// 1、相当于隐式转换
double val = 126.33;
int res = static_cast<int>(val);

// 2、默认数据类型指针之间的转换
void* p1 = new int(10);
int* p2 = static_cast<int*>(p1); // 将void*指针和int* 指针之间进行转换

double* p3 = new double(88.66);
int* p4 = static_cast<int*>(p3); // 错误:无法在 int* 与 double* 类型之间进行转换,只能在默认类型指针与void*指针之间进行转换

// 3、不同类之间的转换(Base为基类,Derived为派生类),指针类型和引用类型都可以
Base* bs01 = new Base();
Derived* dr01 = new Derived();

// 将基类转换成派生类:向下转换
Derived* dr02 = static_cast<Derived*>(bs01);
// 将派生类转换成基类:向上转换
Base* bs02 = static_cast<Base*>(dr01);

二、dynamic_cast动态转换

  1. 使用场景:
    (1) 动态转换只能用于: 类类型的指针或引用之间的转换,或与 void 指针之间的转换

  2. 使用案例:

/****************************************
* @brief  Base 为基类, Derived为派生类
****************************************/

Base* bs01 = new Base();
Derived* dr01 = new Derived();

// 将派生类指针转换成基类指针:向上转换是安全的
Base* bs02 = dynamic_cast<Base*>(dr01);

// 将基类转换成派生类:向下转换,将会得到 dr02 = nullptr
Derived* dr02 = dynamic_cast<Derived*>(bs01);

Base* bs01 = new Base();
Derived* dr01 = new Derived();

// 将派生类指针转换成基类指针:向上转换是安全的,bs02不为 NULL
Base* bs02 = dynamic_cast<Base*>(dr01);

// 将基类转换成派生类:向下转换,将会得到 dr02 = NULL
Derived* dr02 = dynamic_cast<Derived*>(bs01);

// 将其转换为 void* 指针,此时ptr不为NULL
void* ptr = dynamic_cast<void*>(bs01);
  1. 注意事项:
    (1) 使用 dynamic_cast 进行转换时、基类必须要有虚函数,否则进行向下转换(基类 --> 派生类)将会报错。
    (2) dynamic_cast 动态转换是在运行时进行检查转换是否成功,如果转换失败,则对应的指针将为 NULL
    (3) dynamic_cast 进行向下转换将会失败,结果为 NULL
    (4) dynamic_cast 进行向上转换(派生类 --> 基类)是安全的,其效果与 static_cast 相同

三、const_cast

主要用于删除 const、volatile属性,用于 const 指针或引用非const 指针或引用之间的转换
使用案例如下:

int val = 100;
const int* ptr = &val;
const int& num = val;

// 将常量指针或引用转化非常量指针或引用
int* res1 = const_cast<int*>(ptr);
int& res2 = const_cast<int&>(num);

*res1 = 666; // val的值将被修改为 666
res2 = 888;  // val的值将被修改为 888

注意事项:


四、reinterpret_cast

reinterpret_cast 可以将任何指针转换为任何其他指针类型,也允许将整数类型转换为任何指针类型以及反向转换。一般是从底层对数据进行重新解释,不同的编译器有不同的实现,其移植性相对较差,使用需要相对谨慎。

使用案例:

// 将bool类型的指针转换成double类型的指针
bool bg = false;
double* p1 = reinterpret_cast<double*>(&bg);

// 将int类型转换成任何类型的指针(在此为double*)
int val = 66;
double* p2 = reinterpret_cast<double*>(val);
posted @ 2024-08-22 16:12  Jeffxue  阅读(3)  评论(0编辑  收藏  举报