C++:详解显示类型转换

C++ 与 C 强制类型转换的区别

  • C 可以在任意类型之间转换,不安全;C++ 相对比较安全。
  • C 难以查询定位。C++ 易于追踪,grep -rn "cast-name"

语法形式:

cast-name <type> (expression)

1 、static_cast

基础类型间的转换

  • 基本数据类型间的转换,不能用于无关类型的转换。
  • void 指针转换成目标类型的指针,任何类型的表达式转换成 void 类型。
double d = static_cast<int>(i);			    // ok, 用于基本数据类型间的转换
int *pInt = static_cast<int*>(pVoid); 		// ok,void 指针转换成目标类型的指针
float *pFloat = static_cast<float *>(pInt);  // error,不能用于无关类型转换,不同指针类型间转换

2、dyamic_cast

用于下行转换(基类 -> 派生类),运行时动态检查。

类继承中的类型转换

  • 上行转换:派生类 -> 基类,派生类指针或引用转换成基类指针或引用,安全。
  • 下行转换:基类 -> 派生类,基类指针或引用转换成派生类指针或引用,不安全,需要动态类型检查 dyamic_cast,这是因为基类指针和引用可能指向的并不是一个子类对象。
// 同时完成类型转换和条件检查两个任务
// 1、若 bp 指向的是派生类对象,将其转换为指向派生类对象的指针
if (Derived *dp = dynamic_cast<Derived*>(bp)) {
    // 使用 dp 指向派生类对象
}
// 2、若 bp 指向的是基类对象
else {
    // 使用 bp 指向的基类对象
}   

3、const_cast

移除类型的 const 或 volatile 属性。将常量对象转换成非常量对象。

const int number = 100;
int *pInt2 = const_cast<int *>(&number);  // ok,但是通过 pInt2 写值是未定义的行为 *pInt2 = 200

上述例子中提到的未定义的行为,const_cast 不是为了改变常量的值而设计的。话句话说,要修改值,一开始就应该定义为变量,何必多此一举定义为常量。const_cast 用于有函数重载的上下文中,例如:

const string &shorterString(const string &s1, const string &s2) {
    return s1.size() <= s2.size() ? s1 : s2;
}

若对两个非常量的 string 实参调用这个函数,但是返回结果仍然是 const string 的引用。因此我们需要重载该函数,当实参不是常量的时候,返回普通引用。

string &shorterString(string &s1, string &s2) {
    // 实参强制转换成对 const 的引用,调用 shorterString 函数的 const 版本
    auto &r = shorterString(const_cast<const string&>(s1), const_cast<const string&>(s2));
    // 将返回的 const string 引用转换为普通的 string &
    return const_cast<const string&>(r);
}

const_cast 用于函数重载,其他情况下使用则说明程序存在着某种设计缺陷。

4、reinterpret_cast

为运算对象的位模式提供较低层次上的重新解释。该运算符可以用来处理无关类型之间的转换,例如任意指针(引用)类型之间的转换。效果等同于 C 语言风格的强制类型转换。这样可能会导致未定义的行为,例如数字类型转换为指针类型。不同于 static_cast,使用 reinterpret_cast 没有安全检查,这一点要尤其小心。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值