C++四种类型转换

1. 强制类型转换(显示类型转换)  C语言风格

int k = 5 % 3.2        // 语法错误
int k = 5 % (int)3.2;  // 强制类型转换,C语言风格
int k = 5 % int(3.2);  // 强制类型转换,C语言风格

2. 隐式类型转换

系统自动转换。

int sum = 3 + 12.333;  // 15, 发生隐式类型转换

3. C++四种类型转换

3.1 static_cast

静态转换。类似于C风格的强制类型转换,编译时进行类型转换检查,需要自己保证正确。

3.1.1 适用情况:

(a)相关类型;如整型和浮点型。

double f = 100.34f;
int i = (int)f;                // C语言风格
int i2 = static_cast<int>(f);  // C++风格

(b)void*与其他类型指针转换。

void*转为其他类型时要注意,因为各类型的寻址范围、成员布局可能不同,在这种情况下互转可能出错。

int i = 10;
int* b = &i;
void* p = static_cast<void*>(b);   // int*转为void*
int* p2 = static_cast<int*>(p);    // void*转为int*

(c)派生类指针或引用转为基类指针或引用。

class Base {    // 基类
};

class Derive : public Base {     // 派生类
};

shared_ptr<Derive> d2 = make_shared<Derive>();  
Base* b2 = static_cast<Base*>(d2.get());  // 派生类指针转为基类指针

Derive d3;
Base& b3 = static_cast<Base&>(d3);  // 派生类引用转为基类引用 

3.1.2 不适用情况

(a)一般不能用于指针类型之间的转换;

shared_ptr<int> a = make_shared<int>(10);
double* b = static_cast<double*>(a.get());    // 错误!

shared_ptr<double> a1 = make_shared<double>(10);
int* b1 = static_cast<int*>(a1.get());        // 错误!

3.2 dynamic_cast

运行时类型转换检查。

3.2.1 适用情况

(a) 基类指针或引用转为派生类指针或引用,不能转对象。

待补充。


3.3 const_cast

去除指针引用的const属性。

const int i = 10;
int i2 = const_cast<int>(i);       // 错误

const int* p = &i;
int* pi = const_cast<int*>(p);     // 正确
*pi = 20;     // 未定义行为(打印结果和调试结果不一致,很诡异),禁止如此操作

const int& refi = i;
int& ri = const_cast<int&>(refi);  // 正确

3.4 reinterpret_cast

编译时进行类型转换检查。

可以进行无关类型的转换,随意转换。

比较危险,尽量避免使用。

3.4.1 适用情况

指针类型与数值型互转。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

伟大的马师兄

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

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

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

打赏作者

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

抵扣说明:

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

余额充值