【类型转换】
C++有11种整型和3种浮点类型,当对不同的类型进行计算时,C++会自动执行类型的转换。
【自动类型转换】
执行情况:
· 将一种算数类型赋给另一种算数类型时
· 表达式中包含不同的类型时
· 将参数传递给函数时
· 强制类型转换
1、赋值时进行的转换
· 值将被转换成接受变量的类型。
此时将一个值赋给范围更大的类型通常不会出现什么问题,但是反过来就应该考虑截断(丢掉小数)和精度损失的问题。
· 将0赋给bool类型被转换为false,非零转换为true
2、表达式中的转换
规则如下:
· long double > double > float > long int >= int > short >= wchar_t > char > bool(小的向大的转)
· signed 向 unsigned转换
3、传递参数时的转换
· 传递参数时的类型转换通常由C++函数原型控制。
· 另外为保持与传统的C语言向兼容,在将参数传递给取消原型对参数控制的函数时,将float参数提升为double.
4、强制类型转换
· C语言形式 (typename) Val;
· C++形式 typename (Val);
新的格式的想法是,让强制类型转换就像是函数的调用。
· Stroustrup认为C语言的强制类型转换太过粗暴因此 C++还引用了4中强制类型转换操作符:
1)、dynamic_cast
· dynamic_cast只能将指向派生类对象的基类指针或引用转换为派生类的指针或引用,
若用于其他转换则指针为空,引用则抛出异常。此为向下类型转换。
· dynamic_cast转换符只能用于指针或者引用。dynamic_cast转换符只能用于含有虚函数的类。
dynamic_cast转换操作符在执行类型转换时首先将检查能否成功转换,如果能成功转换则转换之,
如果转换失败,如果是指针则反回一个0值,如果是转换的是引用,则抛出一个bad_cast异常,
所以在使用dynamic_cast转换之间应使用if语句对其转换成功与否进行测试,
比如pd=dynamic_cast<D*>(pb); if(pd){…}else{…},或者try{};catch(bad_cast){}
2)、static_cast
· 完成向上类型转换,即将指向派生类的指针或引用转换为指向同一层次中的一个基类的指针或引用。
· static_cast<typename> (Val)
3)、reinterdivt_cast
· reinterpret_cast操作符代替了大多数其它C风格类型转换的使用。
reinterpret_cast将指针转换为其它指针类型、将数字转换为指针或将指针转换为数字。
4)、const_cast
· 刚才所讨论的3种类型转换操作都没有涉及“常量属性”,即不能使用它们移去对象的常量属性。
为此,我们要使用const_cast操作符。
除了const和volatile关键字之外,它的类型参数必须和对象参数的类型相匹配。