C++数据类型转换

C++数据类型转换

1. static_cast

static_cast可以实现 C++中内置基本数据类型之间的相互转换

包括各种隐式转换。具体的说,就是用户各种基本数据类型之间的转换,比如把int换成char,float换成int等。
派生类(子类)和基类(父类)指针的转换。

int a = 10;
double b = static_cast<double>(a); // int 转 double

int intValue = 65; // ASCII值为65对应字符'A'
char charValue = static_cast<char>(intValue); //charValue输出是'A'
class Base {
public:
    virtual void show() {
        std::cout << "Base class" << std::endl;
    }
};

class Derived : public Base {
public:
    void show() override {
        std::cout << "Derived class" << std::endl;
    }
};

int main() {
    Derived derivedObj;
    Base* basePtr = static_cast<Base*>(&derivedObj); // 上行转换
    //取 derivedObj 的地址,这会返回一个指向 Derived 对象的指针。
    //static_cast 将 Derived 类的对象指针转换为 Base 类的指针。
	
	Base* basePtr = &derivedObj;
	//父类指针指向子类对象
	
	//上面是使用 static_cast 显式地将 Derived 类型的指针转换为 Base 类型的指针,后面是直接将 Derived 对象的地址赋给 Base 类型的指针。
	//上下两种都是安全的,实现效果也类似
	
    basePtr->show(); // 调用Derived类的方法
    return 0;
}

特性与要点:

  1. static_cast没有运行时类型检查,所以是有安全隐患的,这种转换的安全性需要开发者来维护。
  2. 在派生类指针转换到基类指针时,是没有任何问题的,在基类指针转换
    到派生类指针的时候,会有安全问题。
    注意:
    进行上行转换(把派生类的指针或引用转换成基类表示)是安全的
    进行下行转换(把基类指针或引用转换成派生类表示)时,由于没有动态类型检查,所以是不安全的
  3. static_cast不能转换掉原有类型的const、volatile、或者_unaligned属性。(前两种可以使用const_cast 来去除)

const、volatile和_unaligned是C++中的类型修饰符

volatile
用途:volatile用于声明一个变量的值可能在程序的执行过程中被意外改变,通常是由于外部因素,例如硬件中断、多个线程的并发访问等。

特点:

编译器不会对volatile变量进行优化,确保每次访问都是从内存中读取最新值,而不是使用缓存的值
适用于与硬件寄存器、信号量、或多线程程序中的共享数据等场景。

_unaligned
用途:_unaligned用于标记某些数据结构的字段可能不在适当的内存对齐边界上。
特点:
在某些平台上,数据必须按特定字节边界对齐,以提高访问效率。使用_unaligned可以使编译器允许在不对齐的地址上访问这些字段。
常用于网络协议、文件格式解析等场景,特别是当从外部源读取数据时。

2.const_cast

只能在同种类间转换,可以使一个本来不是const类型的数据转换成 const 类型的,或者把 const 属性去掉

用于去除const常量属性,使其可以修改 ,也就是说,原本定义为const的
变量在定义后就不能进行修改的,但是使用const_cast操作之后,可以通
过这个指针或变量进行修改; 另外还有volatile属性的转换。

const int x = 10;
int* p = const_cast<int*>(&x); // 去掉const
*p = 20; // 不建议这样做,未定义行为

3. dynamic_cast

用于动态类型转换。具体的说,就是在基类指针到派生类指针,或者派生类到基类指针的转换。

用于运行时检查该转换是否类型安全,但只在多态类型时合法,即该类至少具有一个虚拟方法。 dynamic_cast必须用在具有虚函数的继承体系中,否则编译器回直接报错。

  1. dynamic_cast能够提供运行时类型检查,只用于含有虚函数的类。
  2. 不能用于内置的基本数据类型的强制转换。
  3. dynamic_cast转换如果成功的话返回的是指向类的指针或引用,转换失败的话则会返回NULL。
  4. 在类的转换时,在类层次间进行上行转换时,dynamic_cast和
    static_cast的效果是一样的。在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。

4. reinterpret_cast

重新解释,此标识符的意思即为数据的二进制形式重新解释。
任何类型的指针之间都可以互相转换,都不会得到编译错误,慎用
几乎什么都可以转,用在任意的指针之间的转换,引用之间的转换,指针和足够大的int型之间的转换,整数到指针的转换等。但是不够安全。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值