C++四种cast的详细介绍

目录

一、static_cast

1、基本数据类型转换

2、指针和void指针的转换

 3、父类和子类之间的转换

二、dynamic_cast

三、const_cast

1、加上const

2、去掉const

(1)const修饰指针,指针指向一个类对象(常量指针)

(2)const修饰指针指向对象的数值(指针常量)

(3)const修饰指针指向对象的数值并且修饰指针(常量指针常量)

四、reinterpret_cast


在C++中,我们经常使用到类型的转换,像把一个int类型转换成char类型,一个int类型转换成double类型,这些转换属于隐式类型转换。而今天我们要来讲的是显式类型转换。C++提供了四种显式类型转换,分别是:static_cast、dynamic_cast、const_cast、reinterpret_cast

一、static_cast

static_cast的定义为:

static_cast<type_name>(expression)

type_name是转换的类型,expression是被转换的对象或者表达式。

static_cast一般用于隐式转换,当type_name和express至少有一方可以隐式转换时,则可以用static进行强制类型转换。可以用于常见的int、float、double等类型转换;转换成功返回true,否则返回false(相当于C语言中的强制类型转换)。

1、基本数据类型转换

double serven_double_1 = 1.2;
std::cout<<serven_double_1<<std::endl;

int serven_int_1 = static_cast<int>(serven_double_1);
std::cout<<serven_int_1<<std::endl;

double serven_double_2 = static_cast<double>(serven_int_1);
std::cout<<serven_double_2<<std::endl;

运行结果:基本类型的转换,可以看到double类型转换成int类型后丢失了精度,这一点跟reinterpret_cast不一样,reinterpret_cast是底层二进制的强制拷贝和语义转换,所以不会丢失精度,后面会讲到。

2、指针和void指针的转换

int* serven_int_2 = new int(2);
void * serven_void_1 = static_cast<void*>(serven_int_2);
int *serven_int_3 = static_cast<int*>(serven_void_1);
*serven_int_2 = 6;

std::cout<<*serven_int_2<<std::endl;
std::cout<<*serven_int_3<<std::endl;
std::cout<<serven_void_1<<std::endl;
std::cout<<serven_int_2<<std::endl;
std::cout<<serven_int_3<<std::endl;

 运行结果:void指针和其他类型的指针进行转化的时候,他们都是指向同一个地址。

 3、父类和子类之间的转换

class SERVEN_PARENT{
public:
    SERVEN_PARENT(){}
    void Function(){
        std::cout<<"PARENT"<&l
C++ 中,cast 是将一种数据类型转换为另一种数据类型的关键字或运算符。主要有四种类型的 cast,它们分别是: 1. **静态_cast (static_cast)**: 这是一种隐式类型转换,通常用于基本类型、指针以及派生类到基类之间的转换。它不会进行运行时类型检查,如果转换是安全的,就会直接执行。比如,`static_cast<int>(float f)` 将浮点数转换成整数。 2. **动态_cast (dynamic_cast)**: 主要用于运行时类型检查和向下转型,适用于虚函数和多态情况。如果转换的对象不是期望的类型,则会返回 null 指针。例如,`dynamic_cast<MyDerived*>(myObject)` 可能返回 `MyDerived*` 或者 `nullptr`。 3. **reinterpret_cast (reinterpret_cast)**: 这是一种强制类型转换,主要用于底层的数据布局操作,如地址的解析。它完全忽略类型信息,直接把一个对象当作另一个类型来对待。例如,`reinterpret_cast<void*>(somePointer)` 将指针转换为 void* 类型。 4. **const_cast (const_cast)**: 它用于去除或添加 const 关键字,以便改变常量对象的行为。例如,`const_cast<const MyClass*>(&obj)` 可以临时去掉 obj 的 const 属性,但这可能导致不可预期的结果,因此应当谨慎使用。 每种 cast 都有其特定的用途,并且在进行类型转换时应确保类型安全,避免潜在的错误。同时,对于可能引发运行时异常的操作,如从基类转换到子类,动态_cast 被推荐用于处理这种情况。
评论 37
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三贝勒文子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值