回顾一下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