[C++] static_cast, const_cast, dynamic_cast, reinterpret_cast, C-style cast

翻译自 stackoverflow

static_cast

static_cast 是要执行 cast 时的首选,static_cast 所做的事情类似于类型之间的隐式转换,例如 int -> float, pointer -> void *, 它也可以显式或隐式地调用转换函数。许多情况下,显式声明 static_cast 并没有必要。但是必须注意 T(something) 等同于 (T) something, 并且应当避免这样的语法。T(something, something_else)则是安全的,承诺会调用构造函数。

static_cast 能用于继承关系中的 cast,没有必要朝基类向上cast,但是只要不是虚拟继承,则可以向下 cast。如果向下 cast 到一个不是该对象类型的类型,不作检查,行为未定义。

const_cast

const_cast 用于移除或增加变量的 const 属性,任何其他的 C++ cast 都无法移除 const (即使是 reinterpret_cast 也不例外)

翻译自 stackoverflow

const_cast 用来移除指针或引用的 const 属性,指向非 const 的变量,不能用于原本就是 const 的变量,否则将导致不确定的行为。

下面的写法是 ok 的,因为变量 i 原本就不是 const,所以可以改变。

// fine
int i = 0;
const int& ref = i;
const int* ptr = &i;

const_cast<int&>(ref) = 3;
*const_cast<int*>(ptr) = 3;

而下面的这段 code 不允许,因为 i 是一个 const,而现在却被赋了一个新的值。code 可以编译通过,行为却是不确定的(可能会正常工作,也可能 crash)

// error
const int i = 0;
const int& ref = i;
const int* ptr = &i;

const_cast<int&>(ref) = 3;
*const_cast<int*>(ptr) = 3;
dynamic_cast

dynamic_cast 几乎只用于处理多态,你可以将一个指针 cast 成任意多态类型,你可以向上cast, 向下cast,甚至向旁边cast,dynamic_cast 将找出所寻找的对象并返回,指针的情况下如果失败,返回nullptr, 如果是引用,则返回std::bad_cast.

reinterpret_cast
reinterpret_cast 是最危险的,要尽可能少用,它将一种类型直接转换为另一种类型。例如将指针存到int里去。reinterpret_cast 可以保证的一点是,如果将 cast 结果再重新 cast 回去,你可以得到几乎和原来一模一样的值(中间值比原始值小的情况例外)

  • 继承的体系结构中,用 dynamic_cast 转换指针/引用。
  • 一般类型转换,用 static_cast。
  • 比特模式的底层重解析,用 reinterpret_cast, 使用时要务必小心。
  • 用 const_cast 移除(cast away) const/volatile, 除非是遇到的 API 的 const 不正确,否则要避免使用 const_cast。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值