写在move之前 关于类型转换

本文回顾了C++中的类型转换,包括隐式转换和显式转换。重点讲述了static_cast、const_cast、dynamic_cast和reinterpret_cast四种显式转换的关键字,强调了显式转换在避免潜在错误和明确代码意图方面的重要性。同时,文章通过实例解释了const指针和常量指针的区别以及const_cast的使用场景。
摘要由CSDN通过智能技术生成

回顾一下primer C++里面,有关转换的内容

首先是类型转换,类型转换里面就包含了隐式转换和显示转换

先回顾一下基本类型隐式转换的原则:

  • 尽可能避免损失精度

看一下primer的例子

int ival = 3.541 + 3

右边:double+int,int会转换为double(隐式转换一次)执行加法运算,这里体现了以上原则,在赋值的时候,double 赋给int(隐式转换第二次)

这主要是算术转换,里面还包含了一些其它内容,包括有符号和无符号做算术运算时候的转换,bool转换等,其它的还有一些指针的转换,常量与非常量之间的转换,隐式转换只支持非常量转换成常量,否则,呵呵,编译器会让你难受的

这里提一下相关内容auto和decltype,我自己认为这个跟类型转换有一定的关系,这两个关键字有不一样的作用,auto是推断表达式右边的返回类型和大小,并且赋给左边变量,主要用于一些表达式过长,难以辨别出最终结果时

而decltype则只推断表达式最终结果的变量类型

举一个简单的例子:

int i=1;
auto a=i;
decltype(i) x=5;

接下来就是显式类型转换

老式的显示转换格式是这样的:

type(expr);
(type)expr;

你是不是写过float f=5.3; int i=(int)f;这类代码,哈哈哈,我也是,现在我尽量避免这类代码了,因为一旦表达式变复杂,你要是出错了,可能就麻烦了,一个bug找一天真的很难

看看C++ 11支持显示转换的形式和关键字

cast-name<type>(expression);

cast_name即为关键字:static_cast、dynamic_cast、const_cast、reinterpret_cast

  • static_cast

执行数据类型的强制转换,在隐式转换中,如果存在精度损失,编译器会给出warning,但是static_cast强制转换则会避免这个warning,这样听起来好像没什么用,可能这个warning信息很关键呢

它的另一个用法是把void*类型指针转换成目标类型的指针,但是必须保证他们所指的类型相同,也就是在void*之前的类型和cast type相同

另外它在进行上行转换(把派生类的指针或引用转换为基类表示)是安全的,而下行转换是不安全的,这里提到的类类型指针的转换,一定是有一定联系的类,不相关的类不可以,但是编译器自带的基本类型似乎都可以,

需要注意的是带有一些const的关键字是不能转换的,好像还有一些其它关键字也不可以。

听起来这些功能都没什么大用,因为warning是有用的&#x

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值