C++中常用的类型除了隐式转换,还有显示转换,如:static_cast
, dynamic_cast
, const_cast
, reinterpret_cast
。
其中隐式转换如常见的double、int、bool、float 等类型之间的转换。显示转换的用法具体如下:
一、static_cast
:静态转换
-
使用条件:
(1) 用于不同类型之间的转换,相当于隐式转换
(2) 默认类型指针与空指针void*
之间的转换,如int*
,double*
与void*
指针之间,但是不能用于int*
与double*
等之间的转换
(3) 类指针或引用之间的转换,用于基类与派生类之间 -
使用案例
// 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) 动态转换只能用于: 类类型的指针或引用之间的转换,或与 void 指针之间的转换 -
使用案例:
/****************************************
* @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) 使用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
注意事项:
- 以上 val 为
int
类型,如果将其定义为const int
将会导致未定义的行为 - 只有
const_cast
才能对 const 类型的指针或引用进行转换的操作。
四、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);
标签:类型转换,转换,int,C++,几种,cast,基类,const,指针
From: https://www.cnblogs.com/Jeffxu/p/18374108