整数除法的问题已经带来了困惑,如果运算符只能操作相同的数据类型,那么也会非常的不方便,比如:1+2.5,必须写成1.0+2.5!C提出了三种类型转换,C++在这基础上还提出了三种静态(编译时完成)类型转换和一种动态(运行时)类型转换。
三种类型转换
分别的自动(隐式)类型转换、赋值类型转换和强制(显式)类型转换。语法规则:
1、自动类型转换是针对运算对象类型不同由系统自动完成的,计算1+2.5,系统将int型的1隐式地自动转换成double 类型的1.0,与2.5具有相同类型后进行计算。转换的规则是低到高,少字节到多字节,也就是char -> int -> float -> double
2、赋值类型转换,主要针对赋值运算(包括复合赋值),转换的规则不再是低到高,而是按照赋值的变量的类型进行转换: int x=3.9; 将double类型的3.9赋值给int变量x,规则是去掉小数部分转换成int进行赋值,x=3; 要注意,这里没有四舍五入。
3、强制类型转换,C的语法为: (类型名) 表达式 将表达式的值强制转换成指定的类型,注意类型名加括号: (double)100 --》 100.0 (float) (3.2+1.3)---》4.5f ( float的4.5);C++可以把括号放到对应的表达式上:double (100) float(3.2+1.3) 当然C++依然可以使用C的方式。
要获取一个浮点数的整数和小数部分可以用类型转换来完成:
float x=123.456,y ; int z; z=x; (整数部分) y=x-z; (小数部分)当然也可以用强制类型转换
判断一个数是否为完全平方数(25 36 49等等是某整数的平方),也可以利用类型转换,方法是:先开方(数学库 sqrt),然后转整型再平方,判断是否相等 (int)sqrt(x) * (int)sqrt(x) == x
C++ 4种特有类型转换 (可以暂时跳过)
1、static_cast 类似于 C 语言中的类型转换,可以进行无条件类型转换。
int x=3; double y = static_cast <double> (x);
2、reinterpret_cast 应用于指针、引用等之间的转换,这种转换提供了很强的灵活性,但转换的安全性只能由程序员的细心来保证了。例如,程序员执意要把一个 int* 指针、函数指针或其他类型的指针转换成 string* 类型的指针也是可以的。
3、const_cast 仅用于进行去除 const 属性的转换,它也是四个强制类型转换运算符中唯一能够去除 const 属性的运算符。
const string s = "Inception";
string& p = const_cast <string&> (s); 引用去const
string* ps = const_cast <string*> (&s); 指针去const
4、dynamic_cast 是运行时的类型转换,专门用于对象指针之间的转换,将多态基类的指针或引用强制转换为派生类的指针或引用,而且能够检查转换的安全性。